get_the_title()
的代码,它可以工作,但是get_the_excerpt()
返回空。我该如何运作? 该代码位于名为“ WP Facebook Open Graph protocol”的插件中。这是我要更改的部分:
if (is_singular('post')) {
if (has_excerpt($post->ID)) {
echo "\t<meta property='og:description' content='".esc_attr(strip_tags(get_the_excerpt($post->ID)))."' />\n";
}else{
echo "\t<meta property='og:description' content='". [?] ."' />\n";
}
}else{
echo "\t<meta property='og:description' content='".get_bloginfo('description')."' />\n";
}
这里,
has_excerpt
总是失败,并且get_the_excerpt($post->ID)
不再起作用(已弃用)。所以,如何在其中显示摘录?
ps:我也在使用“高级摘录”插件
#1 楼
我在寻找如何在没有post对象的情况下执行此操作时遇到了这个问题。评论
应该将其作为答案,因为这是将数据拉出循环的推荐方法。也不需要任何自定义函数或$ post全局变量的覆盖。
– MacK
2015年6月16日在16:43
它返回空字符串。
–京Tun
16年1月20日在7:45
@KyawTun-它有效,只要设置了$ post_id($ post_id的值是什么?并且$ post_id是有效的合法帖子ID。
–random_user_name
16年1月20日在15:03
@cale_b谢谢。我使用get_posts查询并从结果数组中获取ID。 post对象确实具有post_title,post_content,ID等。但不起作用。
–京Tun
16年1月21日在12:30
如果只需要TEXT而不是the_excerpt过滤器随附的
标记,则使用“ get_the_excerpt”过滤器,这样上面的过滤器将变为:$ text = apply_filters('get_the_excerpt',get_post_field('post_excerpt',$ post_id) );这只会提供您可以在自己的标记中的任何位置插入的RAW文本。
–莫欣
16年5月20日在18:42
#2 楼
由于似乎您已经有需要摘录的post对象,因此您可以强制执行以下操作:setup_postdata( $post );
$excerpt = get_the_excerpt();
setup_postdata()
函数将全球化$post
对象并生成它可用于常规的旧循环功能。当您处于循环内部时,请调用the_post()
,它会为您进行设置...在循环外部,您需要手动强制操作。评论
这可以,但是:“您必须传递对全局$ post变量的引用,否则诸如the_title()之类的功能将无法正常工作。”全局$ post; $ post = $ post_object; setup_postdata($ post); $ excerpt = get_the_excerpt();
–教
17年1月19日23:35
setup_postdata($ post); FTW !!!!
– squarecandy
17年4月30日在17:48
#3 楼
试试看:在functions.php中创建一个新函数,然后从任何地方调用它。
function get_excerpt_by_id($post_id){
$the_post = get_post($post_id); //Gets post ID
$the_excerpt = $the_post->post_content; //Gets post_content to be used as a basis for the excerpt
$excerpt_length = 35; //Sets excerpt length by word count
$the_excerpt = strip_tags(strip_shortcodes($the_excerpt)); //Strips tags and images
$words = explode(' ', $the_excerpt, $excerpt_length + 1);
if(count($words) > $excerpt_length) :
array_pop($words);
array_push($words, '…');
$the_excerpt = implode(' ', $words);
endif;
$the_excerpt = '<p>' . $the_excerpt . '</p>';
return $the_excerpt;
}
这里是描述代码的文章。
评论
很好找到我的朋友。我从未理解过WordPress为什么会弃用如此重要的功能。这实际上是从头开始重建它,但是它可以工作。考虑到我们经常使用社交共享插件等功能在循环外使用摘录,它可能应该仍然是核心的一部分。
–必不可少的想法
2014年5月15日下午2:56
EAMann的答案是解决此问题的更好方法,应将其视为最佳实践。这种方法基本上是在复制Core的内部结构,而不是使用API。
–伊恩·邓恩
2015年3月24日,1:18
#4 楼
现在,您可以简单地使用get_the_excerpt( $postID )
函数。 由于:WordPress 4.5.0引入了
$post
参数。 评论
由于我们处于WP 4.5 +时代,因此这应该是新的接受的答案。
–Matija Mrkaic
16年6月13日在12:18
如果摘录为空,这将不起作用,因为wp_trim_excerpt过滤器将返回当前帖子的摘录。
–迪伦
16年8月16日在22:24
有关@Dylan所说的内容,请参阅core.trac.wordpress.org/ticket/36934。
–卡夫纳
16 Sep 14'7:18
#5 楼
使用my_excerpt($post->post_content, get_the_excerpt())
并通过使用wp_trim_excerpt中的my_excerpt()
函数得到了它,从而在循环外获取the_excerpt()评论
仅链接的答案不好。在此处复制相关代码。当该链接断开时,该站点已关闭/消失,那么此答案没有任何价值。
–random_user_name
14年6月18日在15:23
它对我来说很完美!
– Saikat
17年7月24日在12:19
#6 楼
如果您没有post对象,这是一个简短的函数,例如Withers的函数。function get_excerpt_by_id($post_id){
$the_post = get_post($post_id);
$the_excerpt = $the_post->post_excerpt;
return $the_excerpt;
}
评论
但是,提问者具有问题中所述的张贴对象。
– fuxia♦
2012年11月25日19:51
如果我错了,请纠正我,此方法将返回手动摘录,但如果需要的话不会生成一个
– Bill
2014年11月7日12:46
#7 楼
这是当您想在循环外使用get_the_excerpt()
时使用的:function custom_get_excerpt($post_id) {
$temp = $post;
$post = get_post($post_id);
setup_postdata($post);
$excerpt = get_the_excerpt();
wp_reset_postdata();
$post = $temp;
return $excerpt;
}
评论
这是最直接的方法。虽然不确定它在性能上是否很好。你仍然得到我的+1
– Bill
2014年11月7日12:47
#8 楼
如果您想从一行内容自动生成摘录-您可以使用wp_trim_words
函数,如下所示:// 30 is the number of words ehere
$excerpt = wp_trim_words(get_post_field('post_content', $post_id), 30);
#9 楼
$trimexcerpt = get_the_content();
$shortexcerpt = wp_trim_words( $trimexcerpt, $num_words = 18, $more = '… ' );
echo $shortexcerpt;
评论
请编辑您的答案,并添加解释:为什么这可以解决问题?
– fuxia♦
18年3月14日在20:25
评论
好的,使用my_excerpt($ post-> post_content,get_the_excerpt())并使用wordpress.stackexchange.com/questions/6961/…的my_excerpt()函数得到它请添加您想出的解决方案作为答案,因此这不会困扰网站作为未回答的问题。 :)
只需在调用get_the_excerpt()之前使用the_post()(它也适用于单个帖子模板)功能,它将为您设置必要的数据。