10

On my site, I want some pages to not be queriable by the search form (so they don't appear when I've got something like www.ex.com/?s=banana)

Is there a way to "Remove" pages from the search results page (without just blindly do a condition of if is_page(id), display:none)

2 Answers 2

17

In WP_Query() there is a 'post__not_in' argument where you can exclude specific post ID's.

You would create a new WP_Query inside of your search.php and use the current $query_args, then add on your 'post__not_in'.

If you wanted to make it more dynamic, you could also build in some post meta where you could do a meta query and exclude all that have "exclude" checked. (look up 'register_meta_box_cb' in register_post_type ).

For example,

add_action('pre_get_posts','wpse67626_exclude_posts_from_search');
function wpse67626_exclude_posts_from_search( $query ){

    if( $query->is_main_query() && is_search() ){
         //Exclude posts by ID
         $post_ids = array(7,19,21);
         $query->set('post__not_in', $post_ids);
    }

}
1
  • 4
    +1. Would add that if the posts you are excluding belong to a particular post type then you can exclude them from search when you register_post_type Commented Oct 9, 2012 at 13:25
1

To exclude all pages from search results (i.e. without having to manually supply page IDs), here's an improved version of @EricHolmes's function:

add_action( 'pre_get_posts', 'wpse67626_exclude_pages_from_search' );
function wpse67626_exclude_pages_from_search( $query ) {

    // Manually supply Post/Page IDs to exclude from search results
    // $exclude_page_ids = array( 7, 19, 21 );

    // Or just get all page IDs
    $exclude_page_ids = get_all_page_ids();

    if (
        !$query->is_admin &&
        $query->is_search &&
        $query->is_main_query() &&
        !empty( $exclude_page_ids ) 
    ) {

        $query->set( 'post__not_in', $exclude_page_ids );

    }
}

More info:

(ALTERNATIVE) Although, given what you are doing, you could just set exclude_from_search for the page post type to true, which to me seems to be the best way to exclude a post type from search. See @prettyboymp's answer for that.

More info:

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.