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