Searching multiple custom post types and pages

I’m using bainternet’s method for searching custom post_types and it works great. However, I’ve recently been requested to return more than one “specific” post type and perhaps individual pages for a support section on our site.

I thought adding additional hidden fields would do it, but that didn’t work. And I have no clue how this will work with pages.

Read More

Any help would be appreciated!


In the template:

<form action="http://apollo.website.net/" id="searchform" method="get" role="search">
    <div><label for="s" class="screen-reader-text">Search for:</label>
    <input type="text" id="s" name="s" value="">
    <input type="submit" value="Search" id="searchsubmit">

    <input type="hidden" name="post_type" value="software" />
    </div>
</form>

In functions.php:

/* Custom Search Queries */
function SearchFilter($query) {
$post_type = $_GET['post_type'];
if (!$post_type) {
    $post_type = 'any';
}
if ($query->is_search) {
    $query->set('post_type', $post_type);
};
return $query;
} 

Related posts

Leave a Reply

3 comments

  1. change

    <input type="hidden" name="post_type" value="software" />
    

    to

    <input type="hidden" name="post_type[]" value="software" />
    <input type="hidden" name="post_type[]" value="books" />
    

    i have to run but this should work , just add as many hidden fields as you need for each post type

  2. You could do it like this to switch between a singular set type and any..

    <input type="hidden" name="post_type" value="software" />
    <label for="post_type">Search all</label>
    <input type="checkbox" name="post_type" value="any" />
    

    Unchecked searches your specific type, checked sets the post type to any..

  3. To me works that solution (same as Bainternet’s, but without “[]” after “post_type”):

      <input type="hidden" name="post_type" value="photo">
      <input type="hidden" name="post_type" value="video">
    

    And to get a specific template for search results based on the post type(s) (on functions.php):

    function search_template_chooser($template) {
      global $wp_query;
      $post_type = get_query_var('post_type');
      if( $wp_query->is_search && $post_type == 'photo' || $wp_query->is_search && $post_type == 'video' ) {
        return locate_template('search-media.php');
      }
      return $template;
    }
    
    add_filter('template_include', 'search_template_chooser');