web-dev-qa-db-fra.com

Meta_query WordPress et ordre par champ personnalisé

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 ...

3
MikO

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',
));
1
MikO