イベント開催予定日のカレンダーを作成するヒント

イメージとしてはカスタムフィールドで独自にイベントの開催日時を設定し、それを基準としたイベントカレンダーを作成したい場合。需要があるかどうかは判りませんが、一応記しておきます。

 

カスタムフィールドの設定にはカスタムフィールドテンプレートなどを利用すれば誤動作が格段に減ると思います。

(カスタムフィールドテンプレートの設定例)
[開催日]
type = textfield
date = true
dateFormat = yyyy-mm-dd
readOnly = true

WordPressのテンプレートタグは(多分)投稿日しか条件設定が出来ないと思うので、カスタムフィールドを基準にデータを取得するにはSQLが必要だと思います。

以下、カスタムフィールドで設定した日付を基準に記事IDを取得するSQLです。

[php]
global $wpdb;
$day = “2010-5”; // 2010年5月の予定日を取得
$key = “開催日”; // カスタムフィールドの名前が「開催日」とする

// 2010年5月に予定されている開催日と記事IDを取得
$results = $wpdb->get_results(
“SELECT post_id, DATE_FORMAT(meta_value, ‘%e’) AS date ”
. “FROM $wpdb->postmeta ”
. “WHERE meta_key=’$key’ AND DATE_FORMAT(meta_value, ‘%Y-%c’)=’$day’ ”
. “ORDER BY date”);

foreach($results as $result) {
// 処理
echo $result->date.’日 [ post_id -> ‘.$result->post_id.’ ]
‘;
}

[/php]

SQLに関しては自己責任で。もっとスマートな書き方があれば教えてください。

同じ日付で2つイベントがある場合には対応していませんので、そういう場合はもう少し改造が必要だと思います。

 

これでカスタムフィールドに設定した値から特定の月の予定日を全て取得できますので、「処理」のところでお好きなようにしてやれば色々幸せになれると思います。

 

次にカテゴリーで更に絞り込む場合です。
イメージとしては「出演者ごとにイベント予定カレンダーを表示したい」場合など。
出演者ごとにカテゴリーを割り振ったとして、以下のようにすれば取得できます。

[php]
global $wpdb;
$day = “2010-5”;
$key = “開催日”;
$cat_id = “3”; // カテゴリーID

$results = $wpdb->get_results(
“SELECT pm.post_id, DATE_FORMAT(pm.meta_value, ‘%e’) AS date ”
. “FROM $wpdb->term_relationships tr LEFT JOIN $wpdb->postmeta pm ON tr.object_id = pm.post_id ”
. “WHERE pm.meta_key=’$key’ AND DATE_FORMAT(pm.meta_value, ‘%Y-%c’)=’$day’ AND tr.term_taxonomy_id=$cat_id ”
. “ORDER BY date”);

foreach($results as $result) {
// 処理
echo $result->date.’日 [ post_id -> ‘.$result->post_id.’ ]
‘;
}
[/php]

これで特定の出演者(カテゴリー)のみの予定日を出せます。

もし間違っていたりしたら指摘していただけると嬉しいです。