Trong quá trình phát triển hoặc tối ưu website WordPress, đôi khi bạn sẽ cần lấy danh sách các bài viết đã có bình luận – ví dụ để hiển thị những bài viết có nhiều tương tác, hoặc đơn giản là lọc ra các bài viết đã từng được độc giả phản hồi.

Bài viết này sẽ hướng dẫn bạn cách query các bài viết có chứa comment trong WordPress bằng cách sử dụng WP_Query, kết hợp với các kỹ thuật nâng cao trong việc tùy biến truy vấn.

1. Vấn đề đặt ra

Theo mặc định, WP_Query không có sẵn tham số để lọc các bài viết có bình luận. Tuy nhiên, với một chút tùy chỉnh, bạn hoàn toàn có thể thực hiện được điều này bằng cách join bảng comment và thêm điều kiện phù hợp.

2. Cách tiếp cận: Dùng bộ lọc posts_where để truy vấn bài viết có comment

Ví dụ đơn giản:

function get_posts_with_comments() {
add_filter('posts_where', 'filter_posts_with_comments');

$args = array(
'post_type' => 'post',
'posts_per_page' => 10,
'orderby' => 'comment_count',
'order' => 'DESC',
);

$query = new WP_Query($args);

remove_filter('posts_where', 'filter_posts_with_comments');

return $query;
}

function filter_posts_with_comments($where) {
global $wpdb;
return $where . " AND {$wpdb->posts}.ID IN (
SELECT comment_post_ID FROM {$wpdb->comments}
WHERE comment_approved = '1'
GROUP BY comment_post_ID
)";
}

Giải thích:

  • Ta thêm một filter vào posts_where để tùy biến câu lệnh SQL của WordPress.
  • Sử dụng truy vấn con để lọc ra các bài viết mà ID nằm trong danh sách comment_post_ID đã được duyệt.
  • Sau khi query xong, nhớ remove filter để không ảnh hưởng tới các truy vấn sau đó.

3. Tối ưu: Lọc theo điều kiện nâng cao

Bạn có thể kết hợp thêm điều kiện như:

  • Chỉ lấy bài viết có ít nhất 5 comment
  • Hoặc lấy theo khoảng thời gian cụ thể

Ví dụ:

function filter_posts_with_min_comments($where) {
global $wpdb;
return $where . " AND {$wpdb->posts}.ID IN (
SELECT comment_post_ID FROM {$wpdb->comments}
WHERE comment_approved = '1'
GROUP BY comment_post_ID
HAVING COUNT(comment_ID) >= 5
)";
}

4. Lưu ý hiệu năng

  • Việc dùng subquery (truy vấn con) trong SQL có thể ảnh hưởng đến hiệu suất, đặc biệt trên website có hàng ngàn bài viết hoặc bình luận.
  • Nếu bạn cần thực hiện thường xuyên, hãy cân nhắc việc lưu tạm dữ liệu qua transient/cache hoặc tạo trường meta tùy chỉnh đếm comment (update định kỳ bằng cron job).

5. Khi nào nên dùng cách này?

  • Hiển thị danh sách “bài viết nổi bật nhờ bình luận”
  • Phân tích mức độ tương tác thực tế của từng bài viết
  • Tạo tính năng lọc nội dung theo số lượng comment cho người dùng

Dù WordPress không hỗ trợ trực tiếp truy vấn bài viết có comment qua WP_Query, nhưng nhờ cơ chế filter và khả năng mở rộng mạnh mẽ, bạn hoàn toàn có thể xử lý việc này một cách linh hoạt. Hãy sử dụng phương pháp trên một cách hợp lý để tránh ảnh hưởng hiệu năng hệ thống.