#13 – Custom WP_Query – Hiển thị bài viết liên quan

0 3

Trong bài viết này, chúng ta sẽ thực hiện tính năng hiển thị bài viết liên quan bằng cách tùy chỉnh lại đối tượng WP_Query mà WordPress cung cấp.

Video Custom WP_Query – Hiển thị bài viết liên quan

Hướng dẫn chi tiết

Ý tưởng về bài viết liên quan

Chúng ta có một số điều kiện để chọn bài viết liên quan như sau

  • Cùng chuyên mục – category
  • Cùng thẻ – tag
  • Cùng một tác giả – author
  • Sự kết hợp của những yếu tố trên

Bài viết liên quan mình chọn để hiển thị là cùng chuyên mục HOẶC cùng một nhóm tag. Lưu ý cho mình chữ HOẶC nhé. Nếu các bạn làm theo chữ VÀ thì ý nghĩa và kết quả sẽ rất khác biệt đó. Đó là logic của mỗi người, các bạn có thể xác định bài viết liên quan theo bất cứ điều kiện nào bạn muốn.

WP_Query

Để thao tác truy xuất, hiển thị dữ liệu bên trong vòng lặp, WordPress cung cấp cho chúng ta lớp WP_Query với rất nhiều các phương thức được viết sẵn.

Chúng ta không nên tác động, thay đổi trực tiếp các thuộc tính bên trong WP_Query, tức là sửa nguồn core WordPress. Thay vào đó, để tùy chỉnh các truy xuất hay thao tác với dữ liệu, chúng ta sẽ dùng các phương thức, thay vào các đối số vào các phương thức đó. Khi khởi tạo đối tượng WP_Query, chúng ta cần truyền vào 1 mảng tham số, để thay đổi truy vấn theo ý muốn của chúng ta.

Một số truy vấn thường dùng

Do chúng ta cần truy vấn theo cả chuyên mục (Category) và thẻ (Tag) nên sẽ dùng Truy vấn theo Taxonomy nhé.

Mảng chứa id chuyên mục và mảng chứa id thẻ của bài viết hiện tại (không nhất thiết phải là id, các bạn có thể dùng slug … Tất nhiên, lúc đó cấu trúc truy vấn cũng phải thay đổi cho phù hợp).

 
$categories = get_the_category() ? get_the_category() : array();
$tags = get_the_tags( ) ? get_the_tags( ) : array();
$cat_id_list = array();
foreach($categories as $cat){
     array_push($cat_id_list, $cat->term_id);
}
$tag_id_list = array();
foreach($tags as $tag){
     array_push($tag_id_list, $tag->term_id);
}

Khởi tạo đối tượng $rl_posts_query

 
$rl_posts_query = new WP_Query([
     'post_type' => 'post',
     'posts_per_page'     => 2,
     'post__not_in'      => $post_not_in_id,
     'tax_query' => [
          'relation' => 'OR',
           [
                'taxonomy' => 'category',               
                'field' => 'id',                    
                'terms' => $cat_id_list,
                'include_children' => true, 
                'operator' => 'IN'    
           ],
           [
                 'taxonomy' => 'tag',               
                 'field' => 'id',                    
                  'terms' => $tag_id_list,     
                  'include_children' => true, 
                  'operator' => 'IN'
           ]
     ]
]);

Lưu ý:

Trong tax_query, các bạn để ý relation OR, có nghĩa là HOẶC về mặt LOGIC. post__not_in để loại bài viết đã hiển thị ra khỏi danh sách kết quả, tránh trùng lặp

WordPress hỗ trợ truy vấn rất đa dạng, ngay cả mảng id chuyên mục hay id thẻ. Nếu bạn để số dương, WordPress sẽ hiểu đó là những chuyên mục cần tìm kiếm. Nếu bạn điền id dạng số âm, WordPress sẽ tự động hiểu và xem đó là chuyên mục cần loại bỏ. Do đó, bạn nên đọc thật kỹ phần này trong trang dev của WordPress

Vòng lặp bài viết của chúng ta có sự thay đổi một chút khi gọi các phương thức have_posts, the_post. Do sử dụng đối tượng truy vấn tùy chỉnh, nên chúng ta cần viết dạng đầy đủ là $rl_posts_query->have_posts() chứ không viết tắt như khi sử dụng $wp_Query mặc định của WordPress.

"Thăm ngàn, kẹp ngần nhưng vẫn không đủ chai ni (trả nợ)" nên dành vài dòng cho QUẢNG CÁO

Các bạn cần hosting PHP - WordPress nhanh, rẻ và dễ sử dụng có thể chọn Azdigi nhé.
Link đăng ký: https://my.azdigi.com/aff.php?aff=1612
Nếu các bạn đăng ký hosting từ link quảng cáo, mình sẽ có một ít tiền để duy trì và "chai ni".

Tránh trùng lặp bài viết

Nếu chúng ta chỉ chạy câu truy vấn như trên thì sẽ có một vấn đề xảy ra. Bài viết nằm trong danh sách bài viết liên quan có thể sẽ trùng với bài viết hiện tại. Do đó, khi truy vấn, các bạn cần loại bỏ bài viết hiện tại ra và chúng ta sẽ dùng id để loại ra.

$post_not_in_id = array();
array_push($post_not_in_id,get_the_ID());

Reset lại đối tượng $wp_query mặc định

Các bạn cần reset lại đối tượng $wp_query trở về truy vấn mặc định của WordPress sau khi đã lặp xong các bài viết bằng hàm wp_reset_query . Nếu cần dùm truy vấn tùy chỉnh ở một vị trí khác, chúng ta có thể tạo lại sau.

endif; 
wp_reset_query( );

Tài liệu WordPress

Link tài liệu chính chủ WordPress về các hàm đã dùng trong bài học nếu muốn tìm hiểu sâu hơn

Code hoàn thành của bài học: Google Drive

Nếu có thắc mắc, đặt câu hỏi bằng cách comment bên dưới, qua email, hoặc nhắn tin qua Fanpage Góc làm web.

Đừng quên LikeShare nếu thấy bài viết thú vị.

Liên hệ

Để lại một trả lời

Địa chỉ email của bạn sẽ không được công bố.