问题描述

我觉得我一定很想念一些很明显的东西,但是我似乎无法让 WordPress 合作。

我正在生成具有功能的 Facebook OG 标签。一切都很好,除了摘录。

由于 get_the_excerpt($post->ID)的弃用,是否有另一种创建摘录的方式,而不必创建一个全新的循环?对我来说似乎过多了

我的第一本能是使用 apply_filters()

$description = apply_filters('the_excerpt', get_post($post->ID)->post_content);

这给我完整的帖子,完整的 HTML-formatted 内容。好的,一定是错的所以我尝试了下一个逻辑思路:

$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. 我疯了吗?

感谢提前看看。我在这里很沮丧。

最佳解决方案

结果答案是在 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');

这有点多余,但是我喜欢比每次想要生成摘录时打开新循环更好。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。