WP_Query non funziona come previsto per gli allegati e meta_query personalizzati

15 mag 2012, 15:56:20
Visualizzazioni: 3.08K
Voti: 2

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.

8
Commenti

Hai dimenticato il ' dopo value nel tuo codice effettivo, o è un errore di battitura specifico di WPSE?

mor7ifer mor7ifer
15 mag 2012 15:59:13

No, ma grazie mi stavo chiedendo perché il codice non si formattasse.

Mike Mike
15 mag 2012 16:04:37

Cosa succede se elimini completamente compare e type?

mor7ifer mor7ifer
15 mag 2012 16:06:40

seguendo @m0r7if3r: cosa succede se cambi BINARY in NUMERIC?

moraleida moraleida
15 mag 2012 16:09:07

Eliminare il confronto e il tipo non cambia il risultato... Anche Numeric non funziona

Mike Mike
15 mag 2012 16:12:10

Se fai un print_r() dell'istanza WP_Query creata, ti mostra esattamente quale istruzione SQL viene generata e ti dà un'idea di cosa è necessario fare per correggere la query.

EAMann EAMann
16 mag 2012 17:01:15

Non sono sicuro da dove arrivino i voti negativi, questa è una domanda legittima (che onestamente mi aveva lasciato perplesso finché non ho caricato la Debug Bar Console e ho esaminato l'istanza effettiva di WP_Query). Cerca di non prendere i -1 come una questione personale...

EAMann EAMann
16 mag 2012 20:30:46

Grazie. Niente di personale, è solo un po' strano vedere come le cose sembravano piuttosto civili qui. Va beh. Ho dato un'occhiata all'oggetto WP_Query ma ero ancora perplesso. Sarei interessato a capire la logica dietro 'inherit' per gli allegati pubblicati...

Mike Mike
16 mag 2012 21:00:59
Mostra i restanti 3 commenti
Tutte le risposte alla domanda 2
3
12

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

15 mag 2012 18:50:04
Commenti

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

EAMann EAMann
16 mag 2012 17:00:17

non dovrebbe essere publish lo post_status?

Mike Mike
16 mag 2012 18:00:32

Il valore predefinito è publish, ma dai un'occhiata al tuo database, lo stato del post per gli allegati è "inherit".

EAMann EAMann
16 mag 2012 18:17:10
2

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

15 mag 2012 17:50:50
Commenti

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.

Mike Mike
15 mag 2012 18:18:40

Non è una scorciatoia, ma piuttosto la sintassi corretta per invocare un new WP_Query(). Passa direttamente l'array $args a WP_Query(). Inoltre: consiglio vivamente di utilizzare nomi di variabili più descrittivi, per evitare conflitti di denominazione.

Chip Bennett Chip Bennett
15 mag 2012 19:45:14