Проблема с поиском
Требуется расширить стандартный поиск и искать дополнительно по метаданным. После плясок с бубном я понял как это делается и у меня даже почти получилось, но в объекте запроса появляется странный кусочек кода который всё крашит.
Вот сам запрос
WP_Query Object ( ... [request] => SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id ) WHERE 1=1 AND ( 0 = 1 ) AND (((wp_posts.post_title LIKE '%prod%') OR (post_excerpt LIKE '%prod%') OR (wp_posts.post_excerpt LIKE '%prod%') OR (wp_posts.post_content LIKE '%prod%'))) AND (wp_posts.post_password = '') AND ( ( wp_postmeta.meta_key = '_brand_meta_value_key' AND wp_postmeta.meta_value = '39' ) OR ( wp_postmeta.meta_key = '_brand_meta_value_key' AND wp_postmeta.meta_value = '41' ) OR ( wp_postmeta.meta_key = '_visibility' AND wp_postmeta.meta_value IN ('visible','search') ) ) AND wp_posts.post_type = 'product' AND (wp_posts.post_status = 'publish') GROUP BY wp_posts.ID ORDER BY wp_posts.menu_order ASC, wp_posts.post_title ASC LIMIT 0, 6 ... )
то есть сам sql построился верно но вот этот кусочек всё портит
AND ( 0 = 1 )
при этом дефолтный поиск его не содержит хотя там и есть поиск по мета атрибуту(_visibility).
Вот мой код для functions.php
//Соответственно регистрация переменных add_filter( 'query_vars', 'register_query_vars' ); function register_query_vars( $vars ) { $vars[] = 'wc_brand'; //много переменных return $vars; } //соответственно допил поиска add_action( 'pre_get_posts', 'sm_pre_get_posts', 1 ); function sm_pre_get_posts( $query ) { if ( is_admin() || ! $query->is_main_query() || ! is_post_type_archive( 'product' ) ) { return; } $meta_query = []; $wc_brand = get_query_var( 'wc_brand' ); if ( is_array( $wc_brand ) ) { foreach ( $wc_brand as $brand ) { if ( ! empty( $brand ) ) { $meta_query[] = array( 'key' => '_brand_meta_value_key', 'value' => $brand, 'compare'=>'=' ); } } } if ( count( $meta_query ) > 1 ) { $meta_query['relation'] = 'OR'; } if ( count( $meta_query ) > 0 ) { $query->set( 'meta_query', $meta_query ); } }
Собственно вопрос: откуда в построенном sql берётся код сомнительной работоспособности AND ( 0 = 1 ), и как от него избавиться (без него всё работает как надо)?
Заранее Благодарю.
А почему Вы пошли именно по такому пути? Ведь можно было сделать это с помощью хука pre_get_posts, а в комментах даже есть примеры, как в запрос добавить нужные мета-поля.
ОЙ, простите, не увидел, что у вас так и сделано!
Тогда другой вопрос. Зачем использовать pre_get_posts, если записи выводятся обычно с помощью обычного цикла, то есть можно перед ним вызвать query_post и изменить запрос. Там много аргументов можно передать с понятным синтаксимом. А чем всё понятнее, тем проще отлаживать.