Come passare parametri URL per query di tassonomia avanzate con termini multipli per una tassonomia personalizzata

16 ago 2011, 01:29:39
Visualizzazioni: 20.2K
Voti: 7

Questa risposta fornisce il codice per una query che restituisce una corrispondenza OR su un termine di tassonomia:


global $query_string;
$args['tax_query'] = array(
    array(
         'taxonomy' => 'status'
        ,'terms'    => array( 'disponibile', 'in_attesa' ) // cambia in "venduto" per la seconda query
        ,'field'    => 'slug'
    ),
);

Vorrei che il mio template di tassonomia recuperasse i valori dei termini per l'array ( ,'terms' => array( 'disponibile', 'in_attesa' ) ) dall'URL, allo stesso modo di un singolo termine.

L'obiettivo è permettere ai termini di tassonomia di cambiare nel tempo, senza dover codificare manualmente i template delle pagine per particolari combinazioni di interesse, quindi, se c'è un modo migliore, suggeritelo pure.

Grazie a questo post ho i permalink mappati ai file template come segue:

example.com/cptslugs                mappa al mio template archive-cptname.php
example.com/cptslug/cpt-post        mappa al mio template single-cptname.php
example.com/cptslugs/ctxslug/term   mappa al mio template taxonomy-ctxname.php

Vorrei avere qualcosa come:

example.com/cptslugs/ctxslug/term1/term2/

che mappi al mio template taxonomy-ctxname.php in modo che get_query_var( 'term' ) restituisca un array di termini (term1,term2) dall'url.

ma se potessi ottenere

example.com/cptslugs/ctxslug/?terms=term1,term2

da mappare al mio template taxonomy-ctxname.php in modo che get_query_var( 'term' ) restituisca un array di termini (term1,term2) dall'url, magari tramite una regola di riscrittura e un filtro, andrebbe bene anche questo.

Ma in entrambi i casi, l'idea è che il file template dovrebbe funzionare, sia che gli venga passato un termine o un array di termini.

AGGIORNAMENTO

Ok - @scribu al salvataggio! -- forse. Ho continuato a cercare e questo è quello che ho trovato. Pensavo di aver capito tutto, ma non riesco a farlo funzionare.

?tax1=term1,term2&tax2=term2+term3

mappa a:


query_posts( array(
  'tax1' => 'term1,term2',
  'tax2' => 'term3+term4'
) );

che si mappa ulteriormente a:


query_posts( array(
  'tax_query' => array(
    array(
      'taxonomy' => 'tax1',
      'field' => 'slug',
      'terms' => array('term1', 'term2'),
      'operator' => 'OR'
    ),
    array(
      'taxonomy' => 'tax2',
      'field' => 'slug',
      'terms' => array('term3', 'term4'),
      'operator' => 'AND'
    ),
) );

example.com/?ctxname=term1,term2

renderizza il template della pagina principale. Revisione: renderizza taxonomy-ctxname.php quando si scrive correttamente ctxname. Immagina!

example.com/?cptslug/ctxslug=term1,term2

(la tassonomia è registrata con uno slug di cptslug/ctxslug) renderizza anche il template della pagina principale.

example.com/cptslug/?ctxslug=term1+term2

renderizza il template archive-ctpname.php.

Come posso ottenere un URL che renderizzi il template taxonomy-ctxname.php o il template taxonomy.php?

Poi, una volta capito questo - i suggerimenti per gli url puliti sono benvenuti ma non assolutamente necessari.

AGGIORNAMENTO DUE

example.com/?ctxname=term1,term2

e

example.com/ctpslugs/ctxslug/term1,term2/

Entrambi renderizzano taxonomy-ctxname.php come desiderato. Vedi i dettagli nella mia risposta, pubblicata qui sotto.

0
Tutte le risposte alla domanda 1
0

Dopo aver aggiunto

 print_r($wp_query); 

al mio template e aver esaminato i risultati, ho scoperto i formati di URL che funzionano. Nella mia domanda avevo scritto che il seguente formato non funzionava - in realtà funziona, se si scrive correttamente il nome della tassonomia personalizzata.

example.com/?ctxname=term1+term2

Gli URL leggibili con gli operatori '+' e ',' (che indicano rispettivamente AND e OR) vengono riconosciuti solo quando non sono codificati nell'URL.

example.com/cptslugs/ctxslug/term1,term2/ 

produce il seguente oggetto WP_Tax_Query

[tax_query] => WP_Tax_Query Object
      (
          [queries] => Array
              (
                  [0] => Array
                      (
                          [taxonomy] => announcements_cats
                          [terms] => Array
                              (
                                  [0] => term1
                                  [1] => term2
                              )

                          [include_children] => 1
                          [field] => slug
                          [operator] => IN
                      )

                  [1] => Array
                      (
                          [taxonomy] => category
                          [terms] => Array
                              (
                                  [0] => 1
                              )

                          [include_children] => 
                          [field] => term_id
                          [operator] => NOT IN
                      )

              )

          [relation] => AND
      )

Mentre

example.com/cptslugs/ctxslug/term1+term2/

produce il seguente oggetto WP_Tax_Query

[tax_query] => WP_Tax_Query Object
      (
          [queries] => Array
              (
                  [0] => Array
                      (
                          [taxonomy] => ctxname
                          [terms] => Array
                              (
                                  [0] => term1
                              )

                          [include_children] => 1
                          [field] => slug
                          [operator] => IN
                      )

                  [1] => Array
                      (
                          [taxonomy] => ctxname
                          [terms] => Array
                              (
                                  [0] => term2
                              )

                          [include_children] => 1
                          [field] => slug
                          [operator] => IN
                      )

                  [2] => Array
                      (
                          [taxonomy] => category
                          [terms] => Array
                              (
                                  [0] => 1
                              )

                          [include_children] => 
                          [field] => term_id
                          [operator] => NOT IN
                      )

              )

          [relation] => AND
      )

P.S.: Secondo questo: i caratteri '+' e ',' sono 'Caratteri Riservati' e possono essere usati nel percorso, nei parametri e nel frammento di un URI, ma non possono apparire in altre parti di un URI. Immagino che alla fine vada bene. Però sembra comunque un po' 'sbagliato'.

16 ago 2011 09:20:53