web-dev-qa-db-fra.com

Interroger les événements actuels et futurs, classés par date de début

À l'aide de l'extension d'interface utilisateur de type de publication personnalisée, j'ai créé un type de publication personnalisé "Evénement". Les champs sont renseignés à l'aide de champs personnalisés (créés avec l'extension Champs personnalisés avancés) tels que "date-début" et "date-fin". .

Sur une page d'archive dédiée à ce post-type, j'essaie d'afficher les 10 événements suivants (actuels ou futurs), classés chronologiquement par date de début.

La partie de tri semble être OK par elle-même; mais cela ne fonctionne plus lorsque j'ajoute les tests sur les dates, et de toute façon, ceux-ci ne fonctionnent pas non plus.

Voici mon code:

        $current_date = date('ymd');
        $my_query = new WP_Query( array ( 
        'post_type'         => 'mna_event',
        'posts_per_page'    => 10,
        'orderby'           => 'meta_value_num',
        'meta_key'          => 'date_debut',
        'order'             => 'ASC',
        'meta_query'        => array (
            'relation'      => 'OR',
            array (
                'key'       => 'date_debut',
                'value'     => $current_date,
                'compare'   => '>='
                ),
            array (
                'key'       => 'date_fin',
                'value'     => $current_date,
                'compare'   => '>='
                )
            )
        )
    );

Des conseils à ce sujet seraient très appréciés. Merci

2
tosca

Cela est dû à la relation OR sur meta_query et à la manière dont WordPress génère la chaîne de requête réelle. Vous devez omettre les meta_key et orderby des arguments de la requête et vous connecter au filtre posts_clauses pour modifier les éléments where et orderby de la requête:

function wpse_130954_orderby_fix($pieces){
    global $wpdb;
    $pieces['where']  .= " AND $wpdb->postmeta.meta_key = 'date_debut'";
    $pieces['orderby']  = "$wpdb->postmeta.meta_value ASC";
    return $pieces;
}

Ajoutez le filtre avant de configurer votre objet WP_Query, puis assurez-vous de le supprimer après avoir exécuté votre requête afin de ne pas affecter les autres requêtes:

add_filter( 'posts_clauses', 'wpse_130954_orderby_fix', 20, 1 );
$current_date = date_i18n('Y-m-d');
$my_query = new WP_Query( array ( 
    'post_type'         => 'mna_event',
    'posts_per_page'    => 10,
    'meta_query'        => array (
        'relation'      => 'OR',
        array(
            'key'       => 'date_debut',
            'value'     => $current_date,
            'compare'   => '>=',
            'type'      => 'DATE'
            ),
        array(
            'key'       => 'date_fin',
            'value'     => $current_date,
            'compare'   => '>=',
            'type'   => 'DATE'
            )
        )
    )
);

$result = $my_query->posts;

remove_filter( 'posts_clauses', 'wpse_130954_orderby_fix', 20 );

UPDATE: Utilisez le format yy-mm-dd pour vos champs de date dans les paramètres ACF. (yy-mm-dd dans JS/ACF == Y-m-d au format datetime PHP/MySQL) J'ai mis à jour le code ci-dessus pour ce format. (mis à jour le format $current_date et ajouté le 'type' => 'DATE' dans le meta_query)

3
Parham