Помогите пожалуйста, нужно создать расширенный поиск, по произвольным полям.
Установлен WordPress 3. Поиск нужен по отдельному Custom Post Types.
К каждой создаваемой записи присваивается около 20 произвольных полей "country", "city", "index" и т.п. Нужно сделать по всему этому хозяйству расширенный поиск, т.е. каждое произвольное поле мы должны запрашивать из его input`a. Сейчас есть код, который частично решает задачу, из одного поля формы можно искать по любым произвольным полям. Вот этот код:
<?php
/*
Plugin Name: Search Custom Fields new
Plugin URI: http://guff.szub.net/search-custom-fields/
Description: Search post custom field values. Also provides for an alternative theme 'search' template: search-custom.php.
Author: Kaf Oseo
Version: 12
Author URI: http://szub.net
Copyright (c) 2006 Kaf Oseo (http://szub.net)
Search Custom Fields is released under the GNU General Public License
(GPL) http://www.gnu.org/licenses/gpl.txt
This is a WordPress 2 plugin (http://wordpress.org).
*/
function custom_search_join($join) {
if ( is_search() && isset($_GET['s'])) {
global $wpdb;
$join = " LEFT JOIN $wpdb->postmeta ON $wpdb->posts.ID = $wpdb->postmeta.post_id ";
}
return($join);
}
add_filter('posts_join', 'custom_search_join');
function custom_search_groupby($groupby) {
if ( is_search() && isset($_GET['s'])) {
global $wpdb;
$groupby = " $wpdb->posts.ID ";
}
return($groupby);
}
add_filter('posts_groupby', 'custom_search_groupby');
function custom_search_where($where) {
$old_where = $where;
if (is_search() && isset($_GET['s'])) {
global $wpdb;
$customs = Array('number', 'creditor', 'index', 'country', 'adress', 'uch', 'other', 'rek', 'osn', 'nprot', 'yur', 'date', 'inn', 'city');
$query = '';
$var_q = stripslashes($_GET['s']);
if ($_GET['sentence']) {
$search_terms = array($var_q);
}
else {
preg_match_all('/".*?("|$)|((?<=[\\s",+])|^)[^\\s",+]+/', $var_q, $matches);
$search_terms = array_map(create_function('$a', 'return trim($a, "\\"\'\\n\\r ");'), $matches[0]);
}
$n = ($_GET['exact']) ? '' : '%';
$searchand = '';
foreach((array)$search_terms as $term) {
$term = addslashes_gpc($term);
$query .= "{$searchand}(";
$query .= "($wpdb->postmeta.meta_key LIKE '{$n}{$term}{$n}')";
$query .= " OR ($wpdb->postmeta.meta_value LIKE '{$n}{$term}{$n}')";
foreach($customs as $custom) {
$query .= " OR (";
$query .= "($wpdb->postmeta.meta_key = '$custom')";
$query .= " AND ($wpdb->postmeta.meta_value LIKE '{$n}{$term}{$n}')";
$query .= ")";
}
$query .= ")";
$searchand = ' AND ';
}
$term = $wpdb->escape($var_q);
if (!$_GET['sentense'] && Count($search_terms) > 1 && $search_terms[0] != $var_q) {
$search .= " OR ($wpdb->postmeta.meta_key LIKE '{$n}{$term}{$n}')";
$search .= " OR ($wpdb->postmeta.meta_value LIKE '{$n}{$term}{$n}')";
}
if (!empty($query)) {
$where = " AND ({$query}) AND ($wpdb->posts.post_status = 'publish') ";
}
}
return($where);
}
add_filter('posts_where', 'custom_search_where');
?>
Т.е. в запросе http://example.com/?s=Россия Москва будут отображены записи которые содержат в произвольном полю "country" – Россия, а в поле "city" – Москва. Мне нужно чтобы запросы можно было делать так http://example.com/?country=россия&city=москва причем, например по "Росс" и "Моск" тоже должны быть релевантные результаты.