使用wp_trim_excerpt在循环外部获取_excerpt()

时间:2011-01-14 作者:Derek Perkins

我正在构建一个主题,在主页上显示可能有几十篇文章的摘录。我的所有帖子上都没有手动摘录,所以$post->post_excerpt 许多帖子都是空的。如果没有手动摘录,我希望使用内置的get\\u the\\u extract()函数,但它在循环外不可用。

跟踪函数时,它似乎使用了wp\\u trim\\u摘录自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

6 个回复
最合适的回答,由SO网友:jamesc 整理而成

自WP 3.3.0起,wp_trim_words() 如果您能够获取要为其生成摘录的内容,则会很有帮助。希望这对其他人有帮助,这样可以节省创建自己的字数计算功能的时间。

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

SO网友:Rarst

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

以下是其背后的基本逻辑:

  • get_the_excerpt() 检查手册摘录
  • wp_trim_excerpt() 如果没有手动摘录,请插话,并根据内容或摘要进行摘录
Both 与全局变量紧密相连,所以循环。

在循环之外,最好从中删除代码wp_trim_excerpt() 并编写自己的修剪函数。

SO网友:Ardee Aram

更新时间:

这里是我使用的wp\\u trim\\u extract()的派生。工作正常。源自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);
}

SO网友:Tom Auger

下面是我对“trim\\u摘录”的看法,它将post对象或post ID作为参数。

显然是基于核心的。不知道为什么这个(和get\\u the\\u 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);
    }

SO网友:Ardee Aram

+1至Rast。非常奇怪的是,没有像get\\u the\\u extract($post->ID)这样的东西,而很明显它应该这样做。无论如何,以下是wordpress 3.0.4版中的wp\\u trim\\u extract():

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\\u the\\u contents链接到$post全局变量。是的,我不知道他们在想什么。但是从这里开始,在您自己的my\\u摘录中将get\\u the\\u内容替换为$text,它的行为应该类似。

SO网友:dpruth

使用上面其他人的答案,这里有一个简单的答案,似乎效果很好:

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

结束

相关推荐

Automating Excerpt

我正在努力automate 编辑通过自动化工作excerpts.我的解决方案可行,但几乎没有问题:如果一篇文章开头有图像/破坏的html,它会破坏版面。子字符串剪切单词。是否有更好的解决方案来自动化摘录或改进现有代码?<?php if(!empty($post->post_excerpt)) { the_excerpt(); } else { echo \"<p>\".substr(get_the