web-dev-qa-db-fra.com

$ wpdb interroge-t-il un type d'article dans un terme de taxonomie spécifique tout en ordonnant les articles par méta valeur personnalisée?

J'ai un type de message personnalisé 'événement', un champ méta personnalisé 'date_événement' et une taxonomie personnalisée 'lieux'.

Je veux interroger $ wpdb pour récupérer des posts de cette façon

  1. les articles doivent être du type 'événement'
  2. Les "événements" doivent être associés à un certain terme $ location dans la taxonomie "emplacements".
  3. les résultats doivent être triés selon la méta valeur personnalisée 'event_date' (qui est en fait une date au format yymmdd), par rapport à la date du jour.

J'essaie avec les paramètres de requête suivants (je peux obtenir la valeur de $ location - ID ou slug - correctement et passer à cette requête):

SELECT  $wpdb->posts.* 
LEFT JOIN $wpdb->postmeta ON($wpdb->posts.ID = $wpdb->postmeta.post_id)
LEFT JOIN $wpdb->term_relationships ON($wpdb->posts.ID = $wpdb->term_relationships.object_id)
LEFT JOIN $wpdb->term_taxonomy ON($wpdb->term_relationships.term_taxonomy_id = $wpdb->term_taxonomy.term_taxonomy_id)
LEFT JOIN $wpdb->terms ON($wpdb->term_taxonomy.term_id = $wpdb->terms.term_id)
FROM    $wpdb->posts, $wpdb->postmeta
WHERE   $wpdb->posts.ID = $wpdb->postmeta.post_id 
AND     $wpdb->terms.term_id = $location
AND     $wpdb->term_taxonomy.taxonomy = 'locations'
AND     $wpdb->posts.ID = $wpdb->postmeta.post_id 
AND     $wpdb->posts.post_type = 'event'
AND     $wpdb->posts.post_status = 'publish' 
AND     $wpdb->postmeta.meta_key = 'event_date'
AND     $wpdb->postmeta.meta_value > NOW()
ORDER   BY $wpdb->postmeta.meta_value ASC
LIMIT   $numberofposts

la requête ne fonctionne pas; si je supprime la partie JOIN et la partie taxonomie, cela fonctionnera en ordonnant tous les résultats en comparant la méta 'event_date' avec la date NOW ().

Je suppose que je me trompe dans la partie taxonomie ...

Comme conseillé, j'ai essayé de faire une requête WP_Query plutôt qu'une requête $ wpdb:

$args = array(
               'post_type' => 'event',
               'tax_query' => array(
                                     array(
                                            'taxonomy' => 'locations',
                                            'field' => 'id',
                                            'terms' => $location // location term id
                                           )
                                    ),
               'meta_key' => 'event_date',  // this meta field stores event date in yymmdd format
               'meta_value' => $today,  // this would be today's date in yymmdd format
               'meta_compare' => '>=',
               'posts_per_page' => $numberofposts, // this variable stores the number of posts I want to get
               'orderby'=> 'meta_value_num'


  );

Cependant, dans ce dernier cas, la requête renverra TOUTES les publications sous le type spécifique post_type, indépendamment de toute autre spécification dans $ args, y compris l'ordre de tri.

J'ai essayé d'utiliser meta_query au lieu de meta_key mais le résultat ne change pas

1
unfulvio

Vous avez une faute de frappe dans orderby, et meta_value_num n'est utilisé que comme valeur orderby, essayez ceci:

$args = array(
    'post_type' => 'event',
    'tax_query' => array(
        array(
            'taxonomy' => 'locations',
            'field' => 'id',
            'terms' => $location // location term id
        )
    ),
    'meta_key' => 'event_date',  // this meta field stores event date in yymmdd format
    'meta_value' => $today,  // this would be today's date in yymmdd format
    'meta_compare' => '>=',
    'posts_per_page' => $numberofposts, // this variable stores the number of posts I want to get
    'orderby'=> 'meta_value_num'
);
2
Milo