Pix主题12:添加评论排行榜功能

晚上随机看网友博客,发现一篇给wordpress创建读者墙功能的帖子。上周就想写一个wp评论排行的插件,但是样式太难看就放弃了。文章后面实现了预期的效果,但需要对前面的代码进行小小的调整,这非常简单!

推荐设置

此教程被标记为推荐内容,建议优先阅读。

读者墙效果预览
A
1
B
2
C
3
D
4
E
5
F
6

显示评论最多的读者头像和排名

具体步骤

下面是实现评论排行榜功能的具体步骤:

添加核心代码到functions.php

把以下代码添加至wp-content/themes/pix/functions.php中:

// 注册并加载读者墙的CSS样式
function enqueue_readers_wall_styles() {
    wp_enqueue_style('readers-wall-style', THEME_URL . '/css/readers-wall.css', array(), '1.0.0');
}
add_action('wp_enqueue_scripts', 'enqueue_readers_wall_styles');

// 辅助函数:生成排行列表
function generate_readers_list($title, $query, $limit) {
    global $wpdb;
    $output = '';
    
    // 使用 transient 缓存查询结果
    $transient_key = 'readers_wall_' . md5($query);
    $wall = get_transient($transient_key);
    
    if (false === $wall) {
        $wall = $wpdb->get_results($query);
        set_transient($transient_key, $wall, 3600); // 设置缓存时间为1小时(3600秒)
    }
    
    $output .= '
'; $output .= '

' . esc_html($title) . ' TOP' . esc_html($limit) . '

'; if ($wall) { $output .= "
    "; foreach ($wall as $comment) { $avatar = get_avatar($comment->comment_author_email, 64, get_bloginfo('wpurl') . '/avatar/default.jpg', '', array('loading' => 'lazy')); $url = esc_url($comment->comment_author_url ? $comment->comment_author_url : "#"); $author = esc_html($comment->comment_author); $count = intval($comment->cnt); $tooltip = "{$author}
    评论: {$count}"; $output .= "
  • {$avatar}
  • "; } $output .= "
"; } $output .= '
'; return $output; }

创建CSS样式文件

在主题目录下创建css/readers-wall.css文件:

/* 读者墙样式 */
.readers-section {
    margin: 30px 0;
    padding: 20px;
    background: #f8f9fa;
    border-radius: 8px;
}

.readers-section .entry-title {
    text-align: center;
    margin-bottom: 20px;
    color: #333;
    font-size: 18px;
    font-weight: 600;
}

.readers-list {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(80px, 1fr));
    gap: 15px;
    list-style: none;
    padding: 0;
    margin: 0;
}

.readers-list li {
    text-align: center;
    position: relative;
}

.readers-list li a {
    display: block;
    text-decoration: none;
    position: relative;
}

.readers-list li .avatar {
    border-radius: 50%;
    transition: transform 0.3s ease;
}

.readers-list li a:hover .avatar {
    transform: scale(1.1);
}

.readers-list li .tooltip {
    position: absolute;
    bottom: 100%;
    left: 50%;
    transform: translateX(-50%);
    background: #333;
    color: #fff;
    padding: 5px 10px;
    border-radius: 4px;
    font-size: 12px;
    white-space: nowrap;
    opacity: 0;
    visibility: hidden;
    transition: all 0.3s ease;
    z-index: 1000;
}

.readers-list li a:hover .tooltip {
    opacity: 1;
    visibility: visible;
    transform: translateX(-50%) translateY(-5px);
}

在页面中调用读者墙

在需要显示读者墙的页面模板中添加以下代码:

// 在页面模板中添加读者墙
$readers_query = "SELECT comment_author, comment_author_email, comment_author_url, COUNT(*) as cnt 
                  FROM {$wpdb->comments} 
                  WHERE comment_approved = 1 
                  GROUP BY comment_author_email 
                  ORDER BY cnt DESC 
                  LIMIT 20";

echo generate_readers_list('评论排行榜', $readers_query, 20);

功能特点

  • 缓存优化:使用WordPress的transient缓存,减少数据库查询
  • 响应式设计:适配不同屏幕尺寸
  • 悬停效果:鼠标悬停显示详细信息
  • 排名显示:直观显示评论数量排名
  • 头像支持:自动获取Gravatar头像

自定义选项

可以根据需要调整以下参数:

// 自定义读者墙参数
function custom_readers_wall($atts) {
    $atts = shortcode_atts(array(
        'limit' => 20,
        'title' => '评论排行榜',
        'days' => 365
    ), $atts);
    
    global $wpdb;
    $days = intval($atts['days']);
    $limit = intval($atts['limit']);
    
    $query = $wpdb->prepare("
        SELECT comment_author, comment_author_email, comment_author_url, COUNT(*) as cnt 
        FROM {$wpdb->comments} 
        WHERE comment_approved = 1 
        AND comment_date > DATE_SUB(NOW(), INTERVAL %d DAY)
        GROUP BY comment_author_email 
        ORDER BY cnt DESC 
        LIMIT %d
    ", $days, $limit);
    
    return generate_readers_list($atts['title'], $query, $limit);
}
add_shortcode('readers_wall', 'custom_readers_wall');
使用提示

现在可以通过短代码 [readers_wall limit="15" title="活跃读者" days="30"] 在任何页面调用读者墙功能。

读者墙最终效果