По-умолчанию в WordPress есть встроенный достаточно удобный поиск, который однако ищет только в заголовках записей и их содержимом. Если вы работаете с произвольными типами записей, то, скорее всего, используете произвольные поля для сохранения их атрибутов. Например, Свойство произвольного типа записи будет содержать произвольные поля: адрес, город и область. Можно попробовать использовать объект WP_Query с настройкой meta_query, но это не сработает. Если вы не будете использовать атрибут “s”, он перепишет стандартный поиск, а если используете, то не вернет желаемые результаты. Сниппет будет использовать фильтр posts_clauses для инъекции мета запроса, который совмещается со стандартным поисковым параметром WordPress.
Код сниппета
function custom_search_where($pieces) {
// фильтр для выбора запроса поиска
if (is_search() && !is_admin()) {
global $wpdb;
$custom_fields = array('field1','field2');
$keywords = explode(' ', get_query_var('s'));
$query = "";
foreach ($custom_fields as $field) {
foreach ($keywords as $word) {
$query .= "((mypm1.meta_key = '".$field."')";
$query .= " AND (mypm1.meta_value LIKE '%{$word}%')) OR ";
}
}
if (!empty($query)) {
// add to where clause
$pieces['where'] = str_replace("(((wp_posts.post_title LIKE '%", "( {$query} ((wp_posts.post_title LIKE '%", $pieces['where']);
$pieces['join'] = $pieces['join'] . " INNER JOIN {$wpdb->postmeta} AS mypm1 ON ({$wpdb->posts}.ID = mypm1.post_id)";
}
}
return ($pieces);
}
add_filter('posts_clauses', 'custom_search_where', 20, 1);
