Hiển thị sản phẩm nổi bật trong WooCommerce trên themes

Hiển thị sản phẩm nổi bật trong WooCommerce trên themes

Hiển thị sản phẩm nổi bật là một trong những phương pháp tùy chỉnh khá hay để người dùng dễ dàng chọn lựa những sản phẩm nổi bật trên trang chủ. Nếu sử dụng các themes WordPress mua bạn dễ dàng thực hiện điều này và nó cũng sẽ nâng cấp theo sự nâng cấp của WooCommerce, nhưng nếu tự viết theme thì bạn cần tìm hiểu rất nhiều vì dường như WooCommerce rất mơ hồ và không muốn hỗ trợ những theme ngoài.

Hiển thị sản phẩm nổi bật trên WooCommerce trước phiên bản 3.0

Trong các phiên bản cũ trước phiên bản 3.0 của WooCommerce thì việc hiển thị nó dễ dàng hơn bằng đoạn code sau:

<?php
   $args2 = array(
   'post_type' => 'product', 
   'meta_key' => '_featured', 
   'meta_value' => 'yes', 
   'posts_per_page' => 8);
   $loop2 = new WP_Query( $args2 );
   while ( $loop2->have_posts() ) : $loop2->the_post(); global $product; ?>

   //Hiển thị sản phẩm nổi bật

<?php 
   endwhile;
   wp_reset_query(); 
 ?>

Các phiên bản cũ lưu thông tin sản phẩm nổi bật ở trong bảng dữ liệu postmeta. với 2 trường là meta_key và meta_value. Tuy nhiên sau một thời gian sau mình viết themes lại cho người ta và nâng cấp phiên bản WooCommerce mới thì code này không còn hoạt động được nữa.

Hành trình truy tìm nguyên nhân

Mình đã đi tìm hiểu nguyên nhân thì kết quả sau một hồi kiểm tra là sản phẩm này sau khi được tích dấu sao (đánh dấu sản phẩm nổi bật) thì không được lưu bảng postmeta nữa. Tìm mãi thì cuối cùng mình thấy cái từ featured nó nằm ở bảng terms.

Manh mối đầu tiên

Manh mối đầu tiên

Vào bảng term_taxonomy thì thấy ID của terms này liên kết với một taxonomy là product_visibility. Nhìn qua mục count thì thấy nó hiển thị số 8 (trong sản phẩm mình đánh dấu sao 8 cái) vậy là chắc chắn biết nó có liên quan rồi.

Lần theo dấu vết

Để chắc chắn hơn thì mình vào bảng term_relationships và tìm ra những term_taxonomy_id là 8

Đây là thành kết quả mong muốn

Đây là thành kết quả mong muốn

Như vậy mình đã biết các terms có ID 8 là những sản phẩm nổi bật. Và biết được ID của các sản phẩm đang nằm trong term này. Việc tiếp theo là viết lại câu truy vấn để lấy nó ra thôi.

Hiển thị sản phẩm nổi bật trên WooCommerce sau phiên bản 3.0

Phiên bản WooCommerce mình đang sử dụng hiện tại là 3.0.7, mình không chắc cách này có còn sử dụng được lâu không nhưng đến phiên bản hiện tại thì nó hoàn toàn hoạt động được. Code như sau.

  $feat_pro = new WP_Query( array('posts_per_page' => 8,
                                'tax_query' => array(
                                                     array(
                                                          'taxonomy' => 'product_visibility',
                                                          'field' => 'name',
                                                          'terms' => 'featured',
                                                          'operator' => 'IN'),
                                                     ),
                          ) );

  while ( $feat_pro->have_posts() ) : $feat_pro->the_post();?>
      //Hiển thị sản phẩm nổi bật
  <?php endwhile; wp_reset_query(); ?>

Cái đoạn Query trên nó sẽ trả về một câu truy vấn csdl như thế này!

SELECT SQL_CALC_FOUND_ROWS tp_posts.ID FROM tp_posts LEFT JOIN tp_term_relationships ON (tp_posts.ID = tp_term_relationships.object_id) 
WHERE 1=1 AND ( tp_term_relationships.term_taxonomy_id IN (8) ) AND tp_posts.post_type = 'product' AND (tp_posts.post_status = 'publish' OR tp_posts.post_status = 'private') 
GROUP BY tp_posts.ID ORDER BY tp_posts.post_date DESC LIMIT 0, 8

Bạn có thể phân tích thêm để hiểu, mình sẽ không giải thích nữa vì cái này thuộc về PHP căn bản. Nếu bạn chưa học về PHP căn bản có thể tham khảo các bài viết về PHP căn của mình trong mục Lập trình.

Về sau nếu những phiên bản mới có thay đổi bạn cũng có thể dựa vào những cách phân tích dữ liệu trên như mình để tìm ra phương pháp giải quyết tốt nhất.

Chúc các bạn thành công.

Các bài liên quan

Tuấn ĐC

Tuấn ĐC

Tôi thích tự do, làm những gì mình thích, thích đi nhiều nơi và học được nhiều thứ.

Liên hết bài viết: ""