À 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
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
)