How can I modify my query in order to exclude certain posts by slug? Is it possible?

query_posts(array('category_name' => 'Mycat', 'posts_per_page' => -1));


2 Answers 2


You can get the post ID from the slug with the url_to_postid() function:

$ID = url_to_postid(slug);

then just exclude the ID from your query:

query_posts(array('category_name' => 'Mycat', 'posts_per_page' => -1, 'post__not_in' => $ID ));

You can create an array of post IDs if you need to exclude multiple pages.

  • Did not know about url_to_postid. Ty very much
    – webmasters
    Jul 25, 2012 at 13:21
  • 1
    Upvote for the url_to_postid() to get the post ID from the slug, but using query_posts() is the wrong implementation. Jul 25, 2012 at 13:59
  • post__not_in in the above code should in fact be an array, so $ID needs to be in square brackets. 'post__not_in' => [$ID]
    – Djave
    Jan 15, 2020 at 12:07

Do not use query_posts()!. Filter pre_get_posts instead *.

function wpse59617_filter_pre_get_posts( $query ) {
    // Only modify the main query
    if ( ! $query->is_main_query() ) { return $query; }
    // Get the ID of the post to exclude
    $slug = 'some-post-slug';
    $post_id = url_to_postid( $slug );
    // Modify the query
    $query->set( 'category_name', 'Mycat' );
    $query->set( 'post__not_in', $post_id );
    $query->set( 'posts_per_page', '-1' );
    // Return the modified query
    return $query;    
add_filter( 'pre_get_posts', 'wpse59617_filter_pre_get_posts' );

* No, really: don't use query_posts(). Here's why.

Your Answer

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

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