Cómo seleccionar posts de una categoría pero excluir posts de otra categoría
Estoy intentando seleccionar posts que tengan la categoría con ID 4
pero excluir posts que también tengan la categoría con ID 2
Esto es lo que estoy probando:
$query = new WP_Query(array(
"cat__in" => array(4), // Incluir solo posts de la categoría 4
"cat__not_in" => array(2), // Excluir posts de la categoría 2
"post_type" => "post", // Tipo de contenido: posts
"post_status" => "publish", // Solo posts publicados
"orderby" => "date", // Ordenar por fecha
"order" => "DESC", // Orden descendente
"posts_per_page" => $limit, // Límite de posts
"offset" => 0 // Sin desplazamiento inicial
));
Sin embargo, no está haciendo la selección correcta. ¿Qué estoy haciendo mal?

Resulta que esto se puede hacer de 4 formas diferentes
Usando cat
con un número negativo
$query = new WP_Query(array(
"cat" => "4, -2",
// ...
));
Usando category__in
y category__not_in
Yo estaba usando erróneamente cat__in
y cat__not_in
que no son parámetros válidos de WP_Query
$query = new WP_Query(array(
"category__in" => array(4),
"category__not_in" => array(2),
// ...
));
Usando tax_query
$query = new WP_Query(array(
"tax_query" => array(
"relation" => "AND",
array(
"taxonomy" => "category",
"field" => "term_id",
"terms" => array(4)
),
array(
"taxonomy" => "category",
"field" => "term_id",
"terms" => array(2),
"operator" => "NOT IN"
),
),
// ...
));
Usando el filtro pre_get_posts
(como lo proporcionó Brad Dalton)
function exclude_posts_from_specific_category($query) {
if ($query->is_home() && $query->is_main_query()) {
$query->set("cat", "-2");
}
}
add_action("pre_get_posts", "exclude_posts_from_specific_category");

@BradDalton, una respuesta completa sería muy apreciada. No estoy seguro de cómo funcionaría eso para mí.

Puedes modificar un WP_Query existente usando pre_get_posts. http://codex.wordpress.org/Plugin_API/Action_Reference/pre_get_posts

Utiliza pre_get_posts
para excluir las categorías que no deseas mostrar en el bucle.
function exclude_posts_from_specific_category( $query ) {
if ( $query->is_home() && $query->is_main_query() ) {
$query->set( 'cat', '-2' );
}
}
add_action( 'pre_get_posts', 'exclude_posts_from_specific_category' );
O crea una nueva WP_Query
y utiliza los Parámetros de Categoría.
<?php
$args = array(
'category__not_in' => 2 ,
'category__in' => 4
);
$the_query = new WP_Query( $args );
if ( $the_query->have_posts() ) {
echo '<ul>';
while ( $the_query->have_posts() ) {
$the_query->the_post();
echo '<li>' . get_the_title() . '</li>';
}
echo '</ul>';
} else {
}
wp_reset_postdata();
Si solo deseas mostrar publicaciones de una categoría, deberías utilizar el archivo de categoría. Consulta Template Hierarchy
.

Ah, ese era mi problema. Estaba usando cat__in
y cat__not_in
. Necesitaba usar la palabra completa category
en cada parámetro. También voy a experimentar con tu otro método.

He editado mi respuesta para compilar una lista completa (¿?) de métodos para hacer esto.

¿te refieres a pruebas unitarias? Solo hice una prueba rápida de humo para ver que cada método en mi publicación funciona.

Por favor agrega una explicación a tu respuesta: ¿por qué eso resolvería el problema?

Esta publicación debería arrojar algo de luz sobre eso
