42

How can I exclude one specific post from a WP_Query query? (For example, show all posts apart from a post with the ID 278)

I've tried the post__not_in argument but it just removes all posts..

Any help would be great.

Here is my current query

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

Thanks

4 Answers 4

17

I suppose this was heavy, but to answer your original question, I've collected all of the posts id's in an array in the first loop, and excluded those posts from the second loop using 'post__not_in' which expects an array of post id's

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

The first loop displays all posts in a category, and collects the post id's into an array.

The second loop displays all posts, excluding posts from the first loop.

2
  • On another note, Is there a way to add wp-pagenavi to the 2nd query? Sep 15, 2012 at 22:21
  • 1
    In case you ever revisit your answer: Please fix your code markup/intending. Thanks.
    – kaiser
    Oct 12, 2014 at 13:27
90

The parameter you are looking for is post__not_in (kaiser has a typo in his answer). So the code could be like:

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

4
  • 6
    You know, there are edits for correcting typos :)
    – kaiser
    Oct 12, 2014 at 13:25
  • @Ziki the comma in the array is not a typo it is valid PHP syntax, if thats what you mean.
    – Leo
    Jun 21, 2017 at 18:17
  • 1
    @leonziyo - no, he originally had there "posts__not_in" instead of "post__not_in", see history of his answer. Coma is fine Jun 22, 2017 at 21:15
  • 1
    @Ziki I am not sure if I would appreciate a coma :D
    – kaiser
    Oct 4, 2020 at 22:38
18

You have to define the post__not_in arg as array. Even for a single value. And please don't overwrite global core variables with temporary stuff.

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

Alternative codes;

Exclude category posts

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

Remove posts from homepage page

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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Not the answer you're looking for? Browse other questions tagged or ask your own question.