Filtrando resultados de WP_Query por categoría
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.

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

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

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.
