この質問は私がすでに実用的な答えを得たこの 質問 と強く関連しています。
私は "wr_event"という名前のカスタムポストテンプレートと "event_type"という名前のカスタム分類を持っています。
この「イベント投稿」には、イベントの日付を設定するメタボックスがあり、これを使っています…
function change_order_for_events( $query ) {
//only show future events and events in the last 24hours
$yesterday = time() - 24*60*60;
if ( $query->is_main_query() && is_tax('event_type') ) {
$query->set( 'meta_key', '_wr_event_date' );
$query->set( 'orderby', 'meta_value_num' );
$query->set( 'order', 'ASC' );
$query->set( 'meta_value', $yesterday );
$query->set( 'meta_compare', '>' );
}
}
add_action( 'pre_get_posts', 'change_order_for_events' );
…すべての「イベント投稿」をそのイベント日付でソートする。
これはうまく機能し、私が望むことを正確に実行します。
今のところうまくいかないのは私が同じ効果を発揮させたい「archive.php」だけです。
私は私のcustom-post-templateに'has_archive' => 'events'
を追加しました。 /events
は私の "archive.php"ファイルを表示します。ここで私はすでに私の見出しにis_post_type_archive('wr_event')
を使っています。
しかし、私は私のアーカイブされたイベントも正しい日付順にして欲しいのです。それでchange_order-for_events()
の上の同じ関数は私の "archive.php"テンプレートで動作するはずです。もちろんこの場合、関数はすでに起こっている古いイベントだけを表示するべきです。
どのように私はそれをすることができましたか?
更新:私は MetaBoxとCustomFieldsクラスでタイムスタンプを格納しています
$meta_boxes[] = array(
'id' => 'event_date',
'title' => 'Event Date',
'pages' => array( 'wr_event', ),
'context' => 'normal',
'priority' => 'high',
'fields' => array(
array(
'name' => 'Event Date Picker',
'desc' => 'The date the event takes place',
'id' => $prefix . 'event_date',
'type' => 'text_date_timestamp',
)
),
);
私のテンプレートファイルでそれをクエリします。
$wr_event_fields = get_post_custom();
$wr_event_fields['_wr_event_date'][0];
適切な条件式 を使うだけです。
function change_order_for_events( $query ) {
//only show future events and events in the last 24hours
$yesterday = current_time('timestamp') - 24*60*60;
if ( $query->is_main_query() && (is_tax('event_type') || is_post_type_archive('wr_event')) ) {
$query->set( 'meta_key', '_wr_event_date' );
$query->set( 'orderby', 'meta_value_num' );
$query->set( 'order', 'ASC' );
//Get events after 24 hours ago
$query->set( 'meta_value', $yesterday );
$query->set( 'meta_compare', '>' );
//Get events before now
//$query->set( 'meta_value', current_time('timestamp') );
//$query->set( 'meta_compare', '<' );
}
}
add_action( 'pre_get_posts', 'change_order_for_events' );
これにより、分類法event_type
の用語アーカイブと投稿タイプwr_event
のアーカイブのメインクエリが変更されます。
私はWP_Query でmeta_queryパラメータを使用したいと思います
そして、このようなことを試してください。
$args = array(
'orderby' => 'meta_value_num',
'order' => 'ASC',
'meta_query' => array(
array(
'key' => '_wr_event_date',
'value' => $yesterday,
'compare' => '>'
)
)
);
$query = new WP_Query( $args );