我正在建立一个主题,该主题将在主页上显示可能有数十篇文章的节选。我的所有帖子都没有手册摘录,因此$post->post_excerpt对于许多帖子都是空的。如果没有手动摘录,我想使用内置的get_the_excerpt()函数,但是在循环外不可用。

跟踪该函数,它看起来它使用wp-includes / formatting.php中的wp_trim_excerpt来动态创建摘录。我在像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);

#1 楼

从WP 3.3.0起,如果您能够获取要为其生成摘录的内容,则wp_trim_words()将非常有用。希望这对某人有帮助,并且可以节省创建自己的单词计数功能。

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

#2 楼

wp_trim_excerpt()有点奇怪的机制-如果传递任何东西,它什么也不做。

这是它的基本逻辑:



检查是否有手动摘录;

如果没有手动摘录,则从内容或预告片中选出一个。

两者都与全局变量紧密相关,因此Loop。 br />
在循环之外,最好从get_the_excerpt()中取出代码并编写自己的修整函数。

#3 楼

更新:

这是我使用的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代码的链接复制到该答案中,然后删除您的第一个答案。

– Jan Fabry
2011-1-25在9:01

对于复制/粘贴:添加$ raw_excerpt = $ text;

– Svetoslav Marinov
2015年4月11日23:30



#4 楼

这是我对以帖子对象或帖子ID为参数的“ 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);
    }


#5 楼

+1到拉斯特。非常奇怪的是,当很明显应该没有get_the_excerpt($ post-> ID)之类的东西时。无论如何,这是wordpress版本3.0.4中的wp_trim_excerpt():

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行上看到它通过get_the_contents链接到$ post全局变量。是的,我不知道他们在想什么。但是从这里,在您自己的my_excerpt中将get_the_content替换为$ text,它的行为应类似。

评论


azure_ardee:考虑使用wp_trim_words()

–user24378
2012年12月3日在18:35

#6 楼

如果$ more!= 0,get_the_content()函数将返回完整内容。
必须将全局变量$ 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);
}


#7 楼

使用上面的其他答案,这是一个似乎比较有效的简单答案:因此,我只需添加:

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


评论


那么HTML内容呢?标签将如何处理?摘录还剥离了html标签和简码。如果摘录的第一句话包含图片怎么办?那可能会破坏您的布局。

–brett
19/12/4在16:49