気ままに

プログラム関連で困ったことを調べて気ままに投稿

カスタムフィールドを使った日付ごとの表示変更方法[WordPress]

前回の投稿でもお伝えした通り、最近WordPressを触っているので、困ったことなどを記載していこうと思ってます。

カスタムフィールドを使った処理は、functions.phpなどに処理を追加するのは、PHPを分からない人などには、とても大変です。
そこで、今回使ったプラグインは、Custom Field Template (カスタムフィールドテンプレート)プラグイン です。
ダウンロードは無償ですが、サポートを受けるためにはサポート料金を支払う必要があります。
そのため、プラグインの詳しい説明は避けようと思います。

設定については、KoToRi:Blog 「Custom Field Templateの使い方[WordPress]」を参考にさせてもらいました。


カスタムフィールドの取得方法

カスタムフィールドテンプレートで、下記の方法で公開日などを設定した場合

[event_date]
label = イベント開催日
type = text
size = 35

テンプレートでは、post_customを使って取得することが可能です。

<?php
$event_date = post_custom('event_date');
?>

カスタムフィールドの日付判定

カスタムフィールドで取得した日付は、「テキスト」型となっているので、日付ごとに表示する内容を変更したい場合、工夫が必要です。
※ 特に日付に日本語(年、月、日)などが入っている場合は、PHPstrtotime() 関数の引数として使えまん。

そこで、正規表現で該当の日付部分(下記の例では「2014年03月04日」というフォーマットを前提にしています。)を抜き出して、「2014/03/04」という形にします。

functions.php (共通の関数として作成)

<?php
function normalizeTime($date_str) {
    // 年月日の各パーツを分割する
    preg_match( "/([0-9]*)年([0-9]*)月([0-9]*)日/", $date_str, $data );
    if ( Count( $data ) != 4 ) {
        return $str;
    }
 
    // 先頭0埋めでYYYYMMDD形式の日付文字列に変換する
    $outStr = sprintf( "%04.4d/%02.2d/%02.2d", $data[1], $data[2], $data[3] );
 
    return strtotime($outStr);
}
?>


イベント開催日を過ぎていたら(イベント開催日は終了とする場合)、「イベントは終了しました」を表示して、イベント開催前の場合、「イベント開催日:2014年03月04日」を表示する。

<?php
// カスタムフィールドを取得する
$event_date = post_custom('event_date');
// 日付の文字列を「20140年03月04日」から「2014/03/04」に変換
$event_date_time = date_i18n('Ymd', normalizeTime($event_date));

// イベント当日を含めない
// イベント当日を含める場合は、「>」を「>=」に変更
if (date_i18n('Ymd') > $event_date_time) {
  echo "イベントは終了しました。";
} else {
  echo "イベント開催日:" . esc_html($event_date);
}
?>

カスタムフィールドの値から一覧を表示

カスタムフィールドの値を元に一覧を取得する場合、get_posts() 関数を使います。
こちらのサイトを参考にさせてもらいました。

イベント開催日を過ぎていないイベントの一覧を取得します。

<?php
$today_date = date_i18n( 'Y年m月d日' );
$args = array(
	'meta_query' => array(
		array(
			'key' => 'event_date',
			'value' => $today_date,
			'compare' => '>',
			'type' => 'DATE'
		)
	)
);
$output = '';
query_posts( $args );
if ( have_posts() ) :
	while ( have_posts() ) : the_post();
		// カスタムフィールドを取得する
		$event_date = post_custom('event_date');
		the_title();
		echo "イベント開催日:" . esc_html($event_date);
	endwhile;
	wp_reset_query();
else :
	// イベントがない場合の処理
	echo 'イベント情報がありません';
endif;
?>

注意が必要なのは、今日の日付を取得する処理でPHPの標準関数date()を使わずにWordPressの関数date_i18n()を使っているところです。
date()を使って日付を取得すると、間違った日付を取得することがあるそうです。(原因については、どこかで記事を見ただけで調べていません)

また、引数も注意が必要です。一般的には「Y/m/d」を指定していますが、カスタムフィールドはtext型で日付のフォーマットに年月日が含まれています。比較するのに日付のフォーマットを一致させる必要があるため「Y年m月d日」と指定する必要があります。

今日はここまで、やっと調べる時間が短くなってきましたが、まだまだですね。
WordPressについて、まだ書きたいことがるので、時間見つけて書いていこうと思います。


2014/3/15 エスケープ処理を追加しました。


本格ビジネスサイトを作りながら学ぶ WordPressの教科書

本格ビジネスサイトを作りながら学ぶ WordPressの教科書

WordPress レッスンブック 3.x対応

WordPress レッスンブック 3.x対応