Người Viết : ViKiMi Editor

Truy vấn sản phẩm WooCommerce sử dụng WP_Query không khó, đem lại hiệu cao nhất
Khi phát triển một WooCommerce Store chắc hẳn điều chúng ta cần thiết làm đó là thực hiện truy vấn sản phẩm. Với việc thực hiện truy vấn sản phẩm theo ý muốn sẽ giúp có thể tạo cách hiển thị sản phẩm cần thiết, những sản phẩm nổi bật cho cửa hàng. Vì vậy, việc thực hiện truy vấn sản phẩm luôn được chú ý và thực hiện trong khi phát triển.
Mục đích tạo ra các truy vấn giúp chúng ta có thể :
+ Hiển thị các sản phẩm theo các danh mục hoặc nhóm sản phẩm đúng yêu cầu
+ Hiển thị các sản phẩm đúng ý đồ thiết kế
+ Tạo một Gian hàng với những sản phẩm nổi bật theo từng thời gian trong năm mua sắm
+ Các sản phẩm được bố cục hợp lý etc…
Vậy chúng ta có khó khăn khi tạo các truy vấn sản phẩm với WooCommerce?
Câu trả lời là không hề khó khăn. Tất cả các câu truy vấn sản phẩm cũng sẽ được thực hiện giống như khi bạn thực hiện ở một trang WordPress thông thường.
Do đó, thật dễ dàng để tiếp cận vấn đề này.
Chúng ta sẽ có một đoạn mã để truy vấn dữ liệu như sau :
<?php
$arg = array(
'posts_per_page' => 10,
'post_type' => array('product', 'product_variation'),
'meta_query' => array(
'relation' => 'AND',
array(
'relation' => 'OR',
array(
'key' => '_price',
'value' => array( 20, 100 ),
'compare' => 'BETWEEN',
'type' => 'NUMERIC'
),
array(
'key' => '_sales_price',
'value' => 15,
'compare' => '>=',
'type' => 'NUMERIC'
)
),
array(
'key' => '_stock_status',
'value' => 'instock',
'compare' => '=',
),
),
);
$wc_query = new WP_Query($arg);
?>
<?php if ($wc_query->have_posts()) : ?>
<?php while ($wc_query->have_posts()) : $wc_query->the_post(); ?>
<?php the_title(); ?>
<?php endwhile; ?>
<?php wp_reset_postdata(); ?>
<?php else: ?>
<p>
<?php
wc_get_template_part( 'content', 'none' );
// _e( 'No Products' ); ?>
</p>
<?php endif; ?>
[ + ] Nếu bạn muốn thêm đoạn mã mày vào phần Shop Page ( Thông thường khi bạn ít tuỳ chỉnh thì có thể đặt tại Archive-product.php ) thì chúng ta sẽ có như sau :
<?php
/**
* The Template for displaying product archives, including the main
* shop page which is a post type archive
*
* This template can be overridden by copying it to
* yourtheme/woocommerce/archive-product.php.
*
* @see https://docs.woocommerce.com/document/template-structure/
* @package WooCommerce\Templates
* @version 3.4.0
*/
defined( 'ABSPATH' ) || exit;
get_header( 'shop' );
/**
* Hook: woocommerce_before_main_content.
*
* @hooked woocommerce_output_content_wrapper - 10 (outputs opening
* divs for the content)
* @hooked woocommerce_breadcrumb - 20
* @hooked WC_Structured_Data::generate_website_data() - 30
*/
do_action( 'woocommerce_before_main_content' );
?>
<header class="woocommerce-products-header">
<?php if ( apply_filters( 'woocommerce_show_page_title', true ) ) : ?>
<h1 class="woocommerce-products-header__title page-title">
<?php woocommerce_page_title(); ?></h1>
<?php endif; ?>
<?php
/**
* Hook: woocommerce_archive_description.
*
* @hooked woocommerce_taxonomy_archive_description - 10
* @hooked woocommerce_product_archive_description - 10
*/
do_action( 'woocommerce_archive_description' );
?>
</header>
<?php
if ( woocommerce_product_loop() ):
/**
* Hook: woocommerce_before_shop_loop.
*
* @hooked woocommerce_output_all_notices - 10
* @hooked woocommerce_result_count - 20
* @hooked woocommerce_catalog_ordering - 30
*/
do_action( 'woocommerce_before_shop_loop' );
woocommerce_product_loop_start();
if ( wc_get_loop_prop( 'total' ) ) {
while ( have_posts() ) {
the_post();
/**
* Hook: woocommerce_shop_loop.
*/
do_action( 'woocommerce_shop_loop' );
wc_get_template_part( 'content', 'product' );
}
}
?>
<?php
woocommerce_product_loop_end();
/**
* Hook: woocommerce_after_shop_loop.
* @hooked woocommerce_pagination - 10
*/
do_action( 'woocommerce_after_shop_loop' );
<?php
$arg = array(
'posts_per_page' => 10,
'post_type' => array('product', 'product_variation'),
'meta_query' => array(
'relation' => 'AND',
array(
'relation' => 'OR',
array(
'key' => '_price',
'value' => array( 20, 100 ),
'compare' => 'BETWEEN',
'type' => 'NUMERIC'
),
array(
'key' => '_sales_price',
'value' => 15,
'compare' => '>=',
'type' => 'NUMERIC'
)
),
array(
'key' => '_stock_status',
'value' => 'instock',
'compare' => '=',
),
),
);
$wc_query = new WP_Query($arg);
?>
<?php if ($wc_query->have_posts()) : ?>
<?php while ($wc_query->have_posts()) : $wc_query->the_post(); ?>
<p><span> News : </span> <?php the_title(); ?> </p>
<?php endwhile; ?>
<?php wp_reset_postdata(); ?>
<?php else: ?>
<p>
<?php
wc_get_template_part( 'content', 'none' );
// _e( 'No Products' ); ?>
</p>
<?php endif; ?>
else:
/**
* Hook: woocommerce_no_products_found.
*
* @hooked wc_no_products_found - 10
*/
do_action( 'woocommerce_no_products_found' );
endif;
/**
* Hook: woocommerce_after_main_content.
*
* @hooked woocommerce_output_content_wrapper_end - 10 (outputs
* closing divs for the content)
*/
do_action( 'woocommerce_after_main_content' );
/**
* Hook: woocommerce_sidebar.
*
* @hooked woocommerce_get_sidebar - 10
*/
do_action( 'woocommerce_sidebar' );
get_footer( 'shop' );
Như vậy, Chúng ta đã thực hiện một truy vấn sản phẩm thật đơn giản với WooCommerce. Kết quả chúng ta sẽ có một hiển thị tốt hơn so với thông thường. Do nhu cầu phát triển thì chúng ta sẽ có những truy vấn phù hợp hơn, cũng phụ thuộc vào các bạn bố trí các Categories (Danh Mục SP) hoặc các Tags (Thẻ Sản Phẩm). Truy vấn sản phẩm sẽ luôn cần thiết khi bạn muốn phát triển Shop đủ mạnh.
[ + ] Truy vấn sản phẩm cũng là một cách để chúng ta lọc sản phẩm tối ưu.