Cómo pasar parámetros URL para consultas avanzadas de taxonomía con múltiples términos para una taxonomía personalizada

16 ago 2011, 01:29:39
Vistas: 20.2K
Votos: 7

Esta respuesta proporciona el código para una consulta que devuelve una coincidencia OR en un término de taxonomía:


global $query_string;
$args['tax_query'] = array(
    array(
         'taxonomy' => 'status'
        ,'terms'    => array( 'disponible', 'pendiente' ) // cambiar a "vendido" para la segunda consulta
        ,'field'    => 'slug'
    ),
);

Me gustaría que mi plantilla de taxonomía recupere los valores de términos para el array ( ,'terms' => array( 'disponible', 'pendiente' ) ) desde la URL, igual que para un término único.

El objetivo es permitir que los términos de taxonomía cambien con el tiempo, sin tener que codificar plantillas de página para combinaciones particulares de interés, por lo que si hay una mejor manera, por favor sugiéranla.

Gracias a esta publicación tengo enlaces permanentes que mapean a archivos de plantillas de la siguiente manera:

example.com/cptslugs                mapea a mi plantilla archive-cptname.php 
example.com/cptslug/cpt-post        mapea a mi plantilla single-cptname.php
example.com/cptslugs/ctxslug/term   mapea a mi plantilla taxonomy-ctxname.php

Me gustaría tener algo como:

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

que mapee a mi plantilla taxonomy-ctxname.php de manera que get_query_var( 'term' ) devuelva un array de términos (term1,term2) desde la url.

pero si pudiera obtener

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

para mapear a mi plantilla taxonomy-ctxname.php de manera que get_query_var( 'term' ) devuelva un array de términos (term1,term2) desde la url, tal vez a través de una regla de reescritura y un filtro, eso también estaría bien.

Pero de cualquier manera, la idea es que el archivo de plantilla debería funcionar, ya sea que se le pase un término o un array de términos.

ACTUALIZACIÓN

Ok - @scribu al rescate! -- tal vez. Seguí buscando, y esto es lo que encontré. Pensé que lo tenía todo resuelto, pero no puedo hacer que funcione.

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

mapea a:


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

que además mapea 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

renderiza la plantilla de página principal. Revisión: renderiza taxonomy-ctxname.php cuando escribes ctxname correctamente. ¡Imagínate!

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

(la taxonomía está registrada con un slug de cptslug/ctxslug) también renderiza la plantilla de página principal.

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

renderiza la plantilla archive-ctpname.php.

¿Cómo obtengo una URL que renderice la plantilla taxonomy-ctxname.php o la plantilla taxonomy.php?

Luego, una vez que lo tenga dominado - las sugerencias para URLs bonitas son bienvenidas pero no absolutamente necesarias.

ACTUALIZACIÓN DOS

example.com/?ctxname=term1,term2

y

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

Ambos renderizan taxonomy-ctxname.php como se desea. Ver detalles en mi respuesta, publicada abajo.

0
Todas las respuestas a la pregunta 1
0

Después de agregar

print_r($wp_query);

a mi plantilla y examinar los resultados, he descubierto formatos de URL que funcionan. Escribí en mi pregunta que el siguiente formato no funciona; de hecho, sí funciona si escribes correctamente el nombre de tu taxonomía personalizada.

example.com/?ctxname=term1+term2

Las URLs bonitas con los operadores '+' y ',' (que indican AND y OR respectivamente) solo son reconocidas cuando no están codificadas en la URL.

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

produce el siguiente objeto 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
      )

Mientras que

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

produce el siguiente objeto 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.D.: Según esto, los caracteres '+' y ',' son 'Caracteres Reservados' y pueden usarse en la ruta, parámetros y fragmento de una URI, pero no deben aparecer en otras partes de una URI. Supongo que está bien después de todo. Aunque de alguna manera parece "incorrecto".

16 ago 2011 09:20:53