Excluir ID de entrada de wp_query

14 sept 2012, 16:08:54
Vistas: 197K
Votos: 46

¿Cómo puedo excluir una entrada específica de una consulta WP_Query? (Por ejemplo, mostrar todas las entradas excepto una entrada con el ID 278)

He intentado usar el argumento post__not_in pero simplemente elimina todas las entradas..

Cualquier ayuda sería genial.

Aquí está mi consulta actual

<?php
    $temp = $wp_query;
    $wp_query= null;
    $wp_query = new WP_Query(array(
        'post_type' => 'case-study',
        'paged' => $paged,
    ));
    while ($wp_query->have_posts()) : $wp_query->the_post();
?>

Gracias

0
Todas las respuestas a la pregunta 4
4
92

El parámetro que estás buscando es post__not_in (kaiser tiene un error tipográfico en su respuesta). Así que el código podría ser:

<?php
$my_query = new WP_Query(array(
    'post__not_in' => array(278),
    'post_type' => 'case-study',
    'paged' => $paged,
));
while ($my_query->have_posts()) : $my_query->the_post(); endwhile;

Documentación de post__not_in en WP_Query

10 may 2013 12:01:08
Comentarios

Sabes, hay [editar] para corregir errores tipográficos :)

kaiser kaiser
12 oct 2014 16:25:23

@Ziki la coma en el array no es un error tipográfico, es una sintaxis válida de PHP, si es a eso a lo que te refieres.

Leo Leo
21 jun 2017 21:17:14

@leonziyo - no, originalmente tenía "posts__not_in" en lugar de "post__not_in", mira el historial de su respuesta. La coma está bien

Jan Zikmund Jan Zikmund
23 jun 2017 00:15:40

@Ziki No estoy seguro de si apreciaría un coma :D

kaiser kaiser
5 oct 2020 01:38:49
0
20

Debes definir el argumento post__not_in como un array. Incluso para un solo valor. Y por favor no sobrescribas variables globales del núcleo con cosas temporales.

<?php
$query = new WP_Query( array(
    'post_type'    => 'case-study',
    'paged'        => $paged,
    'post__not_in' => array( 1, ),
) );
if ( $query->have_posts() ) {
while ( $query->have_posts() ) {
    $query->the_post();

    // hacer cosas

} // endwhile;
} // endif;
?>
14 sept 2012 16:55:50
2
18

Supongo que esto fue pesado, pero para responder a tu pregunta original, he recopilado todos los IDs de las publicaciones en un array en el primer bucle, y excluí esas publicaciones del segundo bucle usando 'post__not_in' que espera un array de IDs de publicaciones

<?php
$args1 = array('category_name' => 'test-cat-1', 'order' => 'ASC');
$q1 = new WP_query($args);
if($q1->have_posts()) :
$firstPosts = array();
    while($q1->have_posts()) : $q1->the_post();
        $firstPosts[] = $post->ID; // añadir ID de la publicación al array
        echo '<div class="item">';
        echo "<h2>" . get_the_title() . "</h2>";
        echo "</div>";
    endwhile;
endif;
/****************************************************************************/
// array de IDs de publicaciones recopilados en el primer bucle, ahora puede usarse como valor para el parámetro 'post__not_in' en la consulta del segundo bucle
$args2 = array('post__not_in' => $firstPosts, 'order' => 'ASC' );
$q2 = new WP_query($args2);
if($q2->have_posts()) :
    while($q2->have_posts()) : $q2->the_post();
        echo '<div class="item">';
        echo "<h2>" . get_the_title() . "</h2>";
        echo "</div>";
    endwhile;
endif;
?>

El primer bucle muestra todas las publicaciones en una categoría, y recoge los IDs de las publicaciones en un array.

El segundo bucle muestra todas las publicaciones, excluyendo las publicaciones del primer bucle.

14 sept 2012 21:20:26
Comentarios

Por otro lado, ¿hay alguna manera de agregar wp-pagenavi a la segunda consulta?

Dean Elliott Dean Elliott
16 sept 2012 01:21:19

En caso de que revises tu respuesta en el futuro: Por favor corrige el marcado/sangría de tu código. Gracias.

kaiser kaiser
12 oct 2014 16:27:18
0

Códigos alternativos;

Excluir posts de categoría

<?php
add_action('pre_get_posts', 'exclude_category_posts');
function exclude_category_posts( $query ) {
    if($query->is_main_query() && $query->is_home()) {
        $query->set('cat', array( -22, -27 ));
    }
}

Eliminar posts de la página de inicio

<?php
add_action('pre_get_posts', 'wpsites_remove_posts_from_home_page');
function wpsites_remove_posts_from_home_page( $query ) {
    if($query->is_main_query() && $query->is_home()) {
        $query->set('category__not_in', array(-1, -11));
    }
}
22 mar 2019 13:05:21