Построение расширенного поиска (текст, теги, категории, настраиваемые поля) – Получение неправильного SQL-запроса

Я создаю расширенную форму поиска, где я хочу использовать обычное текстовое поле, теги, категории, а также некоторые настраиваемые поля. Я создал форму со всеми значениями, и я создал параметры url, чтобы сделать ее более приятной, и я использую pre_get_posts для добавления настраиваемых полей, если это необходимо … но запрос не тот, который я ожидаю, и это действительно странно на мой взгляд ,

Я объясню шаги, которые я сделал:

1) создать форму (я пропущу эту часть)

2) сделайте это лучше, я строю url, и я использую следующий код, чтобы переписать и сделать это:

URL: "/cerca/text/$text/provincia/$provincia/comarca/$comarca/municipi/$municipi/filtres/$filtres/"

Код перезаписи

 add_action('init', 'create_cerca_url_querystring_parameters'); function create_cerca_url_querystring_parameters() { add_rewrite_rule( '^cerca\/text\/([a-zA-Z0-9-+]+)\/provincia\/([a-zA-Z0-9-+]+)\/comarca\/([a-zA-Z0-9-+]+)\/municipi\/([a-zA-Z0-9-+]+)\/filtres\/([a-zA-Z0-9-+,]+)\/?', 'index.php?s=$matches[1]&provincia=$matches[2]&category_name=$matches[3]&municipi=$matches[4]&tag=$matches[5]', 'top' ); } на add_action('init', 'create_cerca_url_querystring_parameters'); function create_cerca_url_querystring_parameters() { add_rewrite_rule( '^cerca\/text\/([a-zA-Z0-9-+]+)\/provincia\/([a-zA-Z0-9-+]+)\/comarca\/([a-zA-Z0-9-+]+)\/municipi\/([a-zA-Z0-9-+]+)\/filtres\/([a-zA-Z0-9-+,]+)\/?', 'index.php?s=$matches[1]&provincia=$matches[2]&category_name=$matches[3]&municipi=$matches[4]&tag=$matches[5]', 'top' ); } 

3) функция post_get_post

 add_action('pre_get_posts', 'advanced_search_query'); function advanced_search_query($query) { if (! is_admin() && $query->is_search && $query->is_main_query()) { //Get Parameteres //$text = getSearchParameter('text'); $provincia = getSearchParameter('provincia'); $municipi = getSearchParameter('municipi'); //Configuration $query->set('post_type', array( 'post' )); $query->set('post_status', array( 'publish' )); if(!empty($provincia) && !empty($municipi)){ $mainArray = array('relation' => 'OR'); //Set Parameters $provArray = array( 'key' => 'provincia', 'value' => $provincia, 'compare' => 'LIKE' ); array_push($mainArray, $provArray); $municipiArray = array( 'key' => 'municipi', 'value' => $municipi, 'compare' => 'LIKE' ); array_push($mainArray, $municipiArray); $query->set('meta_query', $mainArray); var_dump($mainArray); } } } /** * Return the given parameter value from the search URL */ function getSearchParameter($parametre, $decode=TRUE) { $valueToReturn = ''; $path = $_SERVER['REQUEST_URI']; $split = explode("/", $path); $key = array_search($parametre, $split); if ($key > 0) { $value = $split[$key+1]; $urlValues = array("text", "provincia", "comarca", "municipi", "filtres","none",""); if (!in_array($value, $urlValues)) { if($decode){ $valueToReturn = urldecode($value); }else{ $valueToReturn = $value; } } } return $valueToReturn; } 

4), то в search.php я печатаю результат запроса, используя

 <?php echo $GLOBALS['wp_query']->request; ?> 

И вот тут мое удивление приходит, и я не знаю, как выглядит запрос:

Запрос с муниципалитетами и провинциями:

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id) ГДЕ 1 = 1 И (0 = 1) И ((wp_postmeta.meta_key = 'провинция' И wp_postmeta.meta_value LIKE '% barcelona%' ) ИЛИ (wp_postmeta.meta_key = 'municipi' И wp_postmeta.meta_value LIKE '% sant%')) И wp_posts.post_type = 'post' AND ((wp_posts.post_status = 'publish')) GROUP BY wp_posts.ID ORDER BY wp_posts .post_date DESC LIMIT 0, 18

Другой запрос с текстом: / cerca / text / test / provincia / none / comarca / none / municipi / none / filtres / none /

SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1 = 1 AND (0 = 1 AND 0 = 1) AND (((wp_posts.post_title LIKE '% test%') ИЛИ (wp_posts.post_excerpt LIKE '% test%') ИЛИ (wp_posts .post_content LIKE '% test%'))) И wp_posts.post_type = 'post' AND ((wp_posts.post_status = 'publish')) GROUP BY wp_posts.ID ORDER BY wp_posts.post_title LIKE '% test%' DESC, wp_posts .post_date DESC LIMIT 0, 18

Вот мой вопрос:

Кто-нибудь знает, почему я получаю этот SQL? если я удалю условие (0 = 1), то он работает, но я не знаю, почему он там. Я делаю что-то неправильно ? Я просто хочу фильтровать провинцию и муниципалитет, если эти параметры установлены, любая идея?

Вдохновленный на следующих должностях:

Как использовать настраиваемое поле для поиска типа публикации WordPress?

Расширенная форма поиска с фильтрами для пользовательских таксономий и настраиваемых полей

Пользовательский поиск настраиваемого типа сообщений, настраиваемых полей мета и поиска

Заранее спасибо,

РЕШЕНИЕ:

Я опубликую свое решение и объясню, в чем проблема, и я надеюсь, что этот пост может помочь кому-то в будущем.

Как мы говорим в небольших комментариях, проблема заключалась в том, что я отправлял не существующую таксономию по ошибке, и это вызывало И (0 = 1).

Чтобы исправить всю проблему, я создал add_rewrite_rule для каждого случая, когда у меня есть параметр или нет, как в следующем примере:

 add_rewrite_rule( '^cerca/comarca/([a-zA-Z0-9-+]+)/?', 'index.php?s=&category_name=$matches[1]', 'top' ); add_rewrite_rule( '^cerca/municipi/([a-zA-Z0-9-+]+)/?', 'index.php?s=&municipi=$matches[1]', 'top' ); add_rewrite_rule( '^cerca/provincia/([a-zA-Z0-9-+]+)/?', 'index.php?s=&provincia=$matches[1]', 'top' ); add_rewrite_rule( '^cerca/provincia/([a-zA-Z0-9-+]+)/comarca/([a-zA-Z0-9-+]+)/municipi/([a-zA-Z0-9-+]+)/?', 'index.php?s=&provincia=$matches[1]&category_name=$matches[2]&municipi=$matches[3]', 'top' ); 

….

Спасибо @ janh2 за все полезные комментарии.