WP_Query și utilizarea unei variabile pentru 'cat'=> în array-ul de argumente = Bug WordPress?
Pentru această discuție, iată o versiune a interogării mele din category.php:
wp_reset_query();
$category_id = get_cat_ID(single_cat_title('', false));
$my_query = new WP_Query(array(
'posts_per_page' => SOME_DEFINED_VALUE,
'cat' => $category_id,
'paged' => ( get_query_var('paged') ? get_query_var('paged') : 1 ),
'post_type' => array('post','post_custom_1','post_custom_2','post_custom_3')
));
// print_r($my_query);
Pe scurt, nu funcționează. Iată ce am observat.
Când execut print_r($my_query); pot vedea query_vars în prima linie. Acestea nu se potrivesc cu argumentele din array-ul meu. De exemplu, posts_per_page revine la o altă valoare implicită (nu la CONSTANTA), iar lista post_type nu mai include post (care ar trebui / trebuie să fie inclus).
Dacă elimin linia cu 'cat'=> sau codific manual valoarea ('cat'=> 3) atunci totul funcționează conform așteptărilor. Restul query_vars apar în print_r. Totul e bine :)
Am încercat următoarele dar fără succes:
- Transformarea variabilei într-o CONSTANTĂ, la fel ca posts_per_page (care nu cauzează probleme).
- Concatenarea ghilimelelor în jurul numărului $category_id - Rezultatul este același ca și fără ghilimele. Nu funcționează.
- 'cat' => array($category_id) - Am primit o eroare - Nu a acceptat că este un array.
Are cineva sugestii?
Acum iată ce "a funcționat" (citește: Am putut folosi $category_id și acest lucru nu a stricat restul argumentelor din lista array-ului WP_Query()).
'cat' => '"-'$category_id'"',
Adică, puteam nega acel ID de categorie. Nebunie, nu?
Dacă nu pot rezolva corect, voi avea un șir separat prin virgule cu toate categoriile negate, voi elimina categoria curentă și apoi voi folosi acel șir pentru interogare. Cu alte cuvinte, dacă categoriile mele ar fi A, B și C, în loc să fac o interogare pentru A (cum te-ai aștepta)
'cat' => A
Voi face interogare pentru not B, not C.
'cat' => -B,-C
Sper că există o soluție mai puțin improvizată. Am petrecut prea multe ore cu asta și sunt destul de disperat să folosesc această improvizație și să termin. Totuși, acest lucru pare cu adevărat un bug în core pentru mine. Da, folosesc 3.5.1 (sau suntem la .2 sau .3 acum?). Ideea este că sunt pe ultima versiune (și acest lucru s-a întâmplat și în 3.2.x).
Apropo, am văzut această problemă postată și în alte părți (de ex. forumurile WP). Singura soluție sugera ca array-ul de argumente să nu fie un array ci un șir. Chiar dacă ar fi posibil cu WP_Query, cum aș putea face lista / array-ul pentru post_types ca șir? În final, dacă fac ceva greșit atunci pagina de ajutor din Codex are nevoie de o actualizare, nu?
Ajutor. :)

Unde/cum definești $category_id
?
Consultă intrarea din Codex pentru parametrii de categorie ai WP_Query()
. WP_Query()
așteaptă ca ID-urile categoriilor să fie transmise ca întregi, nu ca șiruri de caractere:
- Dacă
$category_id
este un întreg, transmite-l către'cat'
. - Dacă
$category_id
este un array (de ID-uri de categorii, din nou ca întregi), transmite-l către'category__in'

Mulțumesc @Chip. Această linie, chiar înainte de interogare:
$category_id = get_cat_ID(single_cat_title('', false));
Dacă o afișez pe ecran, este acolo și pare corectă pentru mine. De fapt, query_vars listează 'cat'=> problema este că per_page și post_types devin ciudate. Nu extrag o variabilă nedeclarată sau un tip greșit. Din câte văd, nu asta e problema. Mai ai alte sugestii? Mulțumesc din nou

Și ce returnează acea linie? Încearcă un var_dump( $category_id )
.

Am adăugat/testat asta: $category_id = (int)get_cat_ID(single_cat_title('', false)); var_dump( $category_id ); și WP_Query ignoră argumentele mele și revine la ceva implicit. Bună încercare, dar din câte văd, tipul (string sau int) nu este problema. Și dacă încadrez variabila int $var în '"'.$var.'"' NU funcționează. DAR '"-'.$var.'"'; funcționează. NOT = OK, altfel argumentele mele sunt ignorate și se revine la niște valori implicite (?)

Deci, doar ca o ultimă încercare, încearcă să convertești $category_id
la întreg?

Cred că are legătură cu modul în care obții categoria. Am configurat funcția pe un blog la care lucrez; $category_id
este întotdeauna 0.
Deci, pentru a verifica, folosesc această linie pentru $category_id
:
global $post;
$category_id = get_the_category($post->ID)[0]->term_id;
Doar o modalitate rapidă de a obține prima categorie atribuită unui articol.
După aceea, interogarea a funcționat corect și parametrul cat
din interogare a fost populat.

Mulțumesc @Simon. Permite-mi să clarific puțin. 'cat' => $var funcționează (oarecum). Apare în query_var. Totuși, când folosesc o $var pentru a face această atribuire, alte lucruri devin ciudate (de ex. posts_per_page, post_type, etc.). Nu primesc o eroare. Ce se întâmplă este că array-ul de argumente pe care îl folosesc în WP_Query() nu se potrivește cu ceea ce văd în print_r() *când încerc să atribui 'cat' => cu o $var. Da, încearcă să înțelegi asta :) De asemenea, încerc să folosesc linia de cod pe care o menționezi și primesc: Parse error: syntax error, unexpected '[' . ??

Am adăugat global $post
, cred că asta aruncă eroarea de parse, scuze.
Nu am observat în testele mele nimic greșit în afară de $category_id
gol.
Doar o notă, nu folosesc print_r care este dificil de citit, folosesc plugin-ul console care îți permite să vezi variabilele în consola firebug. Este foarte util și face citirea mult mai ușoară

Ei bine...eu adăugasem global $post; prima dată și tot am primit eroarea. Cred că de aceea întrebam. Ciudat, nu?

Ok, acest lucru ar trebui să funcționeze doar pe o singură pagină, nu pe pagina de categorie, scuze că am uitat acest detaliu! Este interesant, dar probabil există o explicație pentru problema ta.

Am verificat codul tău original într-o pagină category.php și funcționează corect. Nicio problemă cu post_type sau post_per_page.

Mulțumesc din nou @Simon. Bănuiesc că există un fel de "scurgere" de adăugiri în altă parte în tema. Nu am făcut eu construcția, sunt doar responsabil de îmbunătățiri. Dar chiar și așa, aceasta este o eroare din nucleul WP după părerea mea. Ar trebui să primesc fie o eroare / să se blocheze, fie să obțin rezultatele bazate pe argumentele query-ului. În stadiul actual primesc un query aleatoriu atunci când există o anumită condiție (deși legitimă) (adică 'cat' => $var). Întrebare: Este puțin probabil să fie reparată eroarea din WP în curând, așa că cum putem depana / găsi o soluție temporară? Ai vreo sugestie? Mulțumesc din nou.

Poți încerca să schimbi tema doar pentru a verifica comportamentul și consistența rezultatelor returnate. Cum funcționează pentru mine și pentru altcineva aici, aș presupune că nu este o eroare în nucleu, ci un alt hook în temă sau într-un plugin.

Mulțumesc din nou @Simon. Mi-ar plăcea să fie la fel de ușor ca schimbarea temelor, dar asta are legătură cu tipurile personalizate de postări și altele care sunt integrate în această temă personalizată. Eu specific o interogare. Fac cererea. WP folosește un set diferit de argumente. Chiar dacă este vorba despre un alt plugin, etc., asta tot o eroare este (pentru mine). Nu are sens să permiți pluginuri, etc. și apoi să nu ai nicio modalitate de a ști care este responsabil pentru "respingerea" cererii și înlocuirea cu propriile sale argumente. Asta nu lasă prea multă încredere în WP_Query, nu? Mai mult decât atât... 'cat' => -1,-3,-4 funcționează, dar 'cat' => 2 nu. Și asta mi se pare o eroare, nu? :(

Apropo, se pare că "hack-ul" cu negare nu funcționează nici el complet. next_posts_link() se afișează pe ultima pagină. Ceea ce mă face să cred că folosește un set diferit de argumente decât cele pe care le trimit eu cu șirul meu de "not cats" și alte argumente. Acum sunt blocat și nedumerit.

Bună @Simon - Mulțumesc pentru îndemn / împingere. Am găsit în sfârșit un add_action( 'pre_get_posts', 'function_to_modify_the_query_in_category_php'). Da, acea funcție modifica parametrii standard ai interogării. De ce era și cod în category.php nu sunt sigur. Evident, am fost distras. Totuși, asta tot nu explică de ce 'cat'=> $var a făcut lucrurile ciudate. Valoare hard codată ok, $var nu ok. Încă mi se pare destul de ciudat într-un fel care miroase a bug. Dar, din nou, am dat-o în bară destul de rău la asta, nu-i așa? Mulțumesc din nou pentru ajutor.

și @Andy Killen. Ție îți mulțumesc și ție pentru ajutor / îndemn.

Cu plăcere @Chief Alchemist. pre_get_posts
a fost candidatul potrivit pentru acel comportament.

Ca o observație suplimentară... pentru oricine citește asta... vă rugăm să comentați codul vostru. Nu știți cine altcineva ar putea lucra la el. Un simplu "argumentele acestei interogări sunt augmentate cu funcția: xyz() în functions.php" mi-ar fi economisit o grămadă de timp. 10 secunde ar putea salva pe cineva - inclusiv pe voi înșivă - de la ore întregi.

Am testat funcția ta și funcționează corect, deci probabil ai o eroare în alt cod din tema ta sau un conflict cu un plugin. Sau poate bucla ta nu este corectă.
Pentru referință, am testat următorul cod în category.php
în twentyeleven, iar rezultatul a fost corect, fără erori.
wp_reset_query();
define("SOME_DEFINED_VALUE", 5);
$category_id = get_cat_ID(single_cat_title('', false));
$my_query = new WP_Query(array(
'posts_per_page' => SOME_DEFINED_VALUE,
'cat' => $category_id,
'paged' => ( get_query_var('paged') ? get_query_var('paged') : 1 ),
'post_type' => array('post','post_custom_1','post_custom_2','post_custom_3')
));
var_dump($my_query);

Salut @Wyck - Da, asta tind să cred și eu. Adică, e ceva pe undeva altundeva. Presupun asta pentru că valorile implicite (adică ce primesc în array-ul meu arg în loc de alte valori query_arr) trebuie să vină de undeva, nu? Dar asta e motivul pentru care aplic we_reset peste. Împingând unele lucruri, ar trebui să rămân cu o tablă curată, nu? Chiar și așa, de ce ar fi o problemă setarea 'cat'=> (și din câte văd, doar acest parametru) cu o variabilă $var? Acest nivel de ciudățenie mi se pare un bug major. Tu? Cu toate acestea... ai vreo idee pentru o soluție? Sau cum să găsesc bug-ul / gașca din tema?

Verifică acea pagină de template pentru alte bucle sau dacă include alte părți de template (include
sau get_template_part
), dezactivează-le și vezi dacă funcționează, elimină widget-urile din încărcare, dezactivează plugin-urile, verifică dacă ceva interceptează interogarea prin pre_get_posts
, verifică dacă altceva folosește $my_query
(schimbă numele).

Când am împărțit codul tău în bucăți mai mici pentru a le analiza, am descoperit că problema era cel mai probabil la linia "paged" din array.
wp_reset_query();
$category_id = get_cat_ID(single_cat_title('', false));
$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
$query = array(
'posts_per_page' => 5,
'cat' => $category_id,
'paged' => $paged,
'post_type' => array('post','custom_1','custom_2','custom_3')
);
$loop = new WP_Query($query);
print_r($loop);
După cum poți vedea, am adăugat o paranteză suplimentară în jurul primului get_query_var
pentru a transforma expresia într-un operator ternar corect. Am testat acest lucru pe mediul meu de testare și a funcționat perfect.
Cu respect, Andy

Mulțumesc @Andy Killen. Din păcate, nu a ajutat. În acest moment, trebuie să fie ceva în altă parte în tema. Cu toate acestea, m-aș aștepta ca wp_reset_query() să-mi ofere un start curat, nu? Așa cum stau lucrurile, atribuirea 'cat' cu o valoare $val face ca WP să caute un alt set de argumente. Acelea PAR să fie un set pe care site-ul îl folosește în altă parte. Ceea ce nu înțeleg este de ce. De ce nu folosește argumentele pe care le cer să fie folosite? Și mai bine, deoarece nu primesc nicio eroare reală, cum ar trebui să abordez încercarea de a localiza această "scurgere"? Orice sugestii ar fi foarte apreciate. Mulțumesc!

Sunt de acord cu Wyck (mai jos acum), aceasta este cel mai probabil o problemă cu un alt plugin sau cu tema ta. Aș încerca să dezactivez toate pluginurile și să încerc din nou, iar dacă asta nu rezolvă, aș încerca să mut categories.php în tema twentyten sau similară și să testez acolo.
wp_reset_query() nu este atât de vital în această situație. Ai putea privi asta ca pe o buclă imbricată în interiorul buclei standard dacă chiar ai vrea, deoarece folosești propria variabilă pentru a stoca bucla, nu ar conta atât de mult.

Ce-ar fi dacă aș face o interogare SQL corectă? Asta nu va adăuga nicio suprasarcină suplimentară, etc., corect? Pur și simplu mi se pare că până voi găsi sursa "scurgerii" - și s-ar putea să nu reușesc niciodată, deoarece folosirea unei variabile $var care declanșează un "bug" este ciudată de la bun început, nu? - aș putea pur și simplu să scriu o instrucțiune SQL și să nu mai trebuiască să mă îngrijorez de WP_Query() și problemele sale.

De fapt, cred că Planul meu A pentru moment va fi un șir cu toate categoriile negate. Și apoi voi elimina categoria curentă. Ups, cred că am menționat deja asta ca o soluție. Nebunie, dar va funcționa. Și dacă voi găsi golul într-o zi, pot pur și simplu să elimin acest "hack".
