Если вы будете использовать стандартный поиск интернет-магазина 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
.На этом в общем и всё 🙂
Чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или войдите.
Здравствуйте, этот код позволяет получать результаты по точному соответствию артикула запросу, что круто. Но как прописать, чтобы он выдавал результаты и по частичному совпадению?
Например, в магазине есть вариативный товар, допустим, футболка с артикулом вида 1234.001, где "1234" - "родительский" SKU, а "001", "002" и т.д. - вариации по цвету, размеру, например.
И если я хочу найти эту футболку, мне обязательно вводить полный артикул одной из вариаций, что неудобно (особенно когда я ищу ее как раз для того, чтоб посмотреть точный артикул конкретной вариации). Как сделать, чтобы по запросу "1234" выводились все товары, содержащие данную комбинацию символов в артикуле?
Спасибо)