WordPressに限った内容ではなくPHPそのものに言える話ですが、日付の比較についてです。
記事の投稿日、更新日を比較して何かしたい、そんなプログラムを書きたいときがあるのではないでしょうか。「更新情報一覧」みたいな機能に使えたりしますね。
この日付の比較方法として、自分が引っかかった点をメモしておきます。
PHPで日付を比較する
まず、自分がやっていた日付の比較例です。以下は更新情報一覧を自動表示するプログラムの処理を部分的に切り出しています。
<?php
$is_modified = get_the_modified_date() > get_the_date() ? true : false;
$update_word = $is_modified ? 'のページを更新しました。' : 'のページを公開しました。';
記事の更新日が投稿日より未来なら「ページを更新しました」とし、更新されていなければ「ページを公開しました」とテキストを変更。更新日はget_the_modified_date()
で、投稿日はget_the_date()
で取得し、それを三項演算子で比較して処理しています。
ただ、上記の方法だと正常な比較結果が得られない場合があります。例えば以下のような日付の場合です。
<?php
// 比較する日付をダンプします。
var_dump(get_the_modified_date());
var_dump(get_the_date());
var_dump(get_the_modified_date() > get_the_date());
// ダンプ結果
string(16) "2015年4月17日"
string(15) "2015年4月9日"
bool(false)
と、本来であれば4月17日の方が4月9日より未来なのに、比較結果が「false」になってしまっています。
どうしてこのような比較結果になるのか、正直に申し上げると原因を論理的に説明できるほど調べていません(調べなくても解決できてしまったので…)。文字数の差で比較しているのであればtrueになるハズですが、そうでもないようです。
ダンプ結果では「ゼロパディングされていない日付が原因で文字数に差が出ている」という点が見られます。雑ですがゼロパディングされていないのが原因だろう、と結論を推測しました。(もしかしたら漢字も関係ある…かも?)
正確な日付の比較方法
というわけで、比較する場合はゼロパティングする日付フォーマット「‘Ymd’」を引数として日付取得関数に渡してやります。
<?php
$is_modified = get_the_modified_date( 'Ymd' ) > get_the_date( 'Ymd' ) ? true : false;
$update_word = $is_modified ? 'のページを更新しました。' : 'のページを公開しました。';
こうすることで、正確に日付を比較できます。ダンプ結果はこちらですね。
<?php
echo '<pre>';
var_dump(get_the_modified_date( 'Ymd' ));
var_dump(get_the_date( 'Ymd' ));
var_dump(get_the_modified_date( 'Ymd' ) > get_the_date( 'Ymd' ));
echo '</pre>';
?>
string(8) "20150417"
string(8) "20150409"
bool(true)
漢字もなくなりましたし、同じサイズですし、数字だけなので(文字列ですが)機械には優しい比較対象となったのではないでしょうか。
そんなこんなで、日付の比較時に関する注意点でした。