apply_filters () і the_excerpt дають несподівані результати


10

Я відчуваю, що тут, мабуть, пропускаю щось досить очевидне, але я, здається, не можу змусити WordPress співпрацювати.

Я генерую теги OG Facebook з функцією. Все працює добре, крім уривку.

З часу припинення роботи get_the_excerpt($post->ID), чи є інший спосіб створити уривок без створення цілої нової петлі? Мені це здається надмірним.

Першим моїм інстинктом було використання apply_filters():

$description = apply_filters('the_excerpt', get_post($post->ID)->post_content);

Це дає мені повне повідомлення, доповнене вмістом у форматі HTML. Гаразд, треба помилятися. Тому я спробував наступну логічну ідею:

$description = apply_filters('get_the_excerpt', get_post($post->ID)->post_content);

Без кісток. Зараз немає HTML, але це все-таки повна публікація (що справді заплутано).

Гаразд, без проблем. Давайте пропустимо всі химерні речі та просто підемо на оброблений запис:

$description = wp_trim_excerpt(get_post($post->ID)->post_content);

Без змін.

Отже, моє запитання таке: що за чорт йде? Щось тут мені не вистачає?

Я потрапив у ядро ​​WP, щоб знайти, як the_excerpt()працює, і, схоже, він ідентичний моєму виклику:

/**
 * Display the post excerpt.
 *
 * @since 0.71
 * @uses apply_filters() Calls 'the_excerpt' hook on post excerpt.
 */
function the_excerpt() {
    echo apply_filters('the_excerpt', get_the_excerpt());
}

У мене є кілька запитань на основі моїх висновків:

  1. Чому фільтр не застосовується так, як очікувалося?
  2. Чи є спосіб отримати уривок поза циклом без створення нового циклу?
  3. Чи я божевільний?

Заздалегідь дякую, що подивились. Я тут досить спотикався.


get_the_excerpt()не застаріла, просто зайвий парам, який раніше передавались їй, більше не використовується.
Міло

Вибачте, це я мав на увазі. Дякуємо за уточнення.
jlengstorf

Ти божевільний! . . . як я lol
pythonian29033

Відповіді:


16

Виявляється, відповідь була в wp_trim_excerpt().

Він визначений у wp-includes/functions.php:1879:

/**
 * Generates an excerpt from the content, if needed.
 *
 * The excerpt word amount will be 55 words and if the amount is greater than
 * that, then the string ' [...]' will be appended to the excerpt. If the string
 * is less than 55 words, then the content will be returned as is.
 *
 * The 55 word limit can be modified by plugins/themes using the excerpt_length filter
 * The ' [...]' string can be modified by plugins/themes using the excerpt_more filter
 *
 * @since 1.5.0
 *
 * @param string $text Optional. The excerpt. If set to empty, an excerpt is generated.
 * @return string The excerpt.
 */
function wp_trim_excerpt($text = '') {
    $raw_excerpt = $text;
    if ( '' == $text ) {
        $text = get_the_content('');

        $text = strip_shortcodes( $text );

        $text = apply_filters('the_content', $text);
        $text = str_replace(']]>', ']]>', $text);
        $excerpt_length = apply_filters('excerpt_length', 55);
        $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]');
        $text = wp_trim_words( $text, $excerpt_length, $excerpt_more );
    }
    return apply_filters('wp_trim_excerpt', $text, $raw_excerpt);
}

Таким чином, будь-який текст, переданий в, не обробляється; він працює лише у випадку, якщо його викликають із порожнім параметром.

Щоб вирішити цю проблему, я додав швидкий фільтр до своєї теми, який вирішує проблему:

/**
 * Allows for excerpt generation outside the loop.
 * 
 * @param string $text  The text to be trimmed
 * @return string       The trimmed text
 */
function rw_trim_excerpt( $text='' )
{
    $text = strip_shortcodes( $text );
    $text = apply_filters('the_content', $text);
    $text = str_replace(']]>', ']]>', $text);
    $excerpt_length = apply_filters('excerpt_length', 55);
    $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]');
    return wp_trim_words( $text, $excerpt_length, $excerpt_more );
}
add_filter('wp_trim_excerpt', 'rw_trim_excerpt');

Це дещо зайве, але мені це подобається краще, ніж відкривати нові петлі кожного разу, коли я хочу генерувати уривок.


1
Ах, мені було незрозуміло, що ви шукаєте лише текстову операцію (не виймання з БД).
хакре

Не хвилюйтесь. Я завжди боюся, що не маю сенсу, коли я задаю питання. Я був витягати з бази даних, але я не хочу , щоб відкрити в цілому «Вказати циклу , так як у мене є такі речі , як get_the_title($post->ID)доступні. Останній рядок коду був$description = wp_trim_excerpt(get_post($post->ID)->post_content);
jlengstorf

Мені справді нерозумно це запитувати, але як ти називаєш цей новий фільтр? Я спробував це як $content = apply_filters( 'rw_trim_excerpt', $content );і $content = rw_trim_excerpt($content);, але жодне з них не спрацювало (колишній не обрізав вихід, а пізніше створив помилку).
Ерік К

2
@QuantumDynamix Це призначено , щоб змінити get_the_excerptобробку для мімічних the_excerpt, так що ви можете зателефонувати: apply_filters('get_the_excerpt', $content);.
jlengstorf

феу! приємний з точки зору wpress noob, спасибі
pythonian29033

1

Спробуйте:

   get_post($post->ID)->post_excerpt
                        ^^^^^^^^^^^^

Див.: get_postКодекс для всіх доступних членів повернення.


4
Це повертається порожнім, якщо для публікації не було введено витягу. Мені потрібно імітувати дії get_the_excerpt () (створення витягу, якщо такого немає).
jlengstorf

Застосування фільтра цього не зробить, тому ви задаєте неправильне запитання. Не маю уявлення, чому ви шукаєте уривок, якщо його немає. get_the_excerpt()не імітує це, перевірте джерело, він лише $postотримує доступ до змінної члена, яка є post_excerpt. Дивіться також посилання на кодекс у відповіді.
хакре

3
З запису Кодексу далі the_excerpt: "він відобразить автоматичний уривок, який стосується перших 55 слів змісту публікації." Я хочу імітувати таку поведінку поза циклом.
jlengstorf

Добре створити другий цикл тимчасово і запитати цей файл за його id тоді, ймовірно, для швидкого вирішення. Див. Вторинні петлі - codex.wordpress.org/Function_Reference/…
hakre

1
Дякуємо за посилання Я знав, що можу створити додатковий цикл, але це здається непосильним. Моє рішення було додавати фільтр. Я бачу це як трохи змащення ліктьових нігтів за набагато менший код пізніше.
jlengstorf

0

Ви можете використовувати мою власну функцію для фільтрування вмісту (це з NARGA Framework )

  • Якщо у публікації є власний уривок, покажіть її замість вмісту
  • Автоматично генерувати уривок з вмісту, якщо у публікації немає спеціального сертифіката
  • Автоматична обрізка короткого коду, HTML-код, видаліть [...], додайте текст "Детальніше" (перекладається)

        /**
        * Auto generate excerpt from content if the post hasn't custom excerpt
        * @from NARGA Framework - http://www.narga.net/narga-core
        * @param $excerpt_lenght  The maximium words of excerpt generating from content
        * @coder: Nguyễn Đình Quân a.k.a Narga - http://www.narga.net
        **/  
        function narga_excerpts($content = false) {
        # If is the home page, an archive, or search results
        if(is_front_page() || is_archive() || is_search()) :
            global $post;
        $content = $post->post_excerpt;
        $content = strip_shortcodes($content);
        $content = str_replace(']]>', ']]>', $content);
        $content = strip_tags($content);
        # If an excerpt is set in the Optional Excerpt box
        if($content) :
            $content = apply_filters('the_excerpt', $content);
        # If no excerpt is set
        else :
            $content = $post->post_content;
            $excerpt_length = 50;
            $words = explode(' ', $content, $excerpt_length + 1);
        if(count($words) > $excerpt_length) :
            array_pop($words);
            array_push($words, '...<p><a class="more-link" href="' . get_permalink() . '" title="' . the_title_attribute('echo=0') . '">  ' . __( 'Read more &#187;', 'narga' ) . ' </a></p>');
            $content = implode(' ', $words);
        endif;
        $content = '<p>' . $content . '</p>';
        endif;
        endif;
        # Make sure to return the content
        return $content;
        }
        // Add filter to the_content
        add_filter('the_content', 'narga_excerpts');
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.