Использование отрывка wp trim для вывода отрывка() за пределы цикла
Я создаю тему, которая будет отображать выдержки на главной странице для потенциально десятков сообщений. У меня нет выдержек из руководства для всех моих сообщений, поэтому $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&file=wp-includes/formatting.php
7 answers
Начиная с WP 3.3.0, wp_trim_words()
полезно, если вы можете получить контент, для которого хотите создать отрывок. Надеюсь, это кому-то поможет и сэкономит время на создании собственной функции подсчета слов.
wp_trim_excerpt()
имеет немного любопытную механику - если ему что-то передается, то он ничего не делает.
Вот основная логика, стоящая за этим:
-
get_the_excerpt()
проверяет выдержку вручную; -
wp_trim_excerpt()
включается, если нет выдержки из руководства, и делает ее из контента или тизера.
Оба тесно связаны с глобальными переменными и поэтому цикличны.
Вне цикла вам лучше взять код из wp_trim_excerpt()
и написать свою собственную функцию обрезки.
Обновление:
Вот производная от 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);
}
Вот мой взгляд на "trim_excerpt", который принимает объект post или идентификатор записи в качестве параметра.
Очевидно, основываясь на том, что находится в ядре. Не знаю, почему у этого (и 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);
}
+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, и он должен вести себя аналогичным образом.
Функция get_the_content() вернет полное содержимое, если $больше!= 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);
}
Используя ответы других выше, вот более простой ответ, который, кажется, хорошо работает:
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 ); ?>" />