$post->post_excerpt
对于许多帖子都是空的。如果没有手动摘录,我想使用内置的get_the_excerpt()函数,但是在循环外不可用。跟踪该函数,它看起来它使用wp-includes / formatting.php中的wp_trim_excerpt来动态创建摘录。我在像
wp_trim_excerpt( $item->post_content )
这样的代码中调用它,但它只是返回完整内容。我做错什么了吗?我知道我可以创建自己的函数来创建摘录,但是我喜欢尽可能使用内置函数,以使我的代码与其他潜在的插件/过滤器兼容。
http://adambrown.info/p/wp_hooks/hook/wp_trim_excerpt?version=3.0&file=wp-includes/formatting.php
#1 楼
从WP 3.3.0起,如果您能够获取要为其生成摘录的内容,则wp_trim_words()
将非常有用。希望这对某人有帮助,并且可以节省创建自己的单词计数功能。http://codex.wordpress.org/Function_Reference/wp_trim_words
#2 楼
wp_trim_excerpt()
有点奇怪的机制-如果传递任何东西,它什么也不做。这是它的基本逻辑:
检查是否有手动摘录;
如果没有手动摘录,则从内容或预告片中选出一个。
两者都与全局变量紧密相关,因此Loop。 br />
在循环之外,最好从
get_the_excerpt()
中取出代码并编写自己的修整函数。#3 楼
更新:这是我使用的wp_trim_excerpt()的派生词。完美运作。源自Wordpress版本3.0.4
function my_excerpt($text, $excerpt)
{
if ($excerpt) return $excerpt;
$text = strip_shortcodes( $text );
$text = apply_filters('the_content', $text);
$text = str_replace(']]>', ']]>', $text);
$text = strip_tags($text);
$excerpt_length = apply_filters('excerpt_length', 55);
$excerpt_more = apply_filters('excerpt_more', ' ' . '[...]');
$words = preg_split("/[\n\r\t ]+/", $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY);
if ( count($words) > $excerpt_length ) {
array_pop($words);
$text = implode(' ', $words);
$text = $text . $excerpt_more;
} else {
$text = implode(' ', $words);
}
return apply_filters('wp_trim_excerpt', $text, $raw_excerpt);
}
评论
您不必发布新答案,您始终可以编辑旧答案以包括新信息。例如,您可以将第一个答案中指向WP代码的链接复制到该答案中,然后删除您的第一个答案。
– Jan Fabry
2011-1-25在9:01
对于复制/粘贴:添加$ raw_excerpt = $ text;
– Svetoslav Marinov
2015年4月11日23:30
#4 楼
这是我对以帖子对象或帖子ID为参数的“ trim_excerpt”的看法。显然是基于核心内容。不知道为什么这个(和get_the_author())没有非循环等效项。
/**
* Generates an excerpt from the content, if needed.
*
* @param int|object $post_or_id can be the post ID, or the actual $post object itself
* @param string $excerpt_more the text that is applied to the end of the excerpt if we algorithically snip it
* @return string the snipped excerpt or the manual excerpt if it exists
*/
function zg_trim_excerpt($post_or_id, $excerpt_more = ' [...]') {
if ( is_object( $post_or_id ) ) $postObj = $post_or_id;
else $postObj = get_post($post_or_id);
$raw_excerpt = $text = $postObj->post_excerpt;
if ( '' == $text ) {
$text = $postObj->post_content;
$text = strip_shortcodes( $text );
$text = apply_filters('the_content', $text);
$text = str_replace(']]>', ']]>', $text);
$text = strip_tags($text);
$excerpt_length = apply_filters('excerpt_length', 55);
// don't automatically assume we will be using the global "read more" link provided by the theme
// $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]');
$words = preg_split("/[\n\r\t ]+/", $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY);
if ( count($words) > $excerpt_length ) {
array_pop($words);
$text = implode(' ', $words);
$text = $text . $excerpt_more;
} else {
$text = implode(' ', $words);
}
}
return apply_filters('wp_trim_excerpt', $text, $raw_excerpt);
}
#5 楼
+1到拉斯特。非常奇怪的是,当很明显应该没有get_the_excerpt($ post-> ID)之类的东西时。无论如何,这是wordpress版本3.0.4中的wp_trim_excerpt():http://core.trac.wordpress.org/browser/tags/3.0.4/wp-includes/formatting.php
function wp_trim_excerpt($text) {
1824 $raw_excerpt = $text;
1825 if ( '' == $text ) {
1826 $text = get_the_content('');
1827
1828 $text = strip_shortcodes( $text );
1829
1830 $text = apply_filters('the_content', $text);
1831 $text = str_replace(']]>', ']]>', $text);
1832 $text = strip_tags($text);
1833 $excerpt_length = apply_filters('excerpt_length', 55);
1834 $excerpt_more = apply_filters('excerpt_more', ' ' . '[...]');
1835 $words = preg_split("/[\n\r\t ]+/", $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY);
1836 if ( count($words) > $excerpt_length ) {
1837 array_pop($words);
1838 $text = implode(' ', $words);
1839 $text = $text . $excerpt_more;
1840 } else {
1841 $text = implode(' ', $words);
1842 }
1843 }
1844 return apply_filters('wp_trim_excerpt', $text, $raw_excerpt);
1845 }
您可以在第1826行上看到它通过get_the_contents链接到$ post全局变量。是的,我不知道他们在想什么。但是从这里,在您自己的my_excerpt中将get_the_content替换为$ text,它的行为应类似。
评论
azure_ardee:考虑使用wp_trim_words()
–user24378
2012年12月3日在18:35
#6 楼
如果$ more!= 0,get_the_content()函数将返回完整内容。必须将全局变量$ more设置为0,以确保get_the_content()函数返回摘录。
修改后的wp_trim_excerpt ()函数:
function wp_trim_excerpt($text) {
$raw_excerpt = $text;
if ( '' == $text ) {
global $more;
$tmp = $more;
$more = 0;
$text = get_the_content('');
$more = $tmp;
$text = strip_shortcodes( $text );
$text = apply_filters('the_content', $text);
$text = str_replace(']]>', ']]>', $text);
$text = strip_tags($text);
$excerpt_length = apply_filters('excerpt_length', 55);
$excerpt_more = apply_filters('excerpt_more', ' ' . '[...]');
$words = preg_split("/[\n\r\t ]+/", $text, $excerpt_length + 1, PREG_SPLIT_NO_EMPTY);
if ( count($words) > $excerpt_length ) {
array_pop($words);
$text = implode(' ', $words);
$text = $text . $excerpt_more;
} else {
$text = implode(' ', $words);
}
}
return apply_filters('wp_trim_excerpt', $text, $raw_excerpt);
}
#7 楼
使用上面的其他答案,这是一个似乎比较有效的简单答案:因此,我只需添加:global $post;
$excerpt = apply_filters('get_the_excerpt', get_post_field('post_excerpt', $post->ID));
if ( $excerpt == '' ) {
$excerpt = wp_trim_words( $post->post_content, 55 );
}
评论
那么HTML内容呢?标签将如何处理?摘录还剥离了html标签和简码。如果摘录的第一句话包含图片怎么办?那可能会破坏您的布局。
–brett
19/12/4在16:49
评论
您可以尝试调用摘录过滤器... $ myvar = apply_filters('the_excerpt',$ myvar);