問題描述

我有自定義帖子類型”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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。