How to exclude pages, categories, or author from search results in WordPress

By default, the search functionality in WordPress shows all record types and pages in the results. You may want to remove pages, categories, taxonomies, or posts by a specific author from your search.

To do this, we need to fix the main is_search() query on the pre_get_posts hook. Let’s see some examples.

You can use the following code to leave only the post type in the search results.

add_action( 'pre_get_posts', 'wpz_search_filter' );
function wpz_search_filter( $query ) {
	if ( ! is_admin() && $query->is_main_query() && $query->is_search ) {
		$query->set( 'post_type', 'post' );
	}
}

Because there is no method like unset, we can only reassign variables using the set method.

As for the conditions, we check that we are not in the admin, that this is the main query and that it is a search query.

Be careful, with this code you will exclude not only standard pages from search, but also all entries of custom type.

How to hide a category from search results

To exclude posts of a particular category from search results, use the following example:

add_action( 'pre_get_posts', 'wpz_search_filter' );
function wpz_search_filter( $query ) {
	if ( ! is_admin() && $query->is_main_query() && $query->is_search ) {
		$query->set( 'cat','-2,-3' );
	}
}

This filter will exclude posts that are in categories 2 and 3 from search results.

If a post is attached to categories 3 and 4 at the same time, it will not be excluded from search results by this filter.

How to hide a custom post type from search results

To exclude custom post types from search results, it is sufficient to set the argument 'public' = 'false' during registration (function register_post_type()), but if that is not possible, you can also use this hook.

Here we need a modification of the first example: we need to pass only post types that we want to leave in search results to $query.

add_action( 'pre_get_posts', 'wpz_search_filter' );
function wpz_search_filter( $query ) {
	if ( ! is_admin() && $query->is_main_query() && $query->is_search ) {
		$query->set('post_type', array( 'post', 'portfolio', 'service' ) );
	}
}

For example, this code would leave only posts, portfolio pages, and services in the search results.

To hide entries of a certain author, use the following code:

add_action( 'pre_get_posts', 'wpz_search_filter' );
function wpz_search_filter( $query ) {
	if ( ! is_admin() && $query->is_main_query() && $query->is_search ) {
		$query->set ( 'author','-8, -10, -12' );
	}
}

It will exclude records of authors with IDs 8, 10 and 12.

Using the plugin

If you for some reason do not want to edit the code of your site, you can use the free plugin Search Exclude. It has simple and intuitive settings.

How useful is the publication?

Click on a star to rate it!

Average score 5 / 5. Number of grades: 1

No ratings yet. Rate it first.

Similar posts

Why Files with Identical Content (*.js, *.php, *.css) Can Have Different Sizes?

When developers compare files with identical content but notice that their sizes differ, it can be perplexing. Let’s explore why this happens and what factors influence the size of files with extensions like *.js, *.php, and *.css. 1. File Encoding One of the key factors affecting file size is text encoding. The most common encodings…
Read more

How to transfer a site from dle to WordPress?

Transferring a website from DLE (DataLife Engine) to WordPress can be a complex process, especially if the site has a lot of content. Here’s a step-by-step guide: 1. Preparation 2. Export Data from DLE DLE uses its own database structure, so you’ll need to export data and convert it into a format compatible with WordPress:…
Read more