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

14 янв. 2011 г., 12:34:06
Просмотры: 37.2K
Голосов: 21

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

1
Комментарии

Вы можете попробовать вызвать фильтры цитаты... $myvar = apply_filters( 'the_excerpt', $myvar );

t31os t31os
15 янв. 2011 г. 18:14:17
Все ответы на вопрос 7
0
22

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

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

22 мар. 2012 г. 23:28:30
0

Функция wp_trim_excerpt() имеет любопытную особенность — если ей передать какой-либо параметр, она ничего не сделает.

Основная логика работы:

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

Обе функции тесно связаны с глобальными переменными и, следовательно, с Циклом (Loop).

За пределами Цикла лучше взять код из wp_trim_excerpt() и написать собственную функцию для обрезки текста.

14 янв. 2011 г. 14:01:10
2

Обновление:

Вот производная функция от 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);
}
21 янв. 2011 г. 05:09:36
Комментарии

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

Jan Fabry Jan Fabry
25 янв. 2011 г. 11:01:26

Для тех, кто копирует/вставляет: добавьте $raw_excerpt = $text;

Svetoslav Marinov Svetoslav Marinov
12 апр. 2015 г. 02:30:27
0

Вот моя реализация функции "trim_excerpt", которая принимает объект записи или ID записи в качестве параметра.

Очевидно, основано на ядре WordPress. Непонятно, почему в ядре нет таких функций (как и get_the_author()), которые могли бы работать вне цикла.

/**
     * Генерирует краткое описание из содержимого, если это необходимо.
     *
     * @param int|object $post_or_id может быть ID записи или самим объектом $post
     * @param string $excerpt_more текст, который добавляется в конец описания, если оно было обрезано алгоритмически
     * @return string обрезанное описание или ручное описание, если оно существует         
     */
    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);

            // не предполагаем автоматически, что будем использовать глобальную ссылку "читать далее" из темы
            // $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);
    }
26 авг. 2011 г. 20:23:10
1

+1 к Rast. Очень странно, что нет такой функции, как 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, она должна вести себя аналогичным образом.

21 янв. 2011 г. 05:01:45
Комментарии

azure_ardee: рассмотрите использование wp_trim_words()

User User
3 дек. 2012 г. 20:35:45
0

Функция 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);
}
17 апр. 2011 г. 20:36:45
1

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

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 ); ?>" />
15 сент. 2016 г. 19:42:46
Комментарии

А как насчёт HTML-контента? Как это будет обрабатывать теги? В отрывке также удаляются HTML-теги и шорткоды. Что если первые слова отрывка содержат изображение? Это, вероятно, сломает вашу вёрстку.

brett brett
4 дек. 2019 г. 18:49:38