我有一个调用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:我也在使用“高级摘录”插件

评论

好的,使用my_excerpt($ post-> post_content,get_the_excerpt())并使用wordpress.stackexchange.com/questions/6961/…的my_excerpt()函数得到它
请添加您想出的解决方案作为答案,因此这不会困扰网站作为未回答的问题。 :)

只需在调用get_the_excerpt()之前使用the_post()(它也适用于单个帖子模板)功能,它将为您设置必要的数据。

#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