Excluir ID de publicación de wp_query

28

¿Cómo puedo excluir una publicación específica de una consulta WP_Query? (Por ejemplo, muestre todas las publicaciones aparte de una publicación con el ID 278)

He probado el argumento post__not_in pero simplemente elimina todas las publicaciones.

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

Dean Elliott
fuente

Respuestas:

13

Supongo que esto fue pesado, pero para responder a su pregunta original, he recopilado todos los ID de las publicaciones en una matriz en el primer bucle, y excluí esas publicaciones del segundo bucle usando 'post__not_in' que espera una matriz de ID 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; // add post id to array
        echo '<div class="item">';
        echo "<h2>" . get_the_title() . "</h2>";
        echo "</div>";
    endwhile;
endif;
/****************************************************************************/
// array of post id's collected in first loop, can now be used as value for the 'post__not_in' parameter in second loops query $args
$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 de una categoría y recopila los ID de las publicaciones en una matriz.

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

Ben HartLenn
fuente
En otra nota, ¿hay alguna manera de agregar wp-pagenavi a la segunda consulta?
Dean Elliott
1
En caso de que vuelva a visitar su respuesta: corrija el marcado / intención de su código. Gracias.
kaiser
50

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

<?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;

WP_Query post__not_in documentación

Ziki
fuente
2
Ya sabes, hay ediciones para corregir errores tipográficos :)
kaiser
@Ziki la coma en la matriz no es un error tipográfico, es una sintaxis PHP válida, si eso es lo que quieres decir.
leonziyo
1
@leonziyo - no, originalmente tenía "posts__not_in" en lugar de "post__not_in", vea el historial de su respuesta. Coma está bien
Ziki
9

Tienes que definir el post__not_inargumento como matriz. Incluso por un solo valor. Y no sobrescriba las variables centrales globales 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();

    // do stuff

} // endwhile;
} // endif;
?>
emperador
fuente
0

Códigos alternativos;

Excluir publicaciones 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 publicaciones 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));
    }
}
Fatih Mert Doğancan
fuente