apply_filters()和the_excerpt提供了意外的结果


10

我觉得我肯定在这里缺少明显的东西,但是我似乎无法让WordPress合作。

我正在生成具有功能的Facebook OG标签。除摘录外,其他所有内容均正常运行。

由于的弃用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 2011年

你疯了!。。。我大声笑
pythonian29033 '16

Answers:


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
啊,对我来说不清楚您是在寻找文本操作(不是从DB提取)。
hakre 2012年

别担心。我总是担心我问问题时没有道理。我从数据库提取数据的,但是我不想打开整个“另一个循环”,因为我有get_the_title($post->ID)可用的东西。代码的最后一行是$description = wp_trim_excerpt(get_post($post->ID)->post_content);
jlengstorf 2012年

我问这个问题真的很愚蠢,但是您怎么称呼这个新的过滤器?我按$content = apply_filters( 'rw_trim_excerpt', $content );和尝试过$content = rw_trim_excerpt($content);,但是这些都不起作用(前者未调整输出,后来产生了错误)。
埃里克·K

2
@QuantumDynamix旨在将get_the_excerpt处理方式修改为模仿the_excerpt,因此可以调用:apply_filters('get_the_excerpt', $content);
jlengstorf

phe!从Wook Noob的角度来看,这是一个不错的选择,谢谢
pythonian29033 '16

1

尝试:

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

有关所有可用的返回成员,请参阅:get_post食品法典


4
如果未输入帖子摘录,则返回空白。我需要模仿get_the_excerpt()的操作(如果不存在,请创建摘录)。
jlengstorf 2011年

应用过滤器不会那样做,所以您要问错问题。不知道为什么要寻找摘录(如果没有)。get_the_excerpt()不模仿它,请检查源,仅访问其成员变量$postpost_excerpt。另请参见答案中的Codex链接。
hakre 2011年

3
从食典条目上the_excerpt:“它将显示一个自动摘录,该摘录引用该帖子内容的前55个字。” 我希望模仿循环外的行为。
jlengstorf 2011年

好吧,暂时创建第二个循环,并通过其ID查询该文件,然后寻求快速解决方案。见副圈 - codex.wordpress.org/Function_Reference/...
hakre

1
感谢您的链接。我知道我可以设置一个附加循环,但这似乎有些过分。我的解决方案是添加一个过滤器。我现在将其视为一种肘部润滑脂,以后的代码要少得多。
jlengstorf 2012年

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');
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.