the_date関数で投稿日を確実に表示する

the_date関数で投稿日を確実に表示する - みんな一度は悩んだことがあるのでは?

説明

投稿記事の投稿日時を表示する際、the_date関数を使用することが多いだろう。このthe_date関数はphpのdate関数と同じパラメータを指定することで、好みの日時フォーマットで投稿日時を表示できるのだが、ある条件の場合に投稿日時を表示しない。最初にこの現象に遭遇したときは、ちょっと悩まされた。
忘れたころに引っかかる

the_date関数を使用する場所としては、トップページや検索ページ、アーカイブページなどのループ処理がある。

<?php
while ( have_posts() ) {
	the_post();
?>

<?php the_date(); ?>

<?php
}
?>

投稿日時が表示されない条件とは、複数の投稿記事を表示する際に現在の投稿記事の投稿日が1つ前の投稿記事と同じ場合である。このような使用になっているのは、WordPressをブログとして利用する際、一日に何度も投稿した記事に毎回投稿日時を表示することを嫌ったためだろう。

このこと自体は合理的な仕様だと思うのだが、サイトによっては毎回必ず表示したいケースがあることも事実である。

次にthe_date関数を呼ぶ前に○○する

the_date関数で同じ投稿日時を連続して表示しないのは、この関数内でグローバル変数の$currentday$previousdayを比較し、同じ場合は表示しないとなっている。$currentdayは、the_post関数内でsetup_postdata関数を呼び出し投稿記事の投稿日を格納している。また、$previousdayはthe_date関数内で投稿日時を表示する直前に$currentdayの内容を$previousdayに格納している。このことから、ループ内で次にthe_date関数を呼び出す前に$currentdayの内容を変更することで、確実に投稿日時を表示できるようになる。

具体的には、次のように指定すればいい(ここではthe_post関数の直後に指定している)。

<?php
global $previousday;
while ( have_posts() ) {
	the_post();
	$previousday = '';
?>

<?php the_date(); ?>

<?php
}
?>

同じことは、the_post関数から呼び出されるsetup_postdata関数で実行されるthe_postアクションや、the_date関数のthe_dateフィルターを使って対応可能である。the_postアクションを使用する場合なら、次の内容を自テーマのfunctions.phpに次のように記述すればいい(アクション関数名は自テーマのネーミングルールに合わせて適当な名前に変更すること)。

add_action( 'the_post', 'mytheme_the_post' );
function mytheme_the_post() {
	global $previousday;
	$previousday = '';
}

テンプレートファイルに「$previousday = '';」を記述する場合と比較すると、こちらの方がソースコードがすっきりするし、functions.phpを修正するだけなので手間がかからない。

the_time関数やget_the_date関数を使う

さて、本記事のタイトルとは主旨が変わってしまうのだが、the_date関数を使わずに投稿日を表示できるので、最後に触れておこう。

1つ目は、下記のようにthe_time関数を利用する方法である。

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

get_option関数を使って「一般設定」で指定している日付フォーマットを取得し、そのフォーマットで投稿日を表示している。この方法で注意することは、the_time関数ではthe_timeフィルターを実行するため、そのフィルターを使用したプラグインを使用している場合、意図した表示にならない可能性があることだ。

もう1つ目は、下記のようにget_the_date関数を利用する方法である。

<?php echo get_the_date(); ?>

get_the_date関数はthe_date関数から直接呼び出されている下位レベルの関数であり、the_date関数に指定する日付フォーマットをそのまま使用できるので、置き換えも容易だろう。

投稿日を必ず表示するという目的において、既存のテーマでthe_date関数を使っているならば、the_postアクションで対応する方法を個人的にはお勧めする。ただ、WordPressでは投稿日を表示する手段をいくつか提供しており、それらについても選択肢として覚えておくといいだろう。

関連

お勧めコンテンツ

get_term_link(2011年5月27日 登録)

string get_term_link( mixed $term [ , string $taxonomy = '' ] )
カテゴリーや投稿タグなどのタクソノミーのリンク文字列を取得する。

wp_nav_menu(2010年6月8日 登録)

string wp_nav_menu( [ array $args = array() ] )
ナビゲーションメニューを表示する(パラメータ'echo'がtrueの場合)。パラメータ'echo'がfalseの場合は、ナビゲーションメニューの文字列(HTMLコード)を返す。

get_default_feed(2012年2月7日 登録)

string get_default_feed()
デフォルトのフィードタイプを取得する。

wp_get_nav_menus(2014年12月25日 登録)

array wp_get_nav_menus( [ array $args = array() ] )
すべてのナビゲーションメニュー情報を取得する。

is_single(2009年11月12日 登録)

bool is_single( [ mixed $post = '' ] )
要求されているページが、投稿か調べる。

最終更新日時 : 2011-12-20 10:09