通过ID获取摘录


31

为什么不能像标题和大多数其他元素一样通过ID摘录。

例如。get_the_excerpt(ID)。我知道如何与$ post-> post_excerpt函数一起使用它,但是如果未输入任何摘录,它不会返回部分内容,因此简单地什么也不会返回。

所以我想做的是,如果有摘录,则按ID摘录,如果没有该ID的摘录,但有一些内容,则改为获取一些内容。

一个人怎么做。

有任何想法吗,

奇妙的...

编辑-

根据请求循环源代码。

<?php $stories = get_posts('category_name=feedback&numberposts=4'); 
            foreach ($stories as $post) :
            $title = $post->post_title;
            $excerpt = get_the_excerpt_id($post->ID);
            $thumb = get_the_post_thumbnail($post->ID,array(60, 60, true));?>
              <div class="textstandard_white" style="font-size:14px; line-height:22px; padding-top:10px;"><b><a href="<?php echo get_permalink($post->ID);?>"><?php echo $title;?></a></b></div><div align="left" style="height:18px; width:82px; background:url(http://www.divethegap.com/update/z-images/structure/icons/stars.png) left top no-repeat;"><div id="stars<?php echo $post->ID;?>" align="left" style="height:18px; background:url(http://www.divethegap.com/update/z-images/structure/icons/stars_glow.png) left top no-repeat;">
                  </div>
                  </div>

                  <script type="text/javascript">
                var width<?php echo $post->ID;?> = ((<?php
$Rating = get_post_meta($post->ID, "Rating", true);
echo $Rating;
?> * 20) + '%')
                  $('#stars<?php echo $post->ID;?>').css('width', width<?php echo $post->ID;?>);

                 </script><div class="textstandard_white" style="padding-top:6px; font-size:10px; color:#BBB; padding-bottom:10px; border-bottom:1px dotted #BBB; min-height:70px;"><div style="float:left; padding-right:6px; padding-bottom:6px;"><div style="background:#FFF; border:1px solid #FFF;
border-radius: 4px; -moz-border-radius: 4px ; -webkit-border-radius: 4px; padding:4px;"><a href="<?php echo get_permalink($post->ID);?>"><?php echo $thumb;?></a></div></div>



<?php echo $excerpt;?></div>
              <?php endforeach;?>

内容的“某些”到底是什么?
kaiser

wordpress中的摘录功能返回帖子的摘录。如果帖子没有节录,则返回内容的一定数量的字符,后跟“ ...”或“更多内容”或模板提供的内容
Robin I Knight

1
不是成为PITA,而是社区规则禁止签名和标准关闭。为了遵守规则并避免在编辑所有问题后让Jeff Atwood向您发送严厉的信息,请在结尾处停止使用“ Marvellous”(并且请不要射击信使)
MikeSchinkel 2011年

Answers:


20

@Robin I.Knight:

我认为get_the_excerpt()这是传统设计的功能。随着WordPress使用量的增长,有许多较新的用例不适合使用,但适用于获取不同数据的较新功能。一个例子是现在经常使用$args一系列功能选项。

但是很容易满足您的需求。您可以使用以下替代功能,将该功能放在主题functions.php文件中的任何位置:

function robins_get_the_excerpt($post_id) {
  global $post;  
  $save_post = $post;
  $post = get_post($post_id);
  $output = get_the_excerpt();
  $post = $save_post;
  return $output;
}

我尚未对其进行测试,但可以肯定的是我做对了。如果这不能满足您的需求,请详细说明,也许我可以提出其他建议。


有用。有点。非常奇怪的结果。它肯定在执行其功能,但结果很奇怪。我将它与GET_Posts结合使用,由于某些原因,前2个get帖子始终相同。这是一个链接,您将明白我的意思。查看右侧的4个帖子。divethegap.com/update/community/feedback/2010/06/steve-riches
罗宾一世骑士

@Robin I Knight:请发布您的循环源代码以更新您的问题;不看代码就很难调试代码。也可能是导致问题的插件;尝试一次禁用一个。
MikeSchinkel 2011年

上面有问题的循环源代码^^
Robin I Knight

顺便说一句,我将函数的名称更改为get_the_excerpt_id($ post_id)
罗宾一世骑士

@Robin I Knight-我在循环中看不到任何内容,但是您可以尝试setup_postdata($post)在循环的开始进行调用,如@Rarst所建议的那样。如果那不起作用,可能是您需要禁用的插件;你尝试过吗?您可能不想调用它,get_the_excerpt_id()因为WordPress将来可能会添加该功能并破坏您的网站。通过使用foreach($stories as $story): global $post; $post = $story;代替,您可能会在循环中没有该函数。
MikeSchinkel 2011年

16

摘录的技巧极为混乱。这不是您问题的精确答案,但是通常来说,如果您需要制作特定于Loop的模板标签,并使用get_posts()您可以模拟如下所示的Loop来处理返回的数组:

$stories = get_posts(); 

foreach ($stories as $post) {

    setup_postdata($post);

    // stuff
}
wp_reset_postdata();

那么wp_reset_query()呢??
2012年

1
@cwd,如果仅使用setup_postdata()全局查询不受影响,并且仅需要重置发布数据。
拉斯特(Rarst)2012年

与将帖子存储在另一个var中并重新查询另一个帖子以使其全局化相比,此解决方案分配器更干净。+1
Barry Kooij 2013年

谢谢@Rarst帮助了我。添加setup_postdata($ post); 解决了我的问题
Simon

8

从3.3.0开始有一个新功能:wp_trim_words

我在循环外使用它,如下所示:

 <?php if ( $post_id ) {
 $post = get_post( $post_id );
 if ( $post ) { ?>
     <h2><?php echo $post->post_title; ?></h2>
     <p><em><?php echo wp_trim_words( $post->post_content ); ?></em></p>
     <p><strong>This article can only be read by subscribers.</strong></p>
 <?php } } ?>

这不要与wp_trim_excerpt混淆,后者显然只在循环内起作用,因为它在内部调用the_content()。


6

只是增加了MikeSchinkel的答案,出于某种原因,这对我不起作用。我必须添加setup_postdata行才能使其正常运行。

function get_the_excerpt( $post_id ){

  global $post;  
  $save_post = $post;
  $post = get_post($post_id);
  setup_postdata( $post ); // hello
  $output = get_the_excerpt();
  $post = $save_post;
  return $output;

}

我假设如果您正在循环外使用它,那么它不应干扰正在进行的其他setup_postdata。

干杯


我尝试了MikeSchinkel的答案,但它对我没有用。设置发布数据可以解决问题。在我没有'setup_postdata'的情况下,该函数返回了父帖子的title +摘录。
turzifer

2

以@Maxime的答案为基础,这行得通吗?

$post = get_post( $id );

$excerpt = ( $post->post_excerpt ) ? $post->post_excerpt : $post->post_content;

对我来说似乎很直截了当,但是我想知道我是否缺少某些东西。


1

如果所有帖子都带有<!--more-->标签,则可以在上面的代码中使用以下代码:

$sjc_excerpt = explode( '<!--more-->', $post->post_content); 
echo wpautop( $sjc_excerpt[0] );

当然,如果您有任何没有<!--more-->标签的帖子,它们将完整显示。在我的情况下有效,但并非所有人都...


1

我认为get_the_excerpt()这是传统设计的功能。随着WordPress使用量的增长,有许多较新的用例不适合使用,但适用于获取不同数据的较新功能。一个例子是现在经常使用$args一系列功能选项。

但是很容易满足您的需求。您可以使用以下替代功能,将该功能放在主题functions.php文件中的任何位置:

function robins_get_the_excerpt($post_id) {
   global $post;  
   $save_post = $post;
   $post = get_post($post_id);
   $output = get_the_excerpt();
   $post = $save_post;
   return $output;
}

只是增加了MikeSchinkel的答案,出于某种原因,这对我不起作用。我必须添加setup_postdata行才能使其正常运行。


是否需要wp_reset_post_data()在循环内工作?
克里斯·平克

显然(绕过这栋特殊的房子之后)现在已成为核心部分。
克里斯·平克

0

我使用wp_trim_words经常使用这两种语言。我不断发现自己需要缩写,并且在循环之外阅读了更多功能。其他人可能会发现这很有用。这就是我用来:

  1. 通过POST ID获取摘录
  2. 获取帖子内容如果未设置摘要,
  3. 设置节选的字长
  4. 选择内容以阅读更多内容(链接/文本)

我将此行直接放入正在编辑的自定义模板中。

    //Get Post Object
    $dapost = get_post(POST_ID);              
    //Get the Execerpt
    $my_excerpt = wp_trim_words( apply_filters( "the_excerpt", get_the_excerpt($dapost) ? get_the_excerpt($dapost) : $dapost->post_content  ), "20", "<a href='$dapost->guid'> ".__('Get More Stuff', 'translation')."</a>" );

分解

1,摘录内容

按帖子ID获取摘录,但如果未设置摘录,则获取帖子内容。

我正在使用If / Else PHP速记

    $dapost = get_post(POST_ID);    
    apply_filters( "the_excerpt", get_the_excerpt($dapost) ? get_the_excerpt($dapost) : $dapost->post_content

2.字长

将摘录中的单词数设置为20

    "20"

3.选择阅读更多内容(链接/文本)

   "<a href='$dapost->guid'> ".__('Get More Stuff', 'translation')."</a>"

我过去常常$dapost->guid获取URL,因为我不需要友好的URL,并且想避免再次调用数据库。您可以始终使用get_the_permalink。

请参阅Wordpress文档中的wp_trim_words


0

这对我有用:

$excerpt = apply_filters('the_excerpt', get_post_field('post_excerpt', $post_ide));


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.