前回の投稿でもお伝えした通り、最近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'); ?>
カスタムフィールドの日付判定
カスタムフィールドで取得した日付は、「テキスト」型となっているので、日付ごとに表示する内容を変更したい場合、工夫が必要です。
※ 特に日付に日本語(年、月、日)などが入っている場合は、PHPのstrtotime() 関数の引数として使えまん。
そこで、正規表現で該当の日付部分(下記の例では「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の教科書
- 作者: プライム・ストラテジー株式会社
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2012/03/30
- メディア: 大型本
- 購入: 7人 クリック: 299回
- この商品を含むブログ (12件) を見る
- 作者: エビスコム
- 出版社/メーカー: ソシム
- 発売日: 2010/09/08
- メディア: 単行本
- 購入: 17人 クリック: 535回
- この商品を含むブログ (36件) を見る