Проблема с поиском
Требуется расширить стандартный поиск и искать дополнительно по метаданным. После плясок с бубном я понял как это делается и у меня даже почти получилось, но в объекте запроса появляется странный кусочек кода который всё крашит.
Вот сам запрос
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 и изменить запрос. Там много аргументов можно передать с понятным синтаксимом. А чем всё понятнее, тем проще отлаживать.