WP_Query nu funcționează cum ne așteptam pentru atașamente și meta_query personalizat

15 mai 2012, 15:56:20
Vizualizări: 3.08K
Voturi: 2

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.

8
Comentarii

Ai uitat ' după value în codul tău real, sau este o greșeală specifică WPSE?

mor7ifer mor7ifer
15 mai 2012 15:59:13

Nu, dar mulțumesc. Mă întrebam de ce codul nu se formata corect.

Mike Mike
15 mai 2012 16:04:37

Ce se întâmplă dacă elimini complet compare și type?

mor7ifer mor7ifer
15 mai 2012 16:06:40

urmându-l pe @m0r7if3r: ce se întâmplă dacă schimbi BINARY în NUMERIC?

moraleida moraleida
15 mai 2012 16:09:07

Eliminarea comparației și a tipului nu schimbă rezultatul... Numeric nu funcționează nici el

Mike Mike
15 mai 2012 16:12:10

Dacă faci un print_r() al instanței WP_Query create, îți arată exact ce instrucțiune SQL este generată și îți oferă o idee despre ce trebuie făcut pentru a repara interogarea.

EAMann EAMann
16 mai 2012 17:01:15

Nu sunt sigur de unde au venit voturile negative, aceasta este o întrebare legitimă (care, sincer să fiu, m-a pus în încurcătură până când am încărcat Debug Bar Console și am verificat instanța reală WP_Query). Încercați să nu luați personal -1-urile...

EAMann EAMann
16 mai 2012 20:30:46

Mulțumesc. Nimic personal, doar mi s-a părut cam ciudat având în vedere că lucrurile păreau destul de civile aici. Dar asta e. Am verificat obiectul WP_Query, dar tot nu am înțeles. Aș fi interesat să înțeleg logica din spatele 'inherit' pentru atașamentele publicate...

Mike Mike
16 mai 2012 21:00:59
Arată celelalte 3 comentarii
Toate răspunsurile la întrebare 2
3
12

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

15 mai 2012 18:50:04
Comentarii

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

EAMann EAMann
16 mai 2012 17:00:17

nu ar trebui ca post_status să fie publish?

Mike Mike
16 mai 2012 18:00:32

Valoarea implicită este publish, dar verifică în baza ta de date, statusul postării pentru atașamente este "inherit".

EAMann EAMann
16 mai 2012 18:17:10
2

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

15 mai 2012 17:50:50
Comentarii

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.

Mike Mike
15 mai 2012 18:18:40

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.

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