Cómo seleccionar posts de una categoría pero excluir posts de otra categoría

14 jul 2014, 12:12:21
Vistas: 14K
Votos: 2

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?

1
Comentarios

cat__in y cat__not_in no son parámetros válidos. Revisa los parámetros de categoría válidos en WP_Query. Puedes simplemente pasar 'cat'=>4 a tus argumentos para obtener solo publicaciones de la categoría 4. O como sugirió Brad, usa pre_get_posts y pasa los mismos parámetros a eso

Pieter Goosen Pieter Goosen
14 jul 2014 13:09:19
Todas las respuestas a la pregunta 3
3

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");
14 jul 2014 12:20:29
Comentarios

O podrías usar pre_get_posts

Brad Dalton Brad Dalton
14 jul 2014 12:29:23

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

User User
14 jul 2014 12:36:41

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

Brad Dalton Brad Dalton
14 jul 2014 13:38:57
5

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.

14 jul 2014 13:41:41
Comentarios

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.

User User
14 jul 2014 21:05:45

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

User User
14 jul 2014 21:34:07

Eso es genial @naomik. ¿También probaste tu código?

Brad Dalton Brad Dalton
15 jul 2014 00:22:52

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

User User
15 jul 2014 02:38:20

Dejemos los comentarios aquí ya que se está alargando demasiado, pero simplemente sugiero que pruebes todos los fragmentos de código en tu tema.

Brad Dalton Brad Dalton
15 jul 2014 11:23:42
4
-3

Supongamos que tienes publicaciones con la categoría ID 4.

query_posts('cat=4');
  while (have_posts()) : the_post();
      the_content();
  endwhile;
14 jul 2014 12:19:34
Comentarios

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

fuxia fuxia
14 jul 2014 12:23:00

Nunca deberías usar query_posts, nunca

Pieter Goosen Pieter Goosen
14 jul 2014 13:04:57

¿razón para nunca usar query_posts?

jojo jojo
14 jul 2014 13:27:10

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

Pieter Goosen Pieter Goosen
14 jul 2014 13:49:31