web-dev-qa-db-ja.com

メタキーでarchive.phpのカスタム投稿をソートしますか?

この質問は私がすでに実用的な答えを得たこの 質問 と強く関連しています。

私は "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];
1
mathiregister

適切な条件式 を使うだけです。

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のアーカイブのメインクエリが変更されます。

8
Stephen Harris

私は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 );
1
Steve Fischer