我有自定义帖子类型“新闻”。并制作了一个页面模板以查询该类型的帖子。这些帖子应该显示其发布日期,但是如果有多个具有相同日期的帖子,则仅第一篇帖子显示日期,而其他帖子则不显示。有没有一种方法可以显示每个帖子的日期?



<?php get_header(); ?>
<?php
$wp_query = new WP_Query();
$wp_query -> query('post_type=press&showposts=100');
while ($wp_query->have_posts()) : $wp_query->the_post(); ?>
<div id="press">
<div class="press-item cf">
<div class="press-img"><a href="<?php the_field('link'); ?>"><?php the_post_thumbnail('medium');?></a> </div>
<div class="press-content">
<div class="press-title"><a href="<?php the_field('link'); ?>"><?php echo get_the_title(); ?></a> </div>
<div class="press-excerpt"><?php the_excerpt(); ?> </div>
<div class="press-date"><?php the_date(); ?></div>
</div>
</div>
</div>
<?php endwhile;  ?>
<?php get_footer(); ?>


#1 楼

我过去曾遇到过类似的问题,因为我修改了日期函数。
然后如果只有每个帖子具有不同的日期,则帖子将显示日期,否则返回空白。 />

#2 楼

为什么不显示?

查看the_date()函数的源代码时,您会注意到两个全局变量:

global $currentday, $previousday;


那么就有规则显示是否要显示日期...。该检查类似于使用is_new_day()进行的检查:

if ( $currentday != $previousday ) {

    // show date

    // Set global
    $previousday = $currentday;
}
// else
return null;


如您所见,$previousday立即设置为$currentday;。因此,它会回声一次。在那之后,这两天都是一样的,检查将失败。这就是为什么您的第一篇文章显示它的原因,而其他人却不显示它。

为什么显示它?

如果您问自己为什么它显示的内容超过一个日期,在全局变量获得均衡之后,您将不得不看看setup_postdata()。该函数由the_post();调用,负责为循环中的单个帖子设置所有内容。

if ( have_posts() )
{
    while ( have_posts() )
    {
        the_post(); # <-- Calls setup_postdata( $post );

        // your loop stuff here
    }
}


setup_postdata()的内部结构很容易理解(至少到设置全局变量的位置):

$currentday = mysql2date('d.m.y', $post->post_date, false);
$currentmonth = mysql2date('m', $post->post_date, false);


所以运动的部分是$previousday,对它设置并检查了$currentday全局变量。除非有新的一天,否则the_date()将不会显示任何内容。

只需将您的帖子设置为完全不同的日期,突然您就会看到日期出现在每个帖子上。



实际上,这个想法很简单,并且从v0.7.1开始就存在-至少这是phpDocBlock所说的:为什么要在存档中显示每个帖子的日期? ?存档看起来像这样:

+--------------+
| 28.10.2014   |
+--------------+
| Post Title A |
| Post Title B |
+--------------+
| 29.10.2014   |
+--------------+
| Post Title C |
| Post Title D |
+--------------+


您不同意吗?好吧,那么您只是在使用一个本来应该完全不同的函数。通过get_the_date()函数中的if / else(全局检查)。它还没有过滤器。如何解决?简单:

echo apply_filters( 'the_date', get_the_date(), get_option( 'date_format' ), '', '' );


这会将附加到the_date()过滤器的所有回调添加到您的自定义输出中。它还将默认的the_date选项设置用作默认设置-date_format也使用该设置。而且它避免了任何the_date()before值-再次与after函数完全相同。

评论


谢谢凯撒。这就解释了为什么有时无法打印日期。非常感谢。

– Robert hue
2014年10月29日,下午1:58

非常全面的解释。比接受的答案更好。

– Nilambar Sharma
14-10-29在3:43

@Nilambar可接受的答案是tl; dr版本,非常好:)

– kaiser
14-10-29在3:48



深入探讨这个@kaiser的道具-在如此平凡的问题上比我期望的要深入

–赛龙
16-10-13在0:02

这个答案比WP docs的解释更好。

–伊恩
17-4-9在22:19



#3 楼

不要使用the_date(),而要使用the_time()

the_date仅返回日期,the_time返回日期+时间。我不知道在循环中使用the_date时wordpress不会返回多个日期的原因。但它与值相同的事实有关。如果使用the_time,则该值永远不会相同,因此它将始终返回该值。因此,您可以打印类似<?php the_time('F j, Y'); ?>的内容

来自法典的链接,解释了the_date如何比我更好地工作。

#4 楼

蛮力的。

<?php the_time('F j, Y'); ?> - <?php the_time(); ?>


为我工作,无论日期是否相同,都显示每个帖子的完整日期和时间。

#5 楼

它只显示一次,因为这是日记的工作方式。它会在顶部显示日期,并且您会在其下方写下您的条目。我使用此代码通过the_time显示每个帖子的日期。

<?php the_time(get_option('date_format')); ?>


有关更多信息,我在此处编写了一个教程:为什么在WordPress中使用the_date()函数在第一篇文章中只显示一次

评论


请注意,如果您要推广自己的产品/博客,则必须披露您的隶属关系,否则您的答案可能被标记为垃圾邮件。请阅读如何成为垃圾邮件发送者

– DavidPostill
17年4月9日在11:32