WP_Query nu funcționează cum ne așteptam pentru atașamente și meta_query personalizat
Dacă folosesc get_posts()
astfel, obțin mai multe rezultate cu valoarea 1 pentru cheia meta my_key
:
$posts = get_posts(
array(
'post_type' => 'attachment',
'meta_key' => 'my_key',
'meta_value' => '1'
)
);
//acest cod returnează mai multe rezultate, așa cum ne așteptăm
print_r($posts);
Totuși, dacă creez o interogare similară cu WP_Query, obțin un array de rezultate gol:
$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);
//acest cod returnează un array gol
print_r($results);
Am încercat mai multe variante ale array-ului meta_query, fără succes. Mă gândesc că ar putea fi un bug, dar am vrut să mă asigur că nu am ratat ceva.

În primul rând, transmiteți argumentele către constructorul clasei WP_Query
, deoarece acest lucru este mai curat și reprezintă modul corect de a face acest lucru conform documentației Codex pentru această clasă.
Ar trebui să construiți interogarea astfel:
$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 );
În al doilea rând, observați parametrul adăugat post_status
în array-ul meu. Implicit, atașamentele sunt adăugate cu un status de postare "inherit" (moștenit), dar WP_Query
va căuta postări cu statusul "published" (publicat), "draft" (ciornă) sau "pending" (în așteptare). (Consultați și documentația acestui parametru).
Deci nu există nicio eroare aici, doar am uitat să verificăm valorile implicite pentru toți parametrii transmiși obiectului.
Există o notă pentru opțiunea "attachment" a parametrului post_type
care menționează această cerință:
Implicit, WP_Query setează
'post_status'=>'published'
, dar atașamentele au implicit'post_status'=>'inherit'
, așa că va trebui să setați statusul la'inherit'
sau'any'
.

Vezi actualizarea mea. Acest cod actualizat a fost testat și funcționează.

Cred că problema ta este că încerci să folosești WP_Query
ca get_posts()
. Se pare foarte posibil ca interogarea să funcționeze, dar pur și simplu nu poți vedea rezultatele. WP_Query
returnează un obiect de interogare prin care poți itera astfel:
...
$my_query = WP_Query( $args );
while( $my_query->have_posts() ) : $my_query->the_post();
// fă ce ai de făcut
endwhile;
De asemenea, observă că am folosit $my_query. Nu sunt complet sigur, dar cred că $query ar putea fi o variabilă rezervată în WordPress, iar în orice caz, este adesea mai bine să faci acea interogare mai ușor de înțeles (poate chiar $attachment_meta_query sau ceva similar).

Mulțumesc, dar codul tău este practic același cu al meu. Tu doar faci un scurtătură. Deci aceasta nu rezolvă problema. Chiar cred că s-ar putea să avem o eroare pe mâinile noastre.

Aceasta nu este o scurtătură, ci mai degrabă sintaxa corectă pentru invocarea unui new WP_Query()
. Transmite array-ul $args
direct către WP_Query()
. De asemenea: recomand cu tărie utilizarea unor nume de variabile mai descriptive, pentru a evita conflictele de denumire.
