问题描述

我有自定义帖子类型”press.” 并且做了页面模板的类型的查询帖子。这些帖子应该显示其发布的日期,但如果同一日期有多个帖子,则只有第一个帖子显示日期,而其他帖子不显示。有没有办法显示每个帖子的日期?

<?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%20the_field('link');%20?>"><?php the_post_thumbnail('medium');?></a> </div>
<div class="press-content">
<div class="press-title"><a href="<?php%20the_field('link');%20?>"><?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(); ?>

最佳解决方案

我以前遇到类似的问题,因为我修改了我的日期功能。然后帖子显示日期,如果只有每个帖子有不同的日期,否则返回空白。

尝试添加<?php echo get_the_date(); ?>

次佳解决方案

为什么不显示?

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

global $currentday, $previousday;

然后有一个规则,如果有一个日期显示… 或不。检查类似于使用 is_new_day()完成的检查:

if ( $currentday != $previousday ) {

    // show date

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

您可以看到,$previousday 立即设置为 $currentday; 。所以它得到 echo-ed 一次。在这之后,两天都是一样的,检查将失败。这就是为什么你的第一篇文章显示它,但其他人不显示它的原因。

为什么会显示?

如果你问自己为什么它会显示多个日期,在全球化得到平衡后,你将不得不看看 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()可以正常工作,如何使用它

它不受 the_date()函数中的 if /else(全局检查) 的影响。它也没有过滤器。如何解决?简单:

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

这将添加到 the_date 过滤器的任何回调到您的自定义输出。它也使用默认的 date_format 选项设置作为默认值 – 也由 the_date()使用。它也避免了任何 beforeafter 的功能,与 the_date()功能完全相同。

第三种解决方案

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

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

来自 Codex 的 link 解释了 the_date 的工作原理比我好多了。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。