在循环外使用get_the_excerpt获取摘录


31

我有一个可以调用的代码,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()功能
ariel

3
请添加您想出的解决方案作为答案,因此这不会困扰网站作为未回答的问题。:)
Rarst 2011年

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

Answers:


29

我在寻找没有 post对象的情况下发现了这个问题。

我的其他研究发现了这种巧妙的技术:

$text = apply_filters('the_excerpt', get_post_field('post_excerpt', $post_id));


1
应将此作为答案,因为这是将数据拉出循环的推荐方法。也不需要任何自定义函数或覆盖$post全局变量。
MacK 2015年

4
它返回空字符串。
京东

1
@KyawTun -它的工作原理,只要$post_id设定(什么是价值$post_id和?$post_id是有效的,合法的帖子的ID。
cale_b

2
@cale_b谢谢。我使用get_posts查询并从结果数组中获取ID。post对象确实具有post_title,post_content,ID等。但不起作用。
京东

如果只需要TEXT而不是the_excerpt过滤器随附的<p>标记,则使用“ get_the_excerpt”过滤器,这样上面的过滤器将变为:$ text = apply_filters('get_the_excerpt',get_post_field('post_excerpt',$ post_id) ); 这只会提供您可以在自己的标记中的任何位置插入的RAW文本。
Mohsin

22

由于似乎您已经有需要摘录的post对象,因此可以强制使工作正常进行:

setup_postdata( $post );
$excerpt = get_the_excerpt();

setup_postdata()函数将全球化$post对象,并使它可用于常规的旧循环函数。当您进入循环内部时,您会调用the_post()并为您进行设置...在循环外部,您需要手动强制执行。


1
这可以,但是:“您必须传递对全局$post变量的引用,否则类似的函数the_title()将无法正常工作。” global $post;$post = $post_object;setup_postdata( $post );$excerpt = get_the_excerpt();
传播

setup_postdata($post);FTW !!!!
squarecandy

18

尝试这个:

在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;
}

这是描述代码的帖子。


1
很好找到我的朋友。我从未理解过WordPress为什么会弃用如此重要的功能。这实际上是从头开始重建它,但是它可以工作。考虑到我们经常使用社交共享插件等功能在循环外使用摘录,它可能应该仍然是核心的一部分。
势在必行的想法

1
EAMann的答案是解决此问题的更好方法,应将其视为最佳实践。这种方法基本上是在复制Core的内部结构,而不是使用API​​。
伊恩·邓恩



1

如果没有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

3
如果我错了,请纠正我,此方法将返回手动摘录,但在需要时不会生成一个摘录
Bill

1

这是当您想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
比尔

1

如果您想自动从一行内容中摘录-您可以使用如下wp_trim_words功能:

// 30 is the number of words ehere
$excerpt = wp_trim_words(get_post_field('post_content', $post_id), 30);

-1
$trimexcerpt = get_the_content();
$shortexcerpt = wp_trim_words( $trimexcerpt, $num_words = 18, $more = '… ' ); 
echo $shortexcerpt;

编辑您的答案,并添加解释:为什么这可以解决问题?
fuxia
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.