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

Không phải hệ thống nào cũng có đầy đủ dữ liệu like/dislike. Trong nhiều trường hợp, bạn chỉ có một meta duy nhất là comment_like. Nếu lúc này bạn vẫn sort thuần theo like, kết quả sẽ nhanh chóng bị “đóng băng”: comment cũ nhiều like sẽ luôn nằm top, comment mới gần như không có cơ hội xuất hiện.

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

Giải pháp hợp lý hơn là sử dụng Hot Score (Trending Algorithm) — một cách tính điểm kết hợp giữa độ phổ biến (like) và độ mới (thời gian). Đây là hướng tiếp cận được nhiều nền tảng lớn sử dụng để giữ nội dung luôn “sống”.

1. Ý tưởng cốt lõi

Một comment “hot” không chỉ là comment có nhiều like, mà còn phải đủ mới. Thuật toán sẽ:

  • Tăng điểm theo số like (log scale để tránh bùng nổ)
  • Giảm điểm theo thời gian (comment càng cũ càng bị trừ)

Công thức đơn giản nhưng hiệu quả:

score = log10(likes + 1) + (created_time / gravity)
  • likes: số lượt thích
  • created_time: timestamp của comment
  • gravity: hệ số điều chỉnh độ “trôi” (thường 45000 ~ 100000)

2. Hàm tính Hot Score

function init_html_get_hot_score($likes, $comment_time) {

    $likes = max(0, (int) $likes);

    // Chuyển thời gian về timestamp
    $timestamp = is_numeric($comment_time)
        ? $comment_time
        : strtotime($comment_time);

    // Tránh lỗi
    if (!$timestamp) {
        return 0;
    }

    // Hệ số gravity: càng lớn thì comment trôi càng chậm
    $gravity = 80000;

    $score = log10($likes + 1) + ($timestamp / $gravity);

    return $score;
}

3. Áp dụng vào WordPress

Ta hook vào comments_array để sắp xếp lại danh sách trước khi render:

add_filter('comments_array', 'init_html_sort_comments_by_hot', 999, 2);

function init_html_sort_comments_by_hot($comments, $post_id) {

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

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

        $likes_a = (int) get_comment_meta($a->comment_ID, 'comment_like', true);
        $likes_b = (int) get_comment_meta($b->comment_ID, 'comment_like', true);

        $score_a = init_html_get_hot_score($likes_a, $a->comment_date_gmt);
        $score_b = init_html_get_hot_score($likes_b, $b->comment_date_gmt);

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

        return ($score_a > $score_b) ? -1 : 1;
    });

    return $comments;
}

4. Tinh chỉnh quan trọng

  • gravity: càng lớn → comment giữ top lâu hơn
  • log10: giúp giảm ảnh hưởng của like quá lớn
  • Có thể thêm decay mạnh hơn nếu muốn feed “chạy nhanh”

Ví dụ:

  • gravity = 45000 → feed thay đổi nhanh
  • gravity = 100000 → feed ổn định hơn

5. So sánh với sort theo like

Phương pháp Hành vi
Sort theo like Comment cũ thống trị, feed “chết”
Hot Score Cân bằng giữa phổ biến và mới

6. Khi nào nên dùng?

  • Chỉ có dữ liệu like (không có dislike)
  • Muốn nội dung luôn thay đổi, không bị đóng băng
  • Hệ thống có nhiều tương tác theo thời gian

7. Kết luận

Khi không có dislike, bạn không thể dùng Wilson Score một cách chính xác. Trong trường hợp này, Hot Score là lựa chọn thực tế và hiệu quả hơn rất nhiều.

Triển khai đúng, bạn sẽ có một hệ thống comment luôn “sống” — nơi nội dung mới có cơ hội cạnh tranh, nhưng nội dung chất lượng vẫn đủ sức giữ vị trí của nó.

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...