Cum se transmit parametrii URL pentru interogări avansate de taxonomie cu termeni multipli pentru o taxonomie personalizată

16 aug. 2011, 01:29:39
Vizualizări: 20.2K
Voturi: 7

Acest răspuns oferă codul pentru o interogare care returnează o potrivire OR pentru un termen taxonomic:

global $query_string;
$args['tax_query'] = array(
    array(
         'taxonomy' => 'status'
        ,'terms'    => array( 'disponibil', 'in_asteptare' ) // schimbă în "vandut" pentru a 2-a interogare
        ,'field'    => 'slug'
    ),
);

Aș dori ca template-ul meu de taxonomie să preia valorile termenilor pentru array ( ,'terms' => array( 'disponibil', 'in_asteptare' ) ) din URL, la fel ca pentru termenul singular.

Scopul este de a permite termenilor taxonomici să se schimbe în timp, fără a fi nevoie să codăm template-uri de pagină pentru combinații particulare de interes, așa că, dacă există o modalitate mai bună, vă rog să o sugerați.

Mulțumită acestei postări am permalinkuri care se mapează la fișierele template astfel:

example.com/cptslugs                se mapează la template-ul meu archive-cptname.php 
example.com/cptslug/cpt-post        se mapează la template-ul meu single-cptname.php
example.com/cptslugs/ctxslug/term   se mapează la template-ul meu taxonomy-ctxname.php

Aș dori să am ceva de genul:

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

să se mapeze la template-ul meu taxonomy-ctxname.php astfel încât get_query_var( 'term' ) să returneze un array de termeni (term1,term2) din url.

dar dacă aș putea obține

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

să se mapeze la template-ul meu taxonomy-ctxname.php astfel încât get_query_var( 'term' ) să returneze un array de termeni (term1,term2) din url, probabil printr-o regulă de rescriere și un filtru, ar fi ok și așa.

Dar oricum, ideea este că fișierul template ar trebui să funcționeze, indiferent dacă i se transmite un termen sau un array de termeni.

ACTUALIZARE

Ok - @scribu vine în ajutor! -- poate. Am continuat să caut și asta am găsit. Credeam că am rezolvat totul, dar nu reușesc să-l fac să funcționeze.

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

se mapează la:

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

care se mapează mai departe la:

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

afișează template-ul paginii principale. Revizuire: afișează taxonomy-ctxname.php când scrii ctxname corect. Ce surpriză!

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

(taxonomia este înregistrată cu un slug de cptslug/ctxslug) de asemenea afișează template-ul paginii principale.

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

afișează template-ul archive-ctpname.php.

Cum obțin un URL care să afișeze template-ul taxonomy-ctxname.php sau taxonomy.php?

Apoi, odată ce am rezolvat asta - sugestiile pentru URL-uri frumoase sunt binevenite dar nu absolut necesare.

A DOUA ACTUALIZARE

example.com/?ctxname=term1,term2

și

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

Ambele afișează taxonomy-ctxname.php după cum se dorește. Vezi detaliile în răspunsul meu, postat mai jos.

0
Toate răspunsurile la întrebare 1
0

După ce am adăugat

 print_r($wp_query); 

în template-ul meu și am analizat rezultatele, am descoperit formate de URL-uri care funcționează. În întrebarea mea, am menționat că următorul format nu funcționează - de fapt, funcționează - dacă scrii corect numele taxonomiei personalizate.

example.com/?ctxname=term1+term2

URL-urile elegante cu operatorii '+' și ',' (indicând AND și OR respectiv) sunt recunoscute doar atunci când nu sunt codate în URL.

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

produce următorul obiect 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
      )

În timp ce

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

produce următorul obiect 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.: Conform acestui articol: caracterele '+' și ',' sunt 'Caractere Rezervate' și pot fi folosite în calea, parametrii și fragmentul unui URI, dar nu pot apărea în alte părți ale unui URI. Cred că este în regulă până la urmă. Totuși, pare puțin 'greșit' cumva.

16 aug. 2011 09:20:53