web-dev-qa-db-fra.com

Trier les messages personnalisés dans archive.php via une méta-clé?

cette question est fortement liée à cette question à laquelle j'ai déjà obtenu une réponse satisfaisante.

J'ai un post-modèle personnalisé nommé "wr_event" et une taxonomie personnalisée nommée "event_type".

Ces "posts-posts" ont une méta-boîte où je fixe la date de l'événement et je l'utilise…

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' );

… Pour trier tous les "posts-événement" via sa date-événement.

Cela fonctionne très bien et fait exactement ce que je veux.

La seule chose qui ne fonctionne pas jusqu'à présent est le "archive.php" où je veux que la même chose prenne effet.

J'ai ajouté 'has_archive' => 'events' à mon post-modèle personnalisé. /events affiche maintenant mon fichier "archive.php" dans lequel j’utilise déjà is_post_type_archive('wr_event') comme titre.

Cependant, je veux que mes événements archivés soient également dans le bon ordre de date. Donc, la même fonction ci-dessus change_order-for_events() devrait fonctionner sur mon modèle "archive.php". Bien entendu, dans ce cas, la fonction ne devrait afficher que les anciens événements déjà survenus.

Une idée de comment je pourrais faire ça?

update: Je stocke l'horodatage avec les classes MetaBox et 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',
        )
    ),
);

Je l'interroge dans mes fichiers modèles avec

$wr_event_fields = get_post_custom();
$wr_event_fields['_wr_event_date'][0];
1
mathiregister

Utilisez simplement les conditions appropriées :

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' );

Cela modifiera la requête principale pour les archives de termes pour la taxonomie event_type et les archives pour le type de publication wr_event.

8
Stephen Harris

Je voudrais utiliser le paramètre meta_query dans le WP_Query heres le lien

et essayez quelque chose comme ceci:

$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