J'ai un type de message personnalisé appelé " Films ", avec un champ de répéteur appelé " Showings ", qui ont un champ " start_datetime " de type DateTime .. .
Je souhaite effectuer une requête pour obtenir tous ces films avec une émission dans les 7 prochains jours, et je souhaite les commander en affichant start_datetime.
J'ai cette requête:
$query = new \WP_Query( array(
'numberposts' => -1,
'post_type' => 'film',
'meta_key' => 'showings_%_start_datetime',
'orderby' => 'meta_value_num',
'order' => 'ASC',
'meta_query' => array(
array(
'key' => 'showings_%_start_datetime',
'value' => array( time(), strtotime( '+7 days' ) ),
'type' => 'NUMERIC',
'compare' => 'BETWEEN'
)
)
));
Ceci saisit correctement tous les films qui ont une projection dans les 7 prochains jours, mais ensuite, ils commandent les films avant le début de la dateFIRST=/, et j'ai besoin de il de les commander par le start_datetime duFIRST FUTUREmontrant ... Toute aide s'il vous plaît?
Exemple:
Film A avoir une projection aujourd'hui.
Le film B a une projection demain et une autre il y a 1 an.
Mes résultats seront ordonnés: Film B, puis Film A (car le film B est celui avec une projection qui commence). Mais j’ai besoin que ce soit commandé à l’inverse parce que Film A est le film avec la première projection future ...
J'ai découvert le problème en inspectant le code SQL créé par WP_Query
. J'ai réalisé que la requête SQL générée a 2 INNER JOINs, une pour le meta_key
et une autre pour le meta_query
.
D'une part, il filtre les films qui ont un showings_%_start_datetime
dans les sept prochains jours et, d'autre part, il les classe (indépendamment) par leur valeur showings_%_start_datetime
.
Il suffit de déplacer les paramètres meta_query
vers la requêtebase:
query = new \WP_Query( array(
'numberposts' => -1,
'post_type' => 'film',
'meta_key' => 'showings_%_start_datetime',
'meta_value' => array( time(), strtotime( '+7 days' ) ),
'meta_type' => 'NUMERIC',
'meta_compare' => 'BETWEEN',
'orderby' => 'meta_value_num',
'order' => 'ASC',
));