给你的WordPress主题添加评论排行榜功能

特别说明:

1. 本文章为原创文章,转载请注明出处。

2. 本文代码具备非常好的通用性,代码对应的地方改一下即可

网站实际样式
Image description![Image description](https://s.rmimg.com/2025-02-24/1740403728-776706-55555.png)

**[color=red]具体实现步骤如下:[/color]**

**1. 把以下代码添加至wp-content/themes/主题名称/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 .= '<div class="readers-section">';
$output .= '<h2 class="entry-title">' . esc_html($title) . ' TOP' . esc_html($limit) . '</h2>';

if ($wall) {
    $output .= "<ul class='readers-list'>";
    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}<br>评论: {$count}";

        $output .= "<li>
                        <a rel='friend' target='_blank' href='{$url}' aria-describedby='tooltip-{$comment->comment_author_email}'>
                            {$avatar}
                            <div class='tooltip' id='tooltip-{$comment->comment_author_email}' role='tooltip'>{$tooltip}</div>
                        </a>
                    </li>";
    }
    $output .= "</ul>";
} else {
    $output .= "<p>没有找到" . esc_html($title) . "数据。</p>";
}

$output .= '</div>';

return $output;

}

// 短代码函数:读者墙
function readers_wall_shortcode() {
global $wpdb;
$output = ‘’;

// 年度评论排行
$query1 = $wpdb->prepare(
    "SELECT COUNT(comment_ID) AS cnt, comment_author, comment_author_url, comment_author_email 
    FROM (
        SELECT * FROM $wpdb->comments 
        LEFT JOIN $wpdb->posts ON ($wpdb->posts.ID = $wpdb->comments.comment_post_ID) 
        WHERE comment_date BETWEEN DATE_SUB(NOW(), INTERVAL 1 YEAR) AND NOW() 
        AND post_password = '' 
        AND comment_approved = '1'
        AND comment_author != %s
    ) AS tempcmt 
    GROUP BY comment_author_email 
    ORDER BY cnt DESC 
    LIMIT %d",
    '段先森',
    5
);
$output .= generate_readers_list('年度评论', $query1, 5);

// 本月评论排行
$query2 = $wpdb->prepare(
    "SELECT COUNT(comment_ID) AS cnt, comment_author, comment_author_url, comment_author_email 
    FROM (
        SELECT * FROM $wpdb->comments 
        LEFT JOIN $wpdb->posts ON ($wpdb->posts.ID = $wpdb->comments.comment_post_ID) 
        WHERE DATE_FORMAT(comment_date, '%%Y-%%m') = DATE_FORMAT(NOW(), '%%Y-%%m') 
        AND post_password = '' 
        AND comment_approved = '1'
        AND comment_author != %s
    ) AS tempcmt 
    GROUP BY comment_author_email 
    ORDER BY cnt DESC 
    LIMIT %d",
    '段先森',
    5
);
$output .= generate_readers_list('本月评论', $query2, 5);

// 本周评论排行
$query3 = $wpdb->prepare(
    "SELECT COUNT(comment_ID) AS cnt, comment_author, comment_author_url, comment_author_email 
    FROM (
        SELECT * FROM $wpdb->comments 
        LEFT JOIN $wpdb->posts ON ($wpdb->posts.ID = $wpdb->comments.comment_post_ID) 
        WHERE YEARWEEK(DATE_FORMAT(comment_date, '%%Y-%%m-%%d')) = YEARWEEK(NOW()) 
        AND post_password = '' 
        AND comment_approved = '1'
        AND comment_author != %s
    ) AS tempcmt 
    GROUP BY comment_author_email 
    ORDER BY cnt DESC 
    LIMIT %d",
    '段先森',
    5
);
$output .= generate_readers_list('本周评论', $query3, 5);

return $output;

}
add_shortcode(‘readers_wall’, ‘readers_wall_shortcode’);
```

**2. 在wp-content/themes/主题名称/中创建文件夹css,然后创建 readers-wall.css文件,代码如下:**

```
/* readers-wall.css */

/* 容器样式 /
.readers-section {
margin-bottom: 50px;
/
隐藏无序列表的默认标记 /
list-style: none;
/
隐藏下划线 /
border-bottom: none;
padding: 0; /
移除默认的内边距 /
margin: 0; /
重置默认外边距,如果需要的话 */
}

.readers-section h2.entry-title {
font-size: 12px;
margin-bottom: 12px;
color: #333;
}

/* 头像列表样式 /
.readers-list {
display: flex;
flex-wrap: wrap;
list-style: none;
padding: 0;
margin: 0;
}
.readers-list li {
list-style-type: none; /
确保没有列表项前的小圆圈 /
position: relative;
margin: 20px;
width: 50px; /
调整头像大小 /
height: 55px;
border-bottom: none;/
隐藏下划线 */

}
.readers-list li a {
display: block;
width: 100%;
height: 100%;
text-align: center;
text-decoration: none;
position: relative;
}
.readers-list li img {
width: 100%;
height: 100%;
border-radius: 50%;
box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1);
transition: transform 0.3s ease;
}
.readers-list li a:hover img,
.readers-list li a:focus img {
transform: scale(1.1);
}

/* 悬停信息框样式 /
.readers-list li .tooltip {
visibility: hidden;
opacity: 0;
width: 90px;
background-color: rgba(0, 0, 0, 0.75);
color: #fff;
text-align: center;
border-radius: 6px;
padding: 8px;
position: absolute;
bottom: 60px; /
头像上方 /
left: 50%;
transform: translateX(-50%);
transition: opacity 0.3s ease;
z-index: 10;
font-size: 12px;
}
.readers-list li .tooltip::after {
content: “”;
position: absolute;
top: 100%; /
箭头指向头像 */
left: 50%;
margin-left: -5px;
border-width: 5px;
border-style: solid;
border-color: rgba(0, 0, 0, 0.75) transparent transparent transparent;
}
.readers-list li:hover .tooltip,
.readers-list li a:focus .tooltip {
visibility: visible;
opacity: 1;
}

/* 响应式设计 */
@media (max-width: 600px) {
.readers-list li {
width: 40px;
height: 40px;
}
.readers-section h2.entry-title {
font-size: 12px;
}
.readers-list li .tooltip {
width: 80px;
font-size: 12px;
}
}
```

**使用方法:**

**1. 在创建的新页面中插入简码即可**

`[readers_wall]`

**2. php中的'段先森',换成你在blog中的名字,这样可以排除本人评论**

**3. css中的参数可以根据自己的需求进行调整,不知道具体功能的可以借助AI进行代码标注即可**

[color=blue]**下面是进阶设置,主要针对美观度进行了微调,以符合我个人的审美取向。仅供参考。**[/color]

**[color=red]回复可见[/color]**

[reply]

Image description</s>Image description<e>

[/reply]

好文,感谢分享。 博客很好看。 IP+10086

@“James”#p246939

我弄了个购买分享,然后看了一下,发现完全看不见。只能付款看,我以为是可以看一部分。哈哈

@“Evan”#p246941 把需要购买后看的内容放到</s>[pay][/pay]<e>标签中,就可以部分看了。

@“James”#p246944

哈哈,没事儿。我就是试试。哈哈。。。免费看吧。。哈哈

感谢分享 :xhj06:

WP 很少用,我 prefer Typecho or VitePress.

@“14569”#p247963

WP用久了,懒得换了。哈哈

感谢大佬

学习了,感谢分享

@“vc”#p249582

您客气,相互学习。:yct18:

佬实在是太厉害了

@“虎杖呦呦呦”#p250178 :xhj08:

感谢分享