Sắp xếp bình luận “Tốt nhất” bằng Wilson Score trong WordPress

Trong WordPress, mặc định comment thường được sắp xếp theo thời gian hoặc đảo ngược thứ tự. Cách này đơn giản nhưng không phản ánh được chất lượng nội dung. Nếu bạn đang có hệ thống vote (like/dislike), thì việc tận dụng dữ liệu đó để xếp hạng là điều bắt buộc.

Sắp xếp bình luận “Tốt nhất” bằng Wilson Score trong WordPress

Trong bài này, chúng ta sẽ triển khai sắp xếp comment theo tiêu chí “Tốt nhất” (Best) bằng Wilson Score — một phương pháp thống kê giúp cân bằng giữa tỷ lệ like và độ tin cậy của dữ liệu.

Giả định: mỗi comment đã có sẵn hai meta: comment_likecomment_dislike.

1. Hook vào WordPress để can thiệp thứ tự comment

WordPress cung cấp filter comments_array cho phép bạn can thiệp trực tiếp vào danh sách comment trước khi render. Đây là điểm phù hợp nhất để xử lý việc sắp xếp.

// Ghi đè thứ tự comment trước khi hiển thị
add_filter('comments_array', 'init_html_sort_comments_by_best', 999, 2);

function init_html_sort_comments_by_best($comments, $post_id) {

    if (empty($comments) || is_admin()) {
        return $comments;
    }

    usort($comments, function($a, $b) {

        // Giả sử đã có sẵn meta
        $likes_a = (int) get_comment_meta($a->comment_ID, 'comment_like', true);
        $likes_b = (int) get_comment_meta($b->comment_ID, 'comment_like', true);

        $downs_a = (int) get_comment_meta($a->comment_ID, 'comment_dislike', true);
        $downs_b = (int) get_comment_meta($b->comment_ID, 'comment_dislike', true);

        $score_a = init_html_get_wilson_score($likes_a, $downs_a);
        $score_b = init_html_get_wilson_score($likes_b, $downs_b);

        if ($score_a === $score_b) {
            return 0;
        }

        // Score cao hơn đứng trước
        return ($score_a > $score_b) ? -1 : 1;
    });

    return $comments;
}

2. Hàm tính Wilson Score

Đây là phần cốt lõi. Thay vì dùng số like thô, ta tính “lower bound” để đảm bảo độ tin cậy.

function init_html_get_wilson_score($ups, $downs = 0) {

    $ups   = max(0, (int) $ups);
    $downs = max(0, (int) $downs);
    $n     = $ups + $downs;

    if ($n === 0) {
        return 0;
    }

    $z = 1.96; // độ tin cậy 95%

    $phat = $ups / $n;

    $score = (
        $phat + ($z * $z) / (2 * $n)
        - $z * sqrt(($phat * (1 - $phat) + ($z * $z) / (4 * $n)) / $n)
    ) / (1 + ($z * $z) / $n);

    // Tùy chọn: tăng trọng số cho comment có nhiều vote
    $score *= log10($n + 1);

    return $score;
}

3. Vì sao cách này tốt hơn?

  • Không bị đánh lừa bởi comment ít vote nhưng tỷ lệ cao
  • Ưu tiên comment có nhiều tương tác thật
  • Chống spam vote hiệu quả

Ví dụ thực tế:

  • Comment A: 5 like / 0 dislike → tỷ lệ 100%
  • Comment B: 200 like / 50 dislike → tỷ lệ 80%

Nếu chỉ dùng tỷ lệ, A sẽ đứng trên B — nhưng rõ ràng B đáng tin hơn. Wilson Score sẽ xử lý đúng trường hợp này.

4. Một số lưu ý khi triển khai

  • Cache meta comment (update_meta_cache) nếu dataset lớn
  • Có thể precompute score để tối ưu hiệu năng
  • Chỉ recompute khi có vote mới
  • Không nên thêm các “boost” thủ công nếu muốn giữ tính khách quan

5. So sánh nhanh với cách truyền thống

Phương pháp Vấn đề
Sắp theo like Dễ bị spam, thiếu độ tin cậy
Tỷ lệ like Comment ít vote dễ lên top
Wilson Score Cân bằng giữa chất lượng và độ tin cậy

6. Kết luận

Nếu bạn đã có hệ thống like/dislike mà vẫn đang sort theo thời gian hoặc like thô, thì bạn đang bỏ phí dữ liệu. Wilson Score là cách nâng cấp trực tiếp, dễ triển khai nhưng mang lại hiệu quả rất lớn.

Triển khai xong, thứ tự comment sẽ phản ánh đúng chất lượng — và đó là thứ giữ cộng đồng sạch và đáng đọc.

Bình luận


  • Không có bình luận.

Init Toolbox

Nhấn Ctrl + \ trên máy tính, hoặc vuốt sang trái ở bất kỳ đâu trên mobile.

Đăng nhập





Đang tải...