イベント機能を備えたWPサイトを構築しています。イベントページはカスタム投稿タイプで作成されました。
私は人々が日付でイベントを検索/フィルタリングすることを可能にしたいです。たとえば、2011年12月2日から2012年3月1日までの間に発生したすべてのイベントを検索し、12月から3月の間に日付があるイベント(12月、1月、2月、3月)から結果を取得できます。
これに取り組むための最良の方法を知りたいです。何か案は?
このページの「日付でイベントを検索」機能を見ることで、私が達成したいことの例を見ることができます http://www.londontown.com/events
それが不可能な場合は、12月から2月のように、特定の月の間に発生したイベントを検索する方法はありますか(日を除く)。
前もって感謝します。
これを実現するために必要なことが2つあります。
1)各イベントのデータのメタデータを作成します
2)meta_queryを使って投稿を問い合わせる
#1では、ユーザーがイベントの日付を追加できるようにするメタボックスを追加する必要があります。このデータはadd_post_meta
またはupdate_post_meta
を使ってメタデータとして保存されるべきです。メタデータの追加方法について詳しくない場合は、メタデータの追加について読むことをお勧めします。
http://codex.wordpress.org/Function_Reference/add_meta_box http://www.wproots.com/complex-meta-boxes-in-wordpress/
#2の場合、日付の値を注文可能な方法で保存したと仮定して(たとえば、YYYY-MM-DD)、適切な日付範囲を取得するためにWP_Queryの新しいインスタンス内のmeta_queryパラメータを使用できます。このメソッドはあなたのmeta_keyが "_my-datetime-from"であると仮定します。たとえば、2011年10月と11月に投稿された投稿は、次のようになります。
// Set arguments for events
$start = '2011-11-31';
$end = '2011-10-01';
$args = array(
'post_type' => 'my-event-type',
'posts_per_page' => -1,
'orderby' => 'meta_value',
'order' => 'ASC',
'meta_key' => '_my-datetime-from',
'meta_query' => array(
array(
'key' => '_my-datetime-from',
'value' => array($start, $end),
'compare' => 'BETWEEN',
'type' => 'DATE'
)
)
);
// Make the query
$events_query = new WP_query();
$events_query->query($args);
イベントの日付をどのように格納しますか:投稿のデフォルトのpost_date
フィールドまたはカスタムメタフィールドを使用しますか?
デフォルトのpost_date
を使用している場合は、検索条件を追加するためにフィルタposts_where
を使用できます。
// Create a new filtering function that will add our where clause to the query
function filter_where( $where = '' ) {
// posts for March 1 to March 15, 2010
$where .= " AND post_date >= '2010-03-01' AND post_date < '2010-03-16'";
return $where;
}
add_filter( 'posts_where', 'filter_where' );
$query = new WP_Query( $query_string );
remove_filter( 'posts_where', 'filter_where' );
他の例については、 Codex をチェックしてください。
カスタムフィールドを使用する場合、私はあなたがあなた自身のカスタムMySQLクエリを書かなければならないと思います。もう少し複雑です。これが例です:
global $wpdb;
$post_ids = $wpdb->get_col( "
SELECT ID FROM {$wpdb->posts}
JOIN {$wpdb->postmeta}
WHERE ID=post_id
AND meta_key='your_custom_meta_key'
AND meta_value >= '2010-03-01'
AND meta_value < '2010-03-16'
" );
foreach ( $post_ids as $post_id ) {
$post = get_post( $post_id );
// Do something
}
wp_reset_postdata();