この記事は最後に更新してから1年以上経過しています。

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では投稿日を表示する手段をいくつか提供しており、それらについても選択肢として覚えておくといいだろう。


最終更新 : 2011年12月20日 10:09


お勧め

wp_get_attachment_image(2018年5月27日 更新)

string wp_get_attachment_image( int $attachment_id [ , mixed $size = 'thumbnail' [ , bool $icon = false [ , mixed attr = '' ] ] ] )
アタッチメント情報のHTMLテキストを取得する。

get_parent_theme_file_path(2018年5月27日 更新)

string get_parent_theme_file_path( string $file = '' )
親テーマ内にあるファイルのパス名を取得する。

get_post_format_slugs(2011年9月12日 更新)

string get_post_format_slugs( )
投稿フォーマットのスラッグ一覧を取得する。

get_status_header_desc(2018年5月27日 更新)

string get_status_header_desc( int $code )
HTTPステータス説明文を取得する。

get_network_option(2018年5月27日 更新)

mixed get_network_option( int $network_id, string $option [ , mixed $default = false ] )
ネットワークオプション(サイトオプション)を取得する。