同じ日付の別の投稿がある場合、投稿に日付が表示されません


19

カスタムの投稿タイプ「プレス」があります。そのタイプの投稿をクエリするページテンプレートを作成しました。投稿には公開日が表示されるはずですが、同じ日付の投稿が複数ある場合、最初の投稿のみが日付を表示し、他の投稿は表示しません。すべての投稿の日付を表示する方法はありますか?

ここに画像の説明を入力してください

<?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(); ?>

回答:


40

日付関数を変更したため、過去に同様の問題に直面しました。そして、各投稿の日付が異なる場合は投稿に日付が表示され、そうでない場合は空白が返されました。

<?php echo get_the_date(); ?>代わりに追加してみてください。


26

なぜ表示されないのですか?

the_date()関数のソースを見ると、2つのグローバルに気付くでしょう。

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()、それを正しい方法で使用するか

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()機能。


1
ありがとう、カイザー。これが、日付の印刷に失敗することがある理由を説明しています。どうもありがとう。
ロバート色相14年

1
非常に包括的な説明。受け入れられた答えよりも良い。
ニランバルシャルマ14年

1
@Nilambar受け入れられた答えはtl; drバージョンであり、完全に素晴らしいです:)
kaiser 14年

この@kaiserを掘り下げるための小道具-このような
ありふれた

1
この回答は、WPドキュメントの説明よりも優れています。
イアン

10

使用せずthe_date()、代わりに使用しますthe_time()

the_dateは日付のみを返し、the_timeは日付+時刻を返します。the_dateループで使用されたときにwordpressが複数の日付を返さない理由はわかりません。しかし、それは値が同じという事実に関係しています。the_time値を使用した場合、決して同じではないため、常に値が返されます。だからあなたは次のようなものを印刷することができます<?php the_time('F j, Y'); ?>

コーデックスからのこのリンクは、the_dateが私よりもはるかに優れていることを説明しています。


1

強引にそれを。

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

私のために働いて、それが同じ日付であるかどうかに関係なく、各投稿の完全な日付、時間を表示します。


0

それは日記がどのように機能するかという理由で、一度だけ表示されます。上部に日付が表示され、その下にエントリを書き込みます。このコードを使用して、the_timeを使用して各投稿の日付を表示します。

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

詳細については、ここでチュートリアルを書いた:WordPressのthe_date()関数が最初の投稿で一度しか表示されない理由


独自の製品/ブログを宣伝したい場合は、所属を開示する必要があります。そうしないと、回答がスパムとして報告される場合があります。スパマーにならない方法を
-DavidPostill
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.