Je travaille sur un modèle pour une archive de catégorie spécifique de l'événement de type publication personnalisé.
J'ai besoin de faire une requête qui montre les événements futurs et en cours, en classant par date dans un champ personnalisé.
$termName = get_queried_object()->name;
$termSlug = get_queried_object()->slug;
$event1 = current_time('Y-m-d');
$args = array(
'post_type' => 'event',
'event-categories' => $termSlug,
'post_status' => 'publish',
'posts_per_page' => 10,
'order' => 'ASC',
'meta_query' => array(
'relation' => 'OR',
array(
'relation' => 'AND',
array(
'key' => '_event_start_date',
'value' => $event1,
'compare' => '>=',
'type' => 'DATE',
),
array(
'key' => '_event_end_date',
'value' => $event1,
'compare' => '>=',
'type' => 'DATE',
)
),
array(
'key' => $event1,
'value' => array('_event_start_date','_event_start_date'),
'type' => 'DATE',
'compare' => 'BETWEEN'
)
),
'orderby' => '_event_start_date',
);
$events = new WP_Query($args);
echo $events->post_count ;
Le résultat ne montre que les événements futurs, mais pas les événements en cours.
Qu'est-ce qui ne va pas?
Logiquement, lorsque vous cochez >=
pour _event_start_date
et _event_end_date
, cela couvre automatiquement la vérification BETWEEN
.
Donc, le code suivant devrait fonctionner:
$termName = get_queried_object()->name;
$termSlug = get_queried_object()->slug;
$event1 = current_time( 'Y-m-d' );
$args = array(
'post_type' => 'event',
'event-categories' => $termSlug,
'post_status' => 'publish',
'posts_per_page' => 10,
'order' => 'ASC',
'meta_query' => array(
'relation' => 'OR',
array(
'key' => '_event_start_date',
'value' => $event1,
'compare' => '>=',
'type' => 'DATE',
),
array(
'key' => '_event_end_date',
'value' => $event1,
'compare' => '>=',
'type' => 'DATE',
)
),
'orderby' => '_event_start_date',
);
$events = new WP_Query( $args );
echo $events->post_count;
Assurez-vous également que la valeur de date $event1
est correctement définie comme celle stockée dans la base de données (dans la table méta post). Normalement, WordPress considère en interne que toutes les date
sont dans le fuseau horaire GMT
. Toutefois, cela peut varier en fonction de la manière dont le _event_start_date
et le _event_end_date
sont enregistrés dans votre cas. Il peut être différent en fonction de la valeur stockée:
// MySQL DATETIME field format
$event1 = current_time( 'mysql' );
// MySQL DATETIME field format in GMT
$event1 = current_time( 'mysql', 1 );
// Unix timestamp in local time zone
$event1 = current_time( 'timestamp' );
// Unix timestamp in GMT
$event1 = current_time( 'timestamp', 1 );
Alors, mieux vaut vérifier comment ces données sont sauvegardées, ou tester avec ces variances. Si les champs date
incluent également l'heure, vous pouvez également utiliser le type DATETIME
.
En outre, une note de codex :
Le 'type' DATE fonctionne avec la valeur de comparaison 'BETWEEN' uniquement si la date est enregistrée au format
YYYY-MM-DD
et testée avec ce format.
tax
Requête:L'ancienne requête tax
est obsolète. Donc au lieu d'utiliser:
'event-categories' => $termSlug,
utilisation:
'tax_query' => array(
array(
'taxonomy' => 'event-categories',
'field' => 'slug',
'terms' => $termSlug,
),
),