Использование wp_trim_excerpt для получения the_excerpt () вне цикла
-
-
Вы можете попробовать вызвать фильтры фрагментов ... `$myvar=apply_filters ('the_excerpt',$myvar);`You could try calling the excerpt filters... `$myvar = apply_filters( 'the_excerpt', $myvar );`
- 0
- 2011-01-15
- t31os
-
7 ответ
- голосов
-
- 2012-03-22
Начиная с WP 3.3.0,
wp_trim_words()
полезен,если вы можете получить контент,для которого хотите создать отрывок.Надеюсь,что это поможет кому-то,и это избавит от необходимости создавать собственную функцию подсчета слов.Since WP 3.3.0,
wp_trim_words()
is helpful if you're able to get the content that you want to generate an excerpt for. Hope that's helpful to someone and it saves creating your own word counting function. -
- 2011-01-14
wp_trim_excerpt()
имеет небольшую любопытную механику - если ему что-то передается,он ничего не делает.Вот основная логика:
-
get_the_excerpt()
проверяет выдержку вручную; -
wp_trim_excerpt()
вмешивается,если нет отрывка вручную,и делает его из контента или тизера.
Оба жестко привязаны к глобальным переменным,поэтому Loop.
Вне цикла лучше взять код из
wp_trim_excerpt()
и написать свою собственную функцию обрезки.wp_trim_excerpt()
has a little curious mechanics - if anything is passed to it then it does nothing.Here is basic logic behind it:
get_the_excerpt()
checks for manual excerpt;wp_trim_excerpt()
chimes in if there is no manual excerpt and makes one from content or teaser.
Both are tightly tied to global variables and so Loop.
Outside the Loop you are better of taking code out of
wp_trim_excerpt()
and writing your own trim function. -
- 2011-01-21
Обновление:
Вот производная от wp_trim_excerpt (),которую я использовал.Прекрасно работает.На основе Wordpress версии 3.0.4
function my_excerpt($text, $excerpt) { if ($excerpt) return $excerpt; $text = strip_shortcodes( $text ); $text = apply_filters('the_content', $text); $text = str_replace(']]>', ']]>', $text); $text = strip_tags($text); $excerpt_length = apply_filters('excerpt_length', 55); $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]'); $words = preg_split("/[\n\r\t ]+/", $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY); if ( count($words) > $excerpt_length ) { array_pop($words); $text = implode(' ', $words); $text = $text . $excerpt_more; } else { $text = implode(' ', $words); } return apply_filters('wp_trim_excerpt', $text, $raw_excerpt); }
Update:
Here is a derivative of wp_trim_excerpt() which I used. Works perfectly. Derived from Wordpress version 3.0.4
function my_excerpt($text, $excerpt) { if ($excerpt) return $excerpt; $text = strip_shortcodes( $text ); $text = apply_filters('the_content', $text); $text = str_replace(']]>', ']]>', $text); $text = strip_tags($text); $excerpt_length = apply_filters('excerpt_length', 55); $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]'); $words = preg_split("/[\n\r\t ]+/", $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY); if ( count($words) > $excerpt_length ) { array_pop($words); $text = implode(' ', $words); $text = $text . $excerpt_more; } else { $text = implode(' ', $words); } return apply_filters('wp_trim_excerpt', $text, $raw_excerpt); }
-
Вам не нужно публиковать новый ответ,вы всегда можете отредактировать свой старый,чтобы включить новую информацию.Вы можете,например,скопировать ссылку на код WP из своего первого ответа в этот,а затем удалить свой первый ответ.You don't have to post a new answer, you can always edit your old one to include new information. You could, for example, copy the link to the WP code from your first answer into this one and then delete your first answer.
- 0
- 2011-01-25
- Jan Fabry
-
Для копирования/вставки: добавьте $ raw_excerpt=$text;For copy/pasters out there: add $raw_excerpt = $text;
- 0
- 2015-04-11
- Svetoslav Marinov
-
- 2011-08-26
Вот мой вариант "trim_excerpt",который принимает объект сообщения или идентификатор сообщения в качестве параметра.
Очевидно,исходя из того,что находится в ядре. Не знаю,почему у этого (иget_the_author ()) нет эквивалентов без цикла.
/** * Generates an excerpt from the content, if needed. * * @param int|object $post_or_id can be the post ID, or the actual $post object itself * @param string $excerpt_more the text that is applied to the end of the excerpt if we algorithically snip it * @return string the snipped excerpt or the manual excerpt if it exists */ function zg_trim_excerpt($post_or_id, $excerpt_more = ' [...]') { if ( is_object( $post_or_id ) ) $postObj = $post_or_id; else $postObj = get_post($post_or_id); $raw_excerpt = $text = $postObj->post_excerpt; if ( '' == $text ) { $text = $postObj->post_content; $text = strip_shortcodes( $text ); $text = apply_filters('the_content', $text); $text = str_replace(']]>', ']]>', $text); $text = strip_tags($text); $excerpt_length = apply_filters('excerpt_length', 55); // don't automatically assume we will be using the global "read more" link provided by the theme // $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]'); $words = preg_split("/[\n\r\t ]+/", $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY); if ( count($words) > $excerpt_length ) { array_pop($words); $text = implode(' ', $words); $text = $text . $excerpt_more; } else { $text = implode(' ', $words); } } return apply_filters('wp_trim_excerpt', $text, $raw_excerpt); }
Here's my take on a "trim_excerpt" that takes the post object or a post ID as a parameter.
Obviously based on what's in core. Don't know why this (and get_the_author()) don't have non-loop equivalents.
/** * Generates an excerpt from the content, if needed. * * @param int|object $post_or_id can be the post ID, or the actual $post object itself * @param string $excerpt_more the text that is applied to the end of the excerpt if we algorithically snip it * @return string the snipped excerpt or the manual excerpt if it exists */ function zg_trim_excerpt($post_or_id, $excerpt_more = ' [...]') { if ( is_object( $post_or_id ) ) $postObj = $post_or_id; else $postObj = get_post($post_or_id); $raw_excerpt = $text = $postObj->post_excerpt; if ( '' == $text ) { $text = $postObj->post_content; $text = strip_shortcodes( $text ); $text = apply_filters('the_content', $text); $text = str_replace(']]>', ']]>', $text); $text = strip_tags($text); $excerpt_length = apply_filters('excerpt_length', 55); // don't automatically assume we will be using the global "read more" link provided by the theme // $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]'); $words = preg_split("/[\n\r\t ]+/", $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY); if ( count($words) > $excerpt_length ) { array_pop($words); $text = implode(' ', $words); $text = $text . $excerpt_more; } else { $text = implode(' ', $words); } } return apply_filters('wp_trim_excerpt', $text, $raw_excerpt); }
-
- 2011-01-21
+1 к Расту. Очень странно,что не существует такой вещи,какget_the_excerpt ($post-> ID),хотя должно быть совершенно очевидно,что это должно быть. В любом случае,вот wp_trim_excerpt () в wordpress версии 3.0.4:
http://core.trac. wordpress.org/browser/tags/3.0.4/wp-includes/formatting.php
function wp_trim_excerpt($text) { 1824 $raw_excerpt = $text; 1825 if ( '' == $text ) { 1826 $text = get_the_content(''); 1827 1828 $text = strip_shortcodes( $text ); 1829 1830 $text = apply_filters('the_content', $text); 1831 $text = str_replace(']]>', ']]>', $text); 1832 $text = strip_tags($text); 1833 $excerpt_length = apply_filters('excerpt_length', 55); 1834 $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]'); 1835 $words = preg_split("/[\n\r\t ]+/", $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY); 1836 if ( count($words) > $excerpt_length ) { 1837 array_pop($words); 1838 $text = implode(' ', $words); 1839 $text = $text . $excerpt_more; 1840 } else { 1841 $text = implode(' ', $words); 1842 } 1843 } 1844 return apply_filters('wp_trim_excerpt', $text, $raw_excerpt); 1845 }
В строке 1826 видно,что он связан с глобальной переменной $post черезget_the_contents. И да,я понятия не имею,о чем они думали. Но теперь заменитеget_the_content на $text в своем собственномmy_excerpt,и он должен вести себя аналогичным образом.
+1 to Rast. It is very weird that there is no such thing as get_the_excerpt($post->ID), when it should be quite obvious that it should. Anyway, here is wp_trim_excerpt() in wordpress version 3.0.4:
http://core.trac.wordpress.org/browser/tags/3.0.4/wp-includes/formatting.php
function wp_trim_excerpt($text) { 1824 $raw_excerpt = $text; 1825 if ( '' == $text ) { 1826 $text = get_the_content(''); 1827 1828 $text = strip_shortcodes( $text ); 1829 1830 $text = apply_filters('the_content', $text); 1831 $text = str_replace(']]>', ']]>', $text); 1832 $text = strip_tags($text); 1833 $excerpt_length = apply_filters('excerpt_length', 55); 1834 $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]'); 1835 $words = preg_split("/[\n\r\t ]+/", $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY); 1836 if ( count($words) > $excerpt_length ) { 1837 array_pop($words); 1838 $text = implode(' ', $words); 1839 $text = $text . $excerpt_more; 1840 } else { 1841 $text = implode(' ', $words); 1842 } 1843 } 1844 return apply_filters('wp_trim_excerpt', $text, $raw_excerpt); 1845 }
You can see on line 1826 that it is linked to the $post global variable via get_the_contents. And yes, I have no idea what were they thinking. But from here, replace the get_the_content with $text in your own my_excerpt, and it should behave in a similar fashion.
-
- 2011-04-17
Функцияget_the_content () вернет полный контент,если $more!=0. Вы должны установить глобальную переменную $more в 0,чтобы функцияget_the_content () возвращала отрывок.
Измененная функция wp_trim_excerpt ():
function wp_trim_excerpt($text) { $raw_excerpt = $text; if ( '' == $text ) { global $more; $tmp = $more; $more = 0; $text = get_the_content(''); $more = $tmp; $text = strip_shortcodes( $text ); $text = apply_filters('the_content', $text); $text = str_replace(']]>', ']]>', $text); $text = strip_tags($text); $excerpt_length = apply_filters('excerpt_length', 55); $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]'); $words = preg_split("/[\n\r\t ]+/", $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY); if ( count($words) > $excerpt_length ) { array_pop($words); $text = implode(' ', $words); $text = $text . $excerpt_more; } else { $text = implode(' ', $words); } } return apply_filters('wp_trim_excerpt', $text, $raw_excerpt); }
The get_the_content() function would return full content if $more != 0. You have to set global variable $more to 0 to make sure get_the_content() function return excerpt.
Modified wp_trim_excerpt() function:
function wp_trim_excerpt($text) { $raw_excerpt = $text; if ( '' == $text ) { global $more; $tmp = $more; $more = 0; $text = get_the_content(''); $more = $tmp; $text = strip_shortcodes( $text ); $text = apply_filters('the_content', $text); $text = str_replace(']]>', ']]>', $text); $text = strip_tags($text); $excerpt_length = apply_filters('excerpt_length', 55); $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]'); $words = preg_split("/[\n\r\t ]+/", $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY); if ( count($words) > $excerpt_length ) { array_pop($words); $text = implode(' ', $words); $text = $text . $excerpt_more; } else { $text = implode(' ', $words); } } return apply_filters('wp_trim_excerpt', $text, $raw_excerpt); }
-
- 2016-09-15
Используя ответы других выше,вот более простой ответ,который,кажется,работает хорошо:
global $post; $excerpt = apply_filters('get_the_excerpt', get_post_field('post_excerpt', $post->ID)); if ( $excerpt == '' ) { $excerpt = wp_trim_words( $post->post_content, 55 ); }
Я использую его в тегах
<meta>
в функции для определения описаний OpenGraph.Тогда я просто добавляю:<meta property="og:description" content="<?php echo esc_html( $excerpt ); ?>" />
Using others' answers above, here's a simpler answer that seems to work well:
global $post; $excerpt = apply_filters('get_the_excerpt', get_post_field('post_excerpt', $post->ID)); if ( $excerpt == '' ) { $excerpt = wp_trim_words( $post->post_content, 55 ); }
I'm using it in the
<meta>
tags in a function to define OpenGraph descriptions. So then I just add:<meta property="og:description" content="<?php echo esc_html( $excerpt ); ?>" />
-
А как насчет HTML-содержимого?Как это будет с тегами?отрывок также удаляет html-теги и шорткоды.а что если первые слова отрывка содержат изображение?Это,вероятно,нарушит ваш макет.What about HTML content? How will this deal with tags? the excerpt also strips html tags and shortcodes. what if the first words of the excerpt contain an image? That will probably break your layout.
- 0
- 2019-12-04
- brett
Я создаю тему,которая будет показывать отрывки на главной странице потенциально для десятков сообщений. У меня нет ручных выдержек из всех моих сообщений,поэтому
$post->post_excerpt
пуст для многих сообщений. В случае отсутствия выдержки из руководства я бы хотел использовать встроенную функциюget_the_excerpt (),но она недоступна вне цикла.Отслеживая функцию,похоже,что она использует wp_trim_excerpt из wp-includes/formatting.php для создания отрывков на лету. Я вызываю его в своем коде как
wp_trim_excerpt( $item->post_content )
,но он просто возвращает полное содержимое. Я что-то не так делаю?Я знаю,что могу создать свою собственную функцию для создания отрывка,но мне нравится использовать встроенные функции,где это возможно,сохраняя мой код совместимым с другими потенциальными плагинами/фильтрами.
http://adambrown.info/p/wp_hooks/hook/wp_trim_excerpt? version=3.0 & amp;file=wp-includes/formatting.php