我觉得我一定错过了一些显而易见的东西,但我似乎无法让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());
}
根据我的调查结果,我有几个问题:
为什么过滤器没有按预期应用有没有一种方法可以在循环之外获取摘录,而不创建新的循环我疯了吗提前感谢您的关注。在这里,我相当困惑。
最合适的回答,由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网友: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 »\', \'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\');