Incluyendo todos los términos en tax_query de WordPress
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?

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 );

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.

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
)
)
);

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".
