#13 – Custom WP_Query – Hiển thị bài viết liên quan
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.
Nội dung chính
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
- Tác giả – Author
- Chuyên mục – Category
- Thẻ – Tag
- Taxonomy theo phân loại (có thể là chuyên mục, thẻ hoặc phân loại tự thêm vào … ) kết hợp tất cả những dạng phân loại mà bạn có.
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 Like, Share nếu thấy bài viết thú vị.