web-dev-qa-db-fra.com

WP_Query ne fonctionne pas comme prévu pour les pièces jointes et méta_query personnalisé

Si j'utilise get_posts() like, j'obtiens un nombre de résultats avec la valeur 1 pour la my_key meta_key:

$posts = get_posts( 
    array( 
        'post_type'  => 'attachment', 
        'meta_key'   => 'my_key', 
        'meta_value' => '1' 
    ) 
);

//this has a bunch of results as expected
print_r($posts);

Cependant, si je crée une requête similaire avec WP_Query, je reçois un tableau de résultats vide.

$args = array(
   'post_type' => 'attachment',
   'meta_query' => array(
       array(
       'key'     => 'my_key',
       'value'   => '1',
       'compare' => '=',
       'type'    => 'BINARY'

      )
   )
);

$query = new WP_Query();
$results = $query->query($args);
//this is empty
print_r($results);

J'ai essayé quelques variétés du tableau meta_query sans aucune chance. Je pense que cela pourrait être un bug, mais je voulais m'assurer que je ne manquais pas quelque chose en premier.

2
Mike

Tout d’abord, transmettez simplement vos arguments au constructeur de WP_Query car c’est à la fois plus propre et la façon dont vous êtes censé le faire conformément à la documentation Codex de la classe .

Vous devriez construire des choses comme ceci:

$my_key_query_args = array(
   'post_type'   => 'attachment',
   'post_status' => 'inherit',
   'meta_query'  => array(
       array(
           'key'     => 'my_key',
           'value'   => '1',
           'compare' => '=',
           'type'    => 'BINARY'

      )
   )
);

$my_key_query = new WP_Query( $my_key_query_args );

Deuxièmement, remarquez le paramètre ajouté post_status de mon tableau. Par défaut, les pièces jointes sont ajoutées avec le statut "hériter", mais WP_Query recherche les publications ayant le statut "publié", "brouillon" ou "en attente". (Voir la documentation de ce paramètre également).

Donc, il n'y a pas de bogue ici, nous avons simplement oublié de vérifier les valeurs par défaut pour tous les paramètres passés dans l'objet.

Il y a une note sur l'option "pièce jointe" pour le paramètre post_type qui appelle cette exigence:

La valeur par défaut WP_Query définit 'post_status'=>'published', mais les pièces jointes sont définies par défaut sur 'post_status'=>'inherit'. Vous devez donc définir le statut sur 'inherit' ou 'any'.

12
EAMann

Je crois que votre problème est que vous essayez d'utiliser WP_Query comme get_posts(). Il semble tout à fait possible que la requête fonctionne, mais vous ne pouvez pas voir les résultats. WP_Query renvoie un objet de requête que vous parcourez comme ceci:

...
$my_query = WP_Query( $args );
while( $my_query->have_posts() ) : $my_query->the_post();

// do your thing

endwhile;

Notez également que j'ai utilisé $ my_query. Je suis un peu flou à ce sujet, mais je crois que $ query peut être une variable réservée de WordPress, et dans tous les cas, il est souvent préférable de rendre cette requête un peu plus lisible par l'homme (peut-être l'événement $ attachment_meta_query ou autre).

0
mrwweb