Використання wp_trim_excerpt для отримання the_excerpt () поза циклом


20

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

Відстежуючи функцію, схоже, вона використовує wp_trim_excerpt з wp-include / 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


Ви можете спробувати зателефонувати до $myvar = apply_filters( 'the_excerpt', $myvar );
витяжних

Відповіді:


22

Оскільки WP 3.3.0, wp_trim_words()корисний, якщо ви можете отримати вміст, для якого ви хочете створити уривок. Сподіваємось, це комусь корисно, і це економить створення власної функції підрахунку слів.

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


8

wp_trim_excerpt() має трохи цікавої механіки - якщо щось передається їй, то воно нічого не робить.

Ось основна логіка за нею:

  • get_the_excerpt() чеки на витяг вручну;
  • wp_trim_excerpt() куранти, якщо немає ручного витягу і робить його зі змісту чи тизера.

Обидва тісно пов'язані з глобальними змінними і тому Loop.

Поза межами циклу вам краще зняти код wp_trim_excerpt()і написати власну функцію обрізки.


6

Оновлення:

Ось похідне від 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);
}

Не потрібно публікувати нову відповідь, ви завжди можете редагувати стару, щоб включити нову інформацію. Наприклад, ви можете скопіювати посилання на WP-код із своєї першої відповіді в цю, а потім видалити свою першу відповідь.
Ян Фабрі

Для копіювання / вставки там: додайте $ raw_excerpt = $ текст;
Светослав Маринов

1

Ось мій погляд на "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);
    }

0

+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, і він повинен вести себе аналогічно.


azure_ardee : подумайте про використання wp_trim_words ()

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);
}

0

Використовуючи відповіді інших людей вище, ось простіша відповідь, яка, здається, працює добре:

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

Що з вмістом HTML? Як це матиме справу з тегами? витяг також знімає html-теги та шорткоди. що робити, якщо перші слова уривку містять зображення? Це, ймовірно, порушить ваш макет.
Бретт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.