Intereting Posts
Могу ли я изменить пул страницы моего архива на пользовательский тип сообщения? Ссылки на странице часто задаваемых вопросов не работают Миграция хостов, 500 ошибок и проблем с подключаемыми модулями Сравнить текущую должность Категория в меню выбора Быстрая публикация публикации post hook Tinymce не работает так, как должно быть? Как перенаправить на страницу с паролем на основе пароля, введенного на экране входа в систему Показывать детей категории, которым назначено сообщение Простая математическая викторина или Captcha, чтобы скрыть форму запроса whois Проблема с классом, фильтрами и обратными вызовами Белая пустая страница при обновлении и публикации страницы / публикации Настройка таблиц WP или добавление новых? wp enqueue style и глубину таблицы стилей Ввод файлов возвращает значение null в массиве параметров темы Получение комментариев от пользователя specefic

Использование tax_query создает 1 = 0 или 1 = 1 в запросе $ wp_query->

Это моя первая попытка изменить основной запрос, используя действие / фильтр pre_get_posts

Это функция, которая в настоящее время подключена к ней:

 function advanced_product_search_filter($query) { if(!is_admin() && is_main_query() && is_search() && $query->query_vars['post_type'] == 'product') { $keyword = $_GET['s']; if($_GET['exactly']) $keyword = $_GET['s'] . ' "'. $_GET['exactly'] . '"'; if($_GET['without']) { $excluded = exclude_product_keyword_search($_GET['without'], $_GET['pname'], $_GET['pcode'] ); $query->set('post__not_in', $excluded); } if($_GET['pname']) $query->set('s', $keyword); else $query->set('s', ''); if($_GET['pcode']) { $tax_queries = $query->get('tax_query'); $tax_queries[] = array( array( 'taxonomy' => 'pa_ordering-code', 'field' => 'name', 'terms' => array($keyword), 'operator' => 'LIKE' ) ); $query->set('tax_query', $tax_queries); } } } 

Это плагин, построенный поверх установки WooCommerce . Таким образом, в основном эта функция пытается поддерживать поиск продукта WooCommerce либо через стандартный поиск (заголовок и контент), либо поиск атрибутов по пользовательскому атрибуту, называемому Ordering Code который является pa_ordering-code в таблице term_taxonomy

Другие части кода работают отлично, я могу без проблем изменить s и post__not_in vars, но если я попытаюсь использовать tax_query , запрос, похоже, сломается.

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

 ?s=foo&post_type=product&pname=1&pcode=1&without=non&exactly=foo+bar 

WHERE предложение WHERE , я вижу следующее:

 AND wp_posts.ID NOT IN (219) AND 0 = 1 AND ( ( (wp_posts.post_title LIKE '%foo%') OR (wp_posts.post_content LIKE '%foo%') ) AND ( (wp_posts.post_title LIKE '%foo bar%') OR (wp_posts.post_content LIKE '%foo bar%') ) ) AND wp_posts.post_type = 'product' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private') AND ( ( wp_postmeta.meta_key = '_visibility' AND CAST(wp_postmeta.meta_value AS CHAR) IN ('visible','search') ) ) 

Обратите внимание на AND 0 = 1 ? Когда я сбрасываю предложение JOIN , я уверен, что параметр tax_query не интерпретируется должным образом, так как я вижу только таблицу postmeta . Нет terms , term_relationships или term_taxonomy table.

И я также попробовал просто перезаписать существующий tax_query (если есть), выполнив это:

 $args = array( array( 'taxonomy' => 'pa_ordering-code', 'field' => 'name', 'terms' => array($keyword), 'operator' => 'LIKE' ) ); $query->set('tax_query', $args); 

Но я все еще не мог заставить его работать. Любые идеи относительно того, что я могу делать неправильно?

0 = 1 происходит, когда термины не существуют.

Вы создаете запрос для некоторого набора терминов. Прежде чем он сможет добавить SQL к этому основному запросу, он сначала выполняет вторичный запрос, чтобы получить term_id для соответствующих терминов. Если ни один не найден, то вместо этого он возвращает 0 = 1, чтобы сократить основной запрос, потому что никакие условия не соответствуют запросу.

Проверьте определение таксономии «pa_ordering-code».

Похоже, что у вас может быть неправильное значение в атрибуте «query_var».

Этот код может привести к аналогичному эффекту:

  register_taxonomy(... 'query_var' => true, )); 

Если это так, удалите (или измените) часть query_var и проверьте еще раз.