Apply_Filters()和_Excerpt提供了意外的结果

时间:2011-12-31 作者:jlengstorf

我觉得我一定错过了一些显而易见的东西,但我似乎无法让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);
没有变化。

所以,我的问题是:到底发生了什么?这里有我遗漏的东西吗?

我进入可湿性粉剂核心研究如何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());
}
根据我的调查结果,我有几个问题:

为什么过滤器没有按预期应用提前感谢您的关注。在这里,我相当困惑。

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

原来答案是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);
}
因此,传入的任何文本都不会得到处理;it only works if it\'s called with an empty parameter.

为了解决这个问题,我在主题中添加了一个快速过滤器来解决这个问题:

/**
 * 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\');
这有点多余,但我更喜欢它,而不是每次我想生成摘录时都打开新的循环。

SO网友:hakre

尝试:

   get_post($post->ID)->post_excerpt
                        ^^^^^^^^^^^^
请参见:get_post­Codex 对于所有可用的返回成员。

SO网友:Narga

您可以使用我的自定义函数过滤内容(它来自NARGA Framework)

如果帖子有自定义摘录,则显示内容,如果帖子没有自定义cerpt,则自动生成内容摘录,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\');

结束

相关推荐

Excerpt Problems

在我正在处理的主题上,我想要一个div,它可以扩展到外部div的100%高度(我会放在缩略图周围)。这样做的目的是将文本进一步向右移动,以对齐为块段落,而不是环绕缩略图。我会使用填充,但我希望摘录的文本在没有图像时向左对齐。我试过几次,都没用。建议?看一看:http://themeforward.com/demo2/page/2/如果我使用else语句(http://codex.wordpress.org/Function_Reference/has_post_thumbnail ) 我需要在其中添加整个