WP_Query non funziona come previsto per gli allegati e meta_query personalizzati
Se uso get_posts()
in questo modo ottengo diversi risultati con valore 1 per la meta_key my_key
:
$posts = get_posts(
array(
'post_type' => 'attachment',
'meta_key' => 'my_key',
'meta_value' => '1'
)
);
//questo restituisce diversi risultati come previsto
print_r($posts);
Tuttavia, se creo una query simile con WP_Query ottengo un array di risultati vuoto
$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);
//questo è vuoto
print_r($results);
Ho provato diverse varianti dell'array meta_query tutte senza successo. Penso che possa essere un bug, ma volevo assicurarmi di non aver tralasciato nulla.

Innanzitutto, passa i tuoi argomenti al costruttore di WP_Query
poiché è più pulito ed è il modo corretto secondo la documentazione Codex della classe.
Dovresti costruire le query in questo modo:
$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 );
In secondo luogo, nota il parametro aggiunto post_status
nel mio array. Di default gli allegati hanno uno stato "inherit", ma WP_Query
cerca normalmente post con stato "published", "draft" o "pending". (Vedi anche la documentazione di quel parametro).
Quindi non c'è alcun bug qui, abbiamo semplicemente dimenticato di verificare i valori predefiniti per tutti i parametri passati all'oggetto.
C'è una nota sull'opzione "attachment" per il parametro post_type
che segnala questo requisito:
La WP_Query di default imposta
'post_status'=>'published'
, ma gli allegati hanno di default'post_status'=>'inherit'
quindi dovrai impostare lo stato a'inherit'
o'any'
.

Vedi il mio aggiornamento. Questo codice aggiornato è stato testato e funziona.

Credo che il tuo problema sia che stai cercando di utilizzare WP_Query
come get_posts()
. È abbastanza possibile che la query funzioni, ma semplicemente non riesci a vedere i risultati. WP_Query
restituisce un oggetto query che devi scorrere in questo modo:
...
$my_query = WP_Query( $args );
while( $my_query->have_posts() ) : $my_query->the_post();
// fai quello che devi fare
endwhile;
Inoltre, nota che ho usato $my_query. Non sono del tutto sicuro, ma credo che $query possa essere una variabile riservata di WordPress, e in ogni caso, è spesso meglio rendere quella query un po' più leggibile (magari anche $attachment_meta_query o qualcosa del genere).

Grazie, ma il tuo codice è sostanzialmente lo stesso del mio. Stai solo prendendo una scorciatoia. Quindi questo non risolve il problema. Penso davvero che potremmo avere a che fare con un bug.
