问题描述
我有自定义帖子类型”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()
使用。它也避免了任何 before
和 after
的功能,与 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。