How do I make search results include ONLY pages, no posts?

I’m trying to return only pages in search results.

This is working:

/?s=term&post_type=post

It returns only posts, no pages.

But the opposite is not working:

/?s=term&post_type=page

This is returning pages and posts.

How do I return only pages?

Edit

Forgot to mention, so I’m trying to allow the ability for the user to click two links at the top of the search results page.

<a href="https://wordpress.stackexchange.com/?s=term&post_type=post">Search Only Posts</a>
<a href="/?s=term&post_type=page">Search Only Pages</a>

So, I can’t just globally set all search results to only be one or the other.

2 Answers
2

You can enforce a post type per callback on pre_get_posts:

is_admin() || add_action( 'pre_get_posts', function( \WP_Query $query ) {

    $post_type = filter_input( INPUT_GET, 'post_type', FILTER_SANITIZE_STRING );

    if ( $post_type && $query->is_main_query() && $query->is_search() )
        $query->set( 'post_type', [ $post_type ] );
});

If that still includes other post types, you have a second callback registered on that hook. Try to find it; it might be a theme or plugin.

Leave a Comment