- 1. Hiệu năng truy vấn cao hơn
- 2. Tách biệt logic lưu trữ và hiển thị
- 3. Hỗ trợ điều kiện lọc linh hoạt
- Ví dụ WP_Query thực tế
- Lấy các bài viết có điểm trung bình trên 4.5
- Lấy các bài viết có ít nhất 20 lượt đánh giá
- Sắp xếp bài viết theo điểm trung bình từ cao xuống thấp
- Sắp xếp bài viết có nhiều lượt vote nhất
- Lấy bài viết có điểm trung bình >= 4.5 và ít nhất 50 vote
- Kết luận
Trong plugin Init Review System, mỗi đánh giá người dùng gửi lên sẽ được lưu vào 3 meta key riêng biệt cho mỗi bài viết:
_init_review_total: tổng điểm đã được vote_init_review_count: số lượt vote hợp lệ_init_review_avg: điểm trung bình (làm tròn 2 chữ số)
Cách tiếp cận này tuy có vẻ dư thừa (vì điểm trung bình có thể tính lại bất kỳ lúc nào), nhưng mang lại 3 lợi ích chính:
1. Hiệu năng truy vấn cao hơn
Khi hiển thị danh sách bài viết được đánh giá cao nhất, nếu không có trường _init_review_avg, WordPress sẽ phải lấy _init_review_total và _init_review_count rồi tự tính điểm trung bình trong PHP. Điều này khiến WP_Query không sử dụng được orderby hiệu quả. Bằng cách lưu sẵn điểm trung bình, plugin cho phép sắp xếp trực tiếp bằng SQL, cực nhanh và chuẩn.
2. Tách biệt logic lưu trữ và hiển thị
Mỗi khi có lượt đánh giá mới, chúng ta cập nhật lại cả 3 giá trị cùng lúc. Điều này đảm bảo frontend không cần thực hiện phép chia mỗi lần render, giảm rủi ro sai số lẻ. Ngoài ra, các hệ thống cache như Object Cache hay REST Cache sẽ hoạt động ổn định hơn khi dữ liệu đã được tính sẵn.
3. Hỗ trợ điều kiện lọc linh hoạt
Việc có cả 3 trường giúp lọc bài viết theo nhiều tiêu chí khác nhau, ví dụ: chỉ lấy bài viết có trên 10 lượt đánh giá, hoặc bài có điểm trung bình trên 4.5. Đây là yêu cầu phổ biến trong các trang review, top list, hoặc ranking.
Ví dụ WP_Query thực tế
Lấy các bài viết có điểm trung bình trên 4.5
new WP_Query([
'post_type' => 'post',
'meta_query' => [
[
'key' => '_init_review_avg',
'value' => 4.5,
'type' => 'NUMERIC',
'compare' => '>=',
]
]
]);
Lấy các bài viết có ít nhất 20 lượt đánh giá
new WP_Query([
'post_type' => 'post',
'meta_query' => [
[
'key' => '_init_review_count',
'value' => 20,
'type' => 'NUMERIC',
'compare' => '>=',
]
]
]);
Sắp xếp bài viết theo điểm trung bình từ cao xuống thấp
new WP_Query([
'post_type' => 'post',
'meta_key' => '_init_review_avg',
'orderby' => 'meta_value_num',
'order' => 'DESC',
]);
Sắp xếp bài viết có nhiều lượt vote nhất
new WP_Query([
'post_type' => 'post',
'meta_key' => '_init_review_count',
'orderby' => 'meta_value_num',
'order' => 'DESC',
]);
Lấy bài viết có điểm trung bình >= 4.5 và ít nhất 50 vote
new WP_Query([
'post_type' => 'post',
'meta_query' => [
'relation' => 'AND',
[
'key' => '_init_review_avg',
'value' => 4.5,
'type' => 'NUMERIC',
'compare' => '>=',
],
[
'key' => '_init_review_count',
'value' => 50,
'type' => 'NUMERIC',
'compare' => '>=',
]
],
'orderby' => 'meta_value_num',
'meta_key' => '_init_review_avg',
'order' => 'DESC',
]);
Kết luận
Việc lưu trữ song song 3 giá trị: tổng điểm, số lượt vote, và điểm trung bình giúp plugin Init Review System vừa đảm bảo hiệu năng cao, vừa hỗ trợ dễ dàng cho các truy vấn phức tạp. Đây là giải pháp thực dụng và chuẩn hóa cho mọi hệ thống đánh giá trong WordPress.
Bình luận