Exclude Post Types From Search

This snippet allows you to remove a post type, like pages, for instance, from the search results without removing any others (by default WordPress searches posts, pages, and attachments). This will also preserve any custom post types you might have that are searchable (like those from other plugins).

<?php
/**
* Modify query to remove a post type from search results, but keep all others
*
* @author Joshua David Nelson, [email protected]
* @license http://www.gnu.org/licenses/gpl-2.0.html GPLv2+
*/
add_action( 'pre_get_posts', 'jdn_modify_query' );
function jdn_modify_query( $query ) {
// First, make sure this isn't the admin and is the main query, otherwise bail
if( is_admin() || ! $query->is_main_query() )
return;
// If this is a search result query
if( $query->is_search() ) {
// Gather all searchable post types
$in_search_post_types = get_post_types( array( 'exclude_from_search' => false ) );
// The post type you're removing, in this example 'page'
$post_type_to_remove = 'page';
// Make sure you got the proper results, and that your post type is in the results
if( is_array( $in_search_post_types ) && in_array( $post_type_to_remove, $in_search_post_types ) ) {
// Remove the post type from the array
unset( $in_search_post_types[ $post_type_to_remove ] );
// set the query to the remaining searchable post types
$query->set( 'post_type', $in_search_post_types );
}
}
}

Source: https://gist.github.com/joshuadavidnelson/127e51326c04367036da

Tags: ,