问题描述
我觉得我一定很想念一些很明显的东西,但是我似乎无法让 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());
}
根据我的发现我有几个问题:
-
为什么不按预期应用过滤器?
-
有没有办法在循环之外获取摘录而不创建新循环?
-
我疯了吗?
感谢提前看看。我在这里很沮丧。
最佳解决方案
结果答案是在 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。