Incluyendo todos los términos en tax_query de WordPress

17 mar 2014, 20:33:01
Vistas: 25K
Votos: 6

Estoy un poco confundido, ¿por qué no puedo incluir todos los términos en tax_query automáticamente?

Mi código:

'tax_query' => array(
    array(
        'taxonomy' => 'city',
        'field' => 'slug',
        'terms' => array( nyc, boston, london ),
         )
)

¿Qué pasa si tengo docenas de ciudades? ¿No es poco práctico agregarlas todas manualmente?

3
Comentarios

¿Estás haciendo consultas para publicaciones? ¿O para un tipo de publicación personalizada? Es decir, ¿cada publicación tendrá una ciudad asignada?

helgatheviking helgatheviking
17 mar 2014 20:49:58

Sí, estoy consultando publicaciones usando "query_posts".

wp student wp student
17 mar 2014 20:51:11

Eso no es nada recomendable, tal vez no necesitas una Tax Query sino simplemente un parámetro - 'taxonomy' => 'city'

Howdy_McGee Howdy_McGee
17 mar 2014 20:59:05
Todas las respuestas a la pregunta 3
2
14

A menos que tengas publicaciones que no tengan una ciudad asignada, ¿no estarías consultando básicamente todas tus publicaciones? De todos modos, Eric Holmes tiene razón en que deberías usar WP_Query en lugar de query_posts().

Dicho esto, puedes obtener una lista de todos los términos en una taxonomía y luego usar esos valores en tu consulta de taxonomía.

// obtener todos los términos de la taxonomía
$terms = get_terms( 'city' );
// convertir array de objetos de término a array de IDs de términos
$term_ids = wp_list_pluck( $terms, 'term_id' );

// proceder con la consulta de taxonomía
$args = array ('tax_query' => array(
    array(
        'taxonomy' => 'city',
        'field' => 'term_id',
        'terms' => $term_ids,
         )
)
);

$city_posts = new WP_Query( $args );
17 mar 2014 21:08:29
Comentarios

Gracias, he seleccionado WP_Query. Suena mejor que query_posts(), porque después de todo query_posts() es una función que retorna a WP_Query. Y en lugar de term_ids he usado 'taxonomy' => 'city para incluir todo en él.

wp student wp student
17 mar 2014 23:19:57

No, me equivoqué con solo 'taxonomy' => 'city'. Porque incluye todos los posts. Tendré que incluir term_ids. Gracias por la solución.

wp student wp student
17 mar 2014 23:39:39
1

Además de la respuesta marcada como 'mejor respuesta', existe otra forma que podría ser incluso más rápida ya que no tenemos que obtener los términos y extraer los nombres primero.

Esto se logra con un truco utilizando un operador inexistente (ninguno de 'IN', 'NOT IN', 'AND', 'EXISTS' y 'NOT EXISTS'). Por ejemplo, la cadena 'XXX' cumple esta función y hace que WordPress no entre en los casos durante la generación de la consulta, por lo tanto también se omite la concatenación 0=1.

(Los casos se encuentran en la función get_sql_for_clause() del archivo class-wp-tax-query.php, donde los operadores permitidos se verifican mediante condiciones y no hay un 'else'.)

$args = array ('tax_query' => 
     array(
         array(
              'taxonomy' => 'city',
              //'field' => 'term_id', // <-- no necesario, valor por defecto
              //'terms' => $term_ids, // <-- no necesario
              'operator' => 'XXX'     // Usar un operador inexistente
         )
     )
);
17 ene 2018 14:27:08
Comentarios

Esto es especialmente útil si quieres obtener publicaciones que no estén en ningún término de taxonomía. Esto realmente me salvó de complicar demasiado una consulta - ya sea usando un ID de término específico o permitiendo todas las publicaciones. ¡Muchas gracias!

physalis physalis
5 jul 2023 14:03:13
0

En primer lugar, no utilices query_posts. En su lugar, crea un nuevo objeto WP_Query.

En segundo lugar, ¿por qué necesitarías añadir todas las categorías si literalmente estás añadiendo TODAS las categorías? ¿No sería esto lo mismo que obtener todas las publicaciones? También puedes especificar cuáles NO incluir, por ejemplo: "Todo excepto Chicago".

17 mar 2014 21:00:38