WordPress как на ладони
Наставник Трепачёв Д.П., phphtml.net wordpress jino

Проблема с поиском

Доброго времени суток.

Требуется расширить стандартный поиск и искать дополнительно по метаданным. После плясок с бубном я понял как это делается и у меня даже почти получилось, но в объекте запроса появляется странный кусочек кода который всё крашит.

Вот сам запрос

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 ), и как от него избавиться (без него всё работает как надо)?
Заранее Благодарю.

campusboy 6 месяцев назад

А почему Вы пошли именно по такому пути? Ведь можно было сделать это с помощью хука pre_get_posts, а в комментах даже есть примеры, как в запрос добавить нужные мета-поля.

ОЙ, простите, не увидел, что у вас так и сделано!

Тогда другой вопрос. Зачем использовать pre_get_posts, если записи выводятся обычно с помощью обычного цикла, то есть можно перед ним вызвать query_post и изменить запрос. Там много аргументов можно передать с понятным синтаксимом. А чем всё понятнее, тем проще отлаживать.

0
Sau3 6 месяцев назад

Нет ответов на этот вопрос.

На вопросы могут отвечать только зарегистрированные пользователи. Регистрация. Вход.