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