I have been looking for a way to search use the search_query with the WP_Query
and include taxonomy terms.
Many solutions only works using the function is_search()
. Using the tax_query
for me was not an option here as I wanted to use the search query field “s
” to search under the post_content, title and be able to work with other search plugins as well.
The following filter will help you to achieve that:
function extend_search_taxonomy_terms( $search, $wp_query ) {
global $wpdb;
if ( empty($search) ) {
return $search;
}
$terms = $wp_query->query_vars['s'];
$exploded = explode( ' ', $terms );
if( $exploded === FALSE || count( $exploded ) == 0 ) {
$exploded = array( 0 => $terms );
}
$search = '';
foreach( $exploded as $tag ) {
$search .= " AND (
( $wpdb->posts.post_title LIKE '%$tag%' )
OR EXISTS
( SELECT * FROM $wpdb->term_relationships
LEFT JOIN $wpdb->terms ON $wpdb->term_relationships.term_taxonomy_id = $wpdb->terms.term_id
WHERE $wpdb->terms.name LIKE '%$tag%' AND $wpdb->term_relationships.object_id = $wpdb->posts.ID
)
)";
}
return $search;
}
Then you have to add this filter whenever you need it:
// Add your filter
add_filter('posts_search', 'extend_search_taxonomy_terms', 500, 2);
$args = array(
's' => 'foo',
'post_type' => 'my-post-type'
);
$the_query = new WP_Query($args);
if ($the_query->have_posts()) {
// Loop your posts
}
// Remove your filter
remove_filter('posts_search', 'extend_search_taxonomy_terms', 500, 2);