Filtrando resultados de WP_Query por categoría

14 sept 2014, 05:58:27
Vistas: 33.6K
Votos: 2

Usando WP_Query, necesito obtener una selección de posts que sean tanto Categoría1 como Categoría2. Quiero que esta selección incluya Categoría1 y todas sus subcategorías (Categoría3 y Categoría4), siempre que también estén etiquetadas como Categoría2, incluso si no están etiquetadas como Categoría1.

Categorías:

Nombre        ID     Padre
Categoría1    1
Categoría2    2
Categoría3    3      1
Categoría4    4      1

Posts:

ID     Categorías
1      1,2
2      2,3
3      2,4

Ahora, si uso WP_Query para encontrar posts solo en Categoría1, parece encontrar los tres posts incluyendo Post2 y Post3, ya que Categoría3 y Categoría4 son subcategorías de Categoría1, aunque los posts no sean de Categoría1.

new WP_Query(
        array(
            'cat' => 1
        )

Sin embargo, si uso 'category__and' para encontrar posts que sean tanto Categoría1 como Categoría2

new WP_Query(
        array(
            'category__and' => array(1, 2)
        )

solo encuentra Post1 que tiene tanto Categoría1 como Categoría2, pero no encontrará Post2 que es Categoría2 y Categoría3 o Post3, aunque Categoría3 y Categoría4 son subcategorías de Categoría1.

¿Hay alguna manera de tomar el resultado de esto:

new WP_Query(
        array(
            'cat' => 1
        )

Que encuentra posts que son Categoría1 Y subcategorías de Categoría1, incluso si no son también Categoría1...

¿Y luego filtrarlo para incluir solo aquellos posts que también son Categoría2?

Gracias por cualquier sugerencia.

3
Comentarios

Escribí mal 'cat' como 'cat_id' en la pregunta anterior, pero 'cat' es lo que realmente estoy usando en mi código funcional. El código de la pregunta ha sido corregido.

user79283 user79283
14 sept 2014 17:08:13

agregué algunas aclaraciones adicionales

user79283 user79283
14 sept 2014 17:15:10

Bienvenido a WPSE. Si no lo has hecho, por favor revisa [ask] y también visita nuestra página de [tour]. Es importante asegurarte de proporcionar detalles/código correctos para que alguien pueda ayudarte. Esto también evita que tu pregunta sea cerrada debido a errores de sintaxis. :-)

Pieter Goosen Pieter Goosen
14 sept 2014 19:14:53
Todas las respuestas a la pregunta 2
1

Lo que se describe es la forma en que debería funcionar:

  • cat_id no es un argumento válido, por lo que obtendrás publicaciones de todas las categorías. Usa cat para establecer un ID de categoría o un array de IDs de categorías. Por ejemplo:

Obtener publicaciones de la categoría 1:

new WP_Query(
    array(
        'cat' => 1
    )

Obtener publicaciones de la categoría 1 y de la categoría 2 (no necesariamente en ambas)

new WP_Query(
    array(
        'cat' => array( 1, 2 )
    )
  • category__and encuentra publicaciones que pertenecen a todas las categorías especificadas. Por ejemplo:

Obtener publicaciones que estén tanto en la categoría 1 como en la 2:

new WP_Query(
    array(
        'category__and' => array( 1, 2 )
    )

Más detalles en WP Query, parámetros de categoría.

14 sept 2014 12:59:32
Comentarios

Disculpa, escribí mal 'cat' como 'cat_id' en la pregunta anterior, pero 'cat' es lo que realmente estoy usando en mi código funcional. Así que esto aún no responde mi pregunta. Quiero encontrar todas las publicaciones que están en Categoría2 Y (Categoría1 O Subcategorías de Categoría1). Tu código 'category__and' no encuentra las subcategorías

user79283 user79283
14 sept 2014 17:10:36
2

Los parámetros de categoría de WP_Query no tienen este tipo de lógica. category__and y category__in no devuelven posts en categorías hijas de las categorías establecidas.

Sugiero que utilices los parámetros de tax_query en WP_Query, que tienen la lógica que buscas. El parámetro relation tiene dos valores posibles, AND y OR

relation (string) - La relación lógica entre cada array de taxonomía interna cuando hay más de uno. Los valores posibles son 'AND', 'OR'. No utilizar con un solo array de taxonomía interna.

Además, por defecto, los términos hijos se incluyen en un tax_query, y eso es lo que necesitas.

include_children (boolean) - Si incluir o no los hijos para taxonomías jerárquicas. Por defecto es true.

Puedes hacer algo como esto:

$args = array(
    'post_type' => 'post',
    'tax_query' => array(
    'relation' => 'AND',
        array(
            'taxonomy' => 'category',
            'field'    => 'term_id',
            'terms'    => 1,
        ),
        array(
            'taxonomy' => 'category',
            'field'    => 'term_id',
            'terms'    => 2,
            'include_children' => false,
        ),
    ),
);
$query = new WP_Query( $args );

Lo que hace este código es buscar posts que estén en la categoría 1 y en sus categorías hijas, además verifica si estos posts de la categoría 1 y sus categorías hijas están también en la categoría 2. La lista de posts devueltos serán aquellos que estén en la categoría 1 o cualquiera de sus categorías hijas y que también estén en la categoría 2.

He excluido las categorías hijas de la categoría 2, pero puedes eliminarlo si es necesario.

14 sept 2014 19:11:43
Comentarios

Increíble, eso funcionó. Te daría un voto positivo a tu respuesta, pero todavía no tengo suficiente reputación. ¡Gracias por la ayuda!

user79283 user79283
14 sept 2014 19:30:00

No hay problema. Me alegro de que te haya funcionado. Disfruta :-)

Pieter Goosen Pieter Goosen
14 sept 2014 19:32:53