WP_Query e utilizzo di una variabile per 'cat'=> nell'array args = Bug di WP?

30 gen 2013, 16:35:56
Visualizzazioni: 22.1K
Voti: 2

Per questa discussione, ecco una versione della mia query all'interno di 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);

In breve, non funziona. Ecco cosa ho notato.

Quando eseguo print_r($my_query); posso vedere le query_vars nella prima riga. Non corrispondono ai miei argomenti array. Per esempio, posts_per_page torna al valore predefinito (non la COSTANTE), e la lista post_type non include più post (che dovrebbe/deve essere incluso).

Se rimuovo la riga con 'cat'=> o imposto manualmente il valore ('cat'=> 3) allora tutto funziona come previsto. Le rimanenti query_vars appaiono nel print_r. Tutto bene :)

Ho provato le seguenti soluzioni senza successo:

  • Trasformare la variabile in una COSTANTE, proprio come posts_per_page (che non causa problemi).
  • Concatenare le virgolette attorno al numero $category_id - Il risultato è lo stesso di nessuna virgoletta. Non funziona.
  • 'cat' => array($category_id) - Ho ricevuto un errore - Non accettava che fosse un array.

Qualcuno ha suggerimenti?

Ecco cosa ha "funzionato" (leggi: ho potuto usare il mio $category_id e facendolo non ha rovinato il resto degli args nell'array WP_Query()).

'cat'  => '"-'$category_id'"',

Cioè, potevo negare quell'ID categoria. Assurdo, vero?

A meno che non riesca a risolverlo correttamente, dovrò avere una stringa separata da virgole con tutte le mie categorie negate, analizzare la categoria corrente e poi usare quella stringa per fare la query. In altre parole, se le mie categorie fossero A, B e C, invece di fare una query per A (come ci si aspetterebbe)

'cat' => A

Farò una query per non B, non C.

'cat' => -B,-C

Spero ci sia una soluzione meno improvvisata. Ho passato troppe ore su questo problema e sono abbastanza disperato da usare questo hack e finirla qui. Detto questo, mi sembra proprio un bug nel core. Sì, sto usando la 3.5.1 (o siamo arrivati a .2 o .3 ora?). Il punto è che sono sulla versione più recente (e questo accadeva anche nella 3.2.x).

A proposito, ho visto questo problema segnalato altrove (es. forum WP). Una soluzione suggeriva che l'array args non dovesse essere un array ma una stringa. Anche se fosse possibile con WP_Query, come potrei gestire la lista/array per i post_types come stringa? Infine, se sto facendo qualcosa di sbagliato, allora la pagina di aiuto del Codex necessita di un aggiornamento, no?

Aiuto. :)

0
Tutte le risposte alla domanda 4
6

Dove/come stai definendo $category_id?

Consulta la voce del Codex per i parametri di categoria di WP_Query(). WP_Query() si aspetta che gli ID delle categorie vengano passati come interi, non come stringhe:

  • Se $category_id è un intero, passalo a 'cat'.
  • Se $category_id è un array (di ID di categoria, sempre come interi), passalo a 'category__in'
30 gen 2013 16:42:50
Commenti

Grazie @Chip. Questa riga, proprio sopra la query:

$category_id = get_cat_ID(single_cat_title('', false));

Se la stampo a schermo, è presente e mi sembra corretta. Infatti, i query_vars includono 'cat'=> il problema è che per_page e post_types si comportano in modo strano. Non sto utilizzando una variabile non dichiarata o un tipo errato. Per quanto ne so, non è quello il problema. Hai altri suggerimenti? Grazie ancora

Chief Alchemist Chief Alchemist
30 gen 2013 17:34:03

E cosa restituisce quella riga? Prova con un var_dump( $category_id ).

Chip Bennett Chip Bennett
30 gen 2013 17:37:04

var_dump( $category_id ) restituisce: string(1) "7". OH?

Chief Alchemist Chief Alchemist
30 gen 2013 18:01:29

Ho aggiunto/testato questo: $category_id = (int)get_cat_ID(single_cat_title('', false)); var_dump( $category_id ); e WP_Query ignora i miei argomenti e passa a qualcos'altro di default. Bel tentativo, ma per quanto ne so il tipo (stringa o intero) non è il problema. E se racchiudo la variabile intera $var in '"'.$var.'"' NON funziona. MA '"-'.$var.'"'; sì. NON = OK, altrimenti i miei argomenti vengono ignorati e passa a delle impostazioni predefinite (?)

Chief Alchemist Chief Alchemist
30 gen 2013 18:07:59

Quindi, giusto per tentare, prova a fare il type-casting di $category_id come intero?

Chip Bennett Chip Bennett
30 gen 2013 18:25:15

Così: $category_id = (int)get_cat_ID(single_cat_title('', false)); :) Sì, l'ho già provato.

Chief Alchemist Chief Alchemist
30 gen 2013 22:21:28
Mostra i restanti 1 commenti
13

Immagino abbia a che fare con il modo in cui ottieni la categoria. Ho impostato la funzione su un blog su cui sto lavorando; $category_id è sempre 0.

Quindi per verificare uso questa riga per $category_id:

global $post;
$category_id = get_the_category($post->ID)[0]->term_id;

È semplicemente un modo rapido per ottenere la prima categoria assegnata a un articolo.

Dopodiché, la query funzionava correttamente e il parametro cat nella query viene popolato.

30 gen 2013 17:05:11
Commenti

Grazie @Simon. Permettimi di chiarire un po'. Il 'cat' => $var funziona (più o meno). Compare nella query_var. Tuttavia, quando uso una $var per fare quell'assegnazione, altre cose vanno storte (ad esempio posts_per_page, post_type, ecc.). Non sto ricevendo un errore. Quello che succede è che l'array di argomenti che uso in WP_Query() non corrisponde a ciò che vedo nel print_r() *quando provo ad assegnare 'cat' => con una $var. Sì, prova a capirlo :) Inoltre, sto cercando di usare la riga di codice che menzioni e ottengo: Parse error: syntax error, unexpected '[' . ??

Chief Alchemist Chief Alchemist
30 gen 2013 17:44:28

Ho aggiunto il global $post, immagino sia questo che genera l'errore di parsing, scusa.

Non ho notato nei miei test nulla di sbagliato tranne il $category_id vuoto.

Solo una nota, non uso print_r che è difficile da leggere, uso il plugin console che ti permette di vedere le variabili nella console di firebug. È molto utile e rende la lettura molto più semplice

Simon Simon
30 gen 2013 18:06:35

Beh...avevo aggiunto global $post; io stesso la prima volta e ho comunque ricevuto l'errore. Immagino sia per questo che ho chiesto. Strano, vero?

Chief Alchemist Chief Alchemist
30 gen 2013 22:23:25

Ok, questo dovrebbe funzionare solo su una singola pagina, non sulla pagina di categoria, scusa se l'ho dimenticato! È interessante, ma probabilmente c'è una spiegazione al tuo problema.

Simon Simon
30 gen 2013 22:59:22

Ho controllato il tuo codice originale in una pagina category.php e funziona correttamente. Nessun problema con post_type o post_per_page.

Simon Simon
30 gen 2013 23:11:28

Grazie ancora @Simon. Sospetto che ci sia una sorta di "perdita" di add da qualche altra parte nel tema. Non ho realizzato il build, mi occupo solo degli miglioramenti. Ma anche così, secondo me è un bug del core di WP. Dovrei ricevere un errore / dovrebbe bloccarsi, oppure dovrei ottenere i risultati in base agli argomenti della query. Invece ottengo una query casuale quando c'è una condizione particolare (ma legittima) (es. 'cat' => $var). Domanda: È improbabile che il bug di WP venga risolto presto, quindi come possiamo risolvere/trovare una soluzione alternativa? Hai qualche idea? Grazie ancora.

Chief Alchemist Chief Alchemist
30 gen 2013 23:33:28

Forse prova a cambiare tema solo per verificare il comportamento e la consistenza dei risultati restituiti. Dato che funziona per me e un altro utente qui, suppongo che non ci sia un bug nel core, ma qualche altro hook nel tema o in un plugin.

Simon Simon
30 gen 2013 23:49:04

Grazie ancora @Simon. Vorrei che fosse semplice come cambiare tema, ma questo riguarda tipi di post personalizzati aggiuntivi e altre cose integrate in questo tema personalizzato. Specifico una query. Faccio la richiesta. WP usa un set diverso di argomenti. Anche se fosse un altro plugin, ecc. sarebbe comunque un bug (per me). Non ha senso permettere plugin, ecc. e poi non avere modo di sapere quale è responsabile per "rifiutare" la richiesta e sostituirla con la propria. Questo non lascia molta fiducia in WP_Query, vero? Inoltre... 'cat'=> -1,-3,-4 funziona ma 'cat'=> 2 no. Anche questo mi sembra un bug, no? :(

Chief Alchemist Chief Alchemist
31 gen 2013 01:53:17

A proposito, si scopre che lo "stratagemma" del not non funziona del tutto neanche. Il next_posts_link() viene visualizzato sull'ultima pagina. Il che mi porta a pensare che stia usando un set di argomenti diverso da quello che sto inviando con la mia stringa "not cats" e altri argomenti. Ora sono bloccato e perplesso.

Chief Alchemist Chief Alchemist
31 gen 2013 02:01:37

Ciao @Simon - Grazie per lo stimolo / spinta. Alla fine ho trovato un add_action( 'pre_get_posts', 'function_to_modify_the_query_in_category_php'). Sì, quella funzione stava modificando i parametri standard della query. Non sono sicuro del perché ci fosse anche del codice nel category.php. Ovviamente, mi sono distratto. Detto questo, ancora non spiega perché 'cat'=> $var rendesse tutto strano. Valore hardcoded ok, $var non ok. Questo è ancora piuttosto strano secondo me, sembra quasi un bug. Ma d'altra parte, ho fatto proprio un pasticcio con questa cosa, eh? Grazie ancora per il tuo aiuto.

Chief Alchemist Chief Alchemist
31 gen 2013 03:01:27

e @Andy Killen. Grazie anche a te per il tuo aiuto / stimolo.

Chief Alchemist Chief Alchemist
31 gen 2013 03:01:49

Prego @Chief Alchemist. pre_get_posts era il candidato giusto per quel comportamento.

Simon Simon
31 gen 2013 12:02:17

Come nota a margine...a chiunque stia leggendo questo...per favore commenta il tuo codice. Non sai mai chi altro potrebbe doverci lavorare. Un semplice "gli argomenti di questa query sono aumentati con la funzione: xyz() in functions.php" mi avrebbe fatto risparmiare un sacco di tempo. 10 secondi potrebbero far risparmiare ore a qualcuno - incluso te stesso.

Chief Alchemist Chief Alchemist
1 feb 2013 15:20:59
Mostra i restanti 8 commenti
2

Ho testato la tua funzione e funziona correttamente, quindi probabilmente hai un errore con qualche altro codice nel tuo tema o un conflitto con un plugin. Oppure il tuo loop potrebbe non essere corretto.

Per riferimento ho testato il seguente codice su category.php in twentyeleven, l'output era corretto, senza errori.

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);
30 gen 2013 18:28:19
Commenti

Ciao @Wyck - Sì, è quello che tendo a pensare. Cioè, che ci sia qualcosa da qualche altra parte. Presumo questo perché i valori predefiniti (cioè quelli con cui il mio array di argomenti viene sostituito da qualche altro set di valori query_arr) devono provenire da qualche parte, giusto? Ma è per questo che sto aggiungendo il we_reset in cima. In teoria, questo dovrebbe lasciarmi con una tabula rasa, no? Anche così, perché impostare 'cat'=> (e per quanto ne so, solo quel parametro) con una $var dovrebbe essere un problema? Questo livello di stranezza mi sembra un grosso problema. Tu? Detto tutto ciò... hai qualche idea per una soluzione? O su come trovare il bug / buco nel tema?

Chief Alchemist Chief Alchemist
30 gen 2013 22:27:27

Controlla quella pagina template per altri loop o se include altre parti di template (include o get_template_part), disabilitali e vedi se funziona, rimuovi i widget dal caricamento, disabilita i plugin, verifica se qualcosa sta dirottando la query via pre_get_posts, controlla se qualcos'altro sta usando la tua $my_query (cambia il nome).

Wyck Wyck
31 gen 2013 00:14:57
4

Quando ho suddiviso il tuo codice in parti gestibili per analizzarle, ho scoperto che il problema era molto probabilmente con la linea "paged" nell'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);

Come puoi vedere, ho aggiunto una parentesi aggiuntiva attorno al primo get_query_var in modo che diventasse un operatore ternario corretto. Ho provato questo sul mio ambiente di test e ha funzionato perfettamente.

saluti Andy

30 gen 2013 21:42:57
Commenti

Grazie @Andy Killen. Purtroppo non ha funzionato. A questo punto deve essere qualcosa da qualche altra parte nel tema. Detto questo, mi aspetterei che wp_reset_query() mi dia una tabula rasa, giusto? Per come stanno le cose, l'assegnazione di 'cat' con un $val fa sì che WP cerchi un altro set di argomenti. Questi sembrano proprio un set che il sito sta usando altrove. Quello che non capisco è il perché. Perché non usa gli argomenti che gli chiedo di usare? E ancora meglio, dato che non sto ricevendo veri errori, come dovrei fare per cercare di individuare questa "perdita"? Qualsiasi suggerimento sarebbe molto apprezzato. Grazie!

Chief Alchemist Chief Alchemist
30 gen 2013 22:42:39

Concordo con Wyck (attualmente sotto), molto probabilmente è un problema con un altro plugin o con il tuo tema. Proverei a disabilitare tutti i plugin e riprovare, e se questo non funziona, provare a inserire il tuo categories.php nel tema twentyten o simile e testare lì.

Il wp_reset_query() non è così vitale in questa situazione. Potresti vederlo come un loop annidato all'interno del loop standard se proprio vuoi, dato che stai usando la tua variabile per memorizzare il loop non dovrebbe importare più di tanto.

Andy Killen Andy Killen
30 gen 2013 22:48:48

E se facessi una query SQL corretta? Non aggiungerebbe overhead extra, ecc., giusto? Mi sembra solo che nel tempo che impiegherei a individuare la fonte della "perdita" - e potrei non riuscirci mai, dato che l'uso di una $var che scatena un "bug" è già di per sé strano - potrei semplicemente scrivere un'istruzione SQL e non dovermi preoccupare di WP_Query() e dei suoi problemi.

Chief Alchemist Chief Alchemist
30 gen 2013 23:37:36

In realtà, penso che il mio Piano A per ora sarà una stringa con tutti i gatti negati. E poi rimuoverò il gatto corrente. Ops, credo di aver già menzionato questa come soluzione. Pazzesco ma funzionerà. E se un giorno troverò il buco, potrò semplicemente rimuovere questo "hack".

Chief Alchemist Chief Alchemist
30 gen 2013 23:59:13