Intereting Posts
Предварительный просмотр сообщения дает 404, когда постоянные ссылки являются чисто основанными на дате template_include not loading-instead переходит в index.php Как добавить секретный флажок в шаблон комментария? Можно ли настроить параметры настройки темы из wp.customize с помощью jquery? Заголовок тега WordPress не меняется как заставить WordPress не искать темы Проблема с плагином ajax для обновления сообщений Неверные результаты поиска в search.php – проблема срабатывает с помощью `define ('BodyID', 'search'); the_post (); `in search.php Поверните галерею коротких штрихов в карусель в WordPress 4.4 Есть способ масштабировать медиа (изображения) на 50%? Исправить права доступа к файлам для обновлений в браузере с использованием WP-CLI Как удалить шаблон родительской темы из Quick Edit? Ошибка перенаправления после входа в систему Остановить редактор WYSIWYG WordPress от преобразования «не» в «didn», «» «» «t»? Могу ли я подключить плагин непосредственно из папки плагина внутри установки, используя Trunk SVN

Используя wp_trim_excerpt, чтобы получить the_excerpt () вне цикла

Я создаю тему, на которой будут показаны выдержки на главной странице, для потенциально десятков сообщений. У меня нет ручных выдержек на всех моих постах, поэтому $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

Начиная с WP 3.3.0, wp_trim_words() полезна, если вы можете получить контент, для которого вы хотите создать выдержку. Надеюсь, что это полезно для кого-то, и это экономит создание собственной функции подсчета слов.

http://codex.wordpress.org/Function_Reference/wp_trim_words

wp_trim_excerpt() имеет немного любопытных механиков – если что-то передается ему, то ничего не делает.

Вот основная логика:

  • get_the_excerpt() проверяет ручную выдержку;
  • wp_trim_excerpt() если нет ручного отрывка и делает его из содержимого или тизера.

Оба жестко привязаны к глобальным переменным и поэтому Loop.

Вне Loop вам лучше взять код из 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 () вернет полный контент, если $ 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); } 

Используя другие ответы выше, вот более простой ответ, который, кажется, работает хорошо:

 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 ); ?>" />