Include a custom post type in search results on WordPress

For today’s tutorial, I’m going to show you two ways you can include custom post types on your site’s search results. Custom Post Types aren’t included in results by default, so we need to tweak our theme just a little to make it happen.

Let’s get to it!

Method 1: use a custom function

The first method is the more elegant of the two I’m sharing here, however if this is a little over your head and you’re not comfortable working with PHP, you can use the second method below (although this one’s way better).

Open up your theme’s functions.php file and add the following code, replacing custom_post_type_name with your custom post type’s name:


add_filter( 'pre_get_posts', 'all_cpt_search' );
  function all_cpt_search( $query ) {
  if ( $query->is_search ) {
  $query->set( 'post_type', array( 'post', 'custom_post_type_name' ) );
 }
return $query;
}

Push your changes and have a look. Your CPT should now be showing in your results!

Method 2: modifying your search form

This option doesn’t involve any coding since all you need to do is basically add a hidden form field to your search form markup where your form appears on your site.

Where your site’s search form appears in your theme files, add the hidden input type markup as seen in this example, replacing custom_post_type_name with your custom post type’s name:


<form action="<?php echo home_url( '/' ); ?>">
  <input type="search" name="s" placeholder="Search">
  <input type="submit" value="Search">
  <input type="hidden" name="post_type" value="custom_post_type_name">
</form>

Push your changes and have a look. Again, the first solution is the way to go, but this works, too.

Remember your search results featured images!

Keep in mind that if your search.php template layout includes a featured image thumbnail but your custom post type doesn’t use them, your search results page’s layout may break.

Your template probably looks something like this:


<figure class="featured-image">
  <a href="<?php the_permalink(); ?>">
    <?php the_post_thumbnail(); ?>
  </a>
</figure>

Replace it with this, which will display a default image should no thumbnail be available (this applies to all post types in the query, too):


<figure class="featured-image">
 <a href="<?php the_permalink(); ?>">
  <?php if ( has_post_thumbnail() ) {
   the_post_thumbnail();
  } else { ?>
   <img src="<?php bloginfo('template_directory'); ?>/images/default-thumbnail.jpg" alt="<?php the_title(); ?>">
  <?php } ?>
 </a>
</figure>

Of course, make sure to create and upload your default image!

Have fun!

Discussion

Please note that while I am available to respond to requests for assistance, my work schedule doesn't always permit me to respond immediately.