Как включить поиск товаров по артикулу

Если вы будете использовать стандартный поиск интернет-магазина WooCommerce на сайте, то вы можете заметить, что он не будет находить никаких товаров, если вы будете искать их по артикулам.

Тем не менее было бы очень удобно добавить такую возможность поиска, что мы и сделаем в этом гайде.

стандартный поиск WooCommerce не работает по артикулам товаров

Прежде, чем мы перейдём к коду, хочу порекомендовать вам свой курс по созданию темы с нуля для интернет-магазина на WooCommerce.

А теперь код, который, я надеюсь, вы знаете, куда вставлять.

add_filter( 'posts_search', 'true_poisk_po_sku', 25, 2 );
 
function true_poisk_po_sku( $search, $wp_query ) {
 
	global $wpdb;
	// ничего не делаем в админке
	if( is_admin() ) {
		return $search;
	}
	// ничего не делаем, если не страница поиска
	if( ! is_search() ) {
		return $search;
	}
	// чекаем наличие строки поиска и тип поста
	if(
		! isset( $wp_query->query_vars[ 's' ] )
		|| ( ! is_array( $wp_query->query_vars[ 'post_type' ] ) && 'product' !== $wp_query->query_vars[ 'post_type' ] )
		|| ( is_array( $wp_query->query_vars[ 'post_type' ] ) && ! in_array( 'product', $wp_query->query_vars[ 'post_type' ] ) )
	) {
		return $search;
	}
	// получаем ID товара по точному соответствию артикула в поиске
	$product_id = wc_get_product_id_by_sku( $wp_query->query_vars[ 's' ] );
	if( ! $product_id ) {
		return $search;
	}
	// получаем сам товар
	$product = wc_get_product( $product_id );
	// если это вариативный товар, то нам нужен ID родительского
	if( $product->is_type( 'variation' ) ) {
		$product_id = $product->get_parent_id();
	}
	// делаем замены в SQL запросе
	return str_replace(
		"AND (((",
		"AND (({$wpdb->posts}.ID IN ({$product_id})) OR ((",
		$search
	);
}

Несколько комментариев по коду:

  • Хука pre_get_posts недостаточно, чтобы модифицировать поиск, поэтому мы используем posts_search.
  • Внутри функции мы используем несколько проверок условными тегами, например is_admin(), а также is_search().
  • Используем функцию wc_get_product_id_by_sku() для получения ID товара для SQL-запроса.

На этом в общем и всё 🙂

Миша

Впервые познакомился с WordPress в 2009 году. Организатор и спикер на конференциях WordCamp. Преподаватель в школе Нетология.

Пишите, если нужна помощь с сайтом или разработка с нуля.

Чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или войдите.

Миша Рудрастых и WordPress

Полезности из мира WordPress и жизни студии.

Мой телеграм-канал