ISOの日付形式に基づいてイベントのリストを表示するために使用するカスタム書き換え規則とquery_vars
を登録しました。たとえば、ユーザーがhttp://site.com/by-date/2013-04-04/
というURLを要求した場合、私のquery_var
は日付部分で、meta_key
の_event_scheduled_date
がquery_var
のISO日付値と等しいイベントのリストを表示したいのですが。
私が$query
のpre_get_posts
を修正するために以下のコードを試みる時はいつでも、WordPressは404を開始し、投稿は何も問い合わせられません。私はpre_get_posts
を使って他の分類リストやアーカイブページを操作することができましたが、私が作成したカスタムのquery_var
で正しく動作させることはできました。
function rewrite_rule_by_date() {
add_rewrite_rule('(by\-date)/([0-9]{4}\-[0-9]{2}\-[0-9]{2})$', 'index.php?pagename=$matches[1]&event_date=$matches[2]', 'top');
}
add_action( 'init', 'rewrite_rule_by_date' );
function query_var_by_date() {
add_rewrite_tag( '%event_date%', '([0-9]{4}-[0-9]{2}-[0-9]{2})');
}
add_action( 'init', 'query_var_by_date' );
function custom_event_query( $query ) {
if ( is_page( 'by-date' ) && get_query_var( 'event_date' ) && is_main_query() ) {
$query->set( 'post_type', 'event' );
$query->set( 'post_status', 'publish' );
$query->set( 'meta_key', '_event_scheduled_date' );
$query->set( 'orderby', 'meta_value' );
$query->set( 'order', 'ASC' );
$query->set( 'post_per_page', -1 );
$meta_query = array(
array(
'key' => '_event_scheduled_date',
'value' => get_query_var( 'event_date' ),
'type' => 'DATE',
'compare' => '='
)
);
$query->set( 'meta_query', $meta_query );
}
return $query;
}
add_filter( 'pre_get_posts', 'custom_event_query' );
by-date
ページに一致するすべてのイベントを表示しようとする代わりに、?post_type=event
を通して次のように表示することを試みることができます。
function rewrite_rule_by_date() {
add_rewrite_rule('by\-date/([0-9]{4}\-[0-9]{2}\-[0-9]{2})$', 'index.php?post_type=event&event_date=$matches[1]', 'top');
}
add_action( 'init', 'rewrite_rule_by_date' );
function query_var_by_date() {
add_rewrite_tag( '%event_date%', '([0-9]{4}-[0-9]{2}-[0-9]{2})');
}
add_action( 'init', 'query_var_by_date' );
function custom_event_query( $query ) {
if ( get_query_var( 'event_date' ) && is_main_query() ) {
$query->set( 'post_type', 'event' );
$query->set( 'post_status', 'publish' );
$query->set( 'meta_key', '_event_scheduled_date' );
$query->set( 'orderby', 'meta_value' );
$query->set( 'order', 'ASC' );
$query->set( 'post_per_page', -1 );
$meta_query = array(
array(
'key' => '_event_scheduled_date',
'value' => get_query_var( 'event_date' ),
'type' => 'DATE',
'compare' => '='
)
);
$query->set( 'meta_query', $meta_query );
}
return $query;
}
add_filter( 'pre_get_posts', 'custom_event_query' );
これは私のWordpressの3.5.1
インストールで、デフォルトのTwenty Twelveテーマで、次のようなURLで動作します。
http://example.com/by-date/2013-04-04/