I made some fixes to this code as it doesn’t work anymore.
The following code will search the terms to be LIKE the title OR the content OR the meta_value :
function custom_search_where( $where ) {
if ( is_search() ) {
global $wpdb;
// Overwrite the existing WHERE clause.
$where="";
// Store all search terms into array.
$search_terms = explode( ' ', get_search_query() );
// Tables names.
$type = $wpdb->prefix . "posts.post_type";
$status = $wpdb->prefix . "posts.post_status";
$title = $wpdb->prefix . "posts.post_title";
$content = $wpdb->prefix . "posts.post_content";
$meta_value = $wpdb->prefix . "postmeta.meta_value";
foreach ( $search_terms as $term ) {
$term = trim($term);
$where .= " AND ( ($title LIKE '%$term%') OR ($content LIKE '%$term%') OR ($meta_value LIKE '%$term%') ) ";
}
// As WHERE clause is overwritten, you'll need to specify the post type, the status and/or anything else you need.
// Post Types.
$where .= " AND ($type IN ('post', 'page', ... )) ";
// Post status.
$where .= " AND ($status="publish") ";
}
return $where;
}
add_filter('posts_where', 'custom_search_where', 999);
and
function custom_search_join ($join) {
if( is_search() ) {
global $wpdb;
$join .= " INNER JOIN {$wpdb->postmeta} ON ({$wpdb->posts}.ID = {$wpdb->postmeta}.post_id)";
}
return $join;
}
add_filter('posts_join', 'custom_search_join' );