Если вы будете использовать стандартный поиск интернет-магазина 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
.На этом в общем и всё 🙂
Чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или войдите.