威言威语
我愿像茶,苦涩留心,清香予人。
威言威语
当前位置: 首页 > 设计 > 正文

给WordPress添加评论者等级功能

我给博客加了个评论者等级的小功能,主要是想让常来留言的博友有点身份感,也能激励大家多互动。实现方式其实挺简单的,就是根据邮箱统计评论数,分区间定等级,再配上武侠风的称号和颜色。既好看,又带点江湖味儿,让评论区更热闹。
给WordPress添加评论者等级功能

最近我给博客增加了 评论者等级 功能,一方面是给经常评论的博友一个身份标识,另一方面也能让更多人愿意参与互动。

其实功能实现并不复杂:核心思路是 根据评论邮箱,统计该评论者已批准的评论数量,然后划分到不同的「等级」区间,最终输出一个带等级数字和提示文本的 HTML 标签。

核心代码部署

将以下核心代码添加到主题的 functions.php 文件中即可实现基础功能:


//评论者等级
function get_comment_author_level($user_id, $comment_author_email) {
	if ($user_id && user_can($user_id, 'manage_options')) {
		return '<span class="post-author">博主</span>';
	}
	$email = sanitize_email($comment_author_email);
	if (empty($email)) return '';
	$comment_count = get_cached_comment_count($email);
	$levels = [
		499 => ['level' => 12, 'name' => '神话'],
		369 => ['level' => 11, 'name' => '传奇'],
		269 => ['level' => 10, 'name' => '无双'],
		189 => ['level' => 9,  'name' => '泰斗'],
		129 => ['level' => 8,  'name' => '宗师'],
		89  => ['level' => 7,  'name' => '大侠'],
		59  => ['level' => 6,  'name' => '豪侠'],
		39  => ['level' => 5,  'name' => '侠客'],
		24  => ['level' => 4,  'name' => '游侠'],
		13  => ['level' => 3,  'name' => '少侠'],
		6   => ['level' => 2,  'name' => '新锐'],
		2   => ['level' => 1,  'name' => '新秀'],
	];
foreach ($levels as $threshold => $info) {
	if ($comment_count >= $threshold) {
		$current_level_name = $info['name'];
		$current_level_num = $info['level'];
		$next_levels = array_keys($levels);
		$next_threshold = null;
		foreach ($next_levels as $idx => $key) {
			if ($key == $threshold && isset($next_levels[$idx - 1])) {
				$next_threshold = $next_levels[$idx - 1];
				break;
			}
		}
		if ($next_threshold) {
			$next_level_name = $levels[$next_threshold]['name'];
			$need = $next_threshold - $comment_count;
			$title = sprintf(
				'%s · %d评 · 再%d评升至%s',
				$current_level_name, $comment_count, $need, $next_level_name
			);
		} else {
			$title = sprintf(
				'%s · %d评 · 已达最高级',
				$current_level_name, $comment_count
			);
		}
		return sprintf(
			'<span class="com-level vip%d" title="%s"><strong>V</strong><sub>%d</sub></span>',
			$current_level_num,
			esc_attr($title),
			$current_level_num
		);
	}
}
	return '';
}
// 获取评论数(分组缓存)
function get_cached_comment_count($email) {
	global $wpdb;
	$email = sanitize_email($email);
	if (empty($email)) return 0;
	// 根据首字母分组(a-z 0-9),其余归 other
	$first = strtolower($email[0]);
	$group = ctype_alnum($first) ? $first : 'other';
	$cache_key = 'comment_counts_group_' . $group;
	// 获取该组缓存
	$comment_counts = get_transient($cache_key);
	if (!is_array($comment_counts)) $comment_counts = [];
	if (!isset($comment_counts[$email])) {
		// 数据库查询
		$count = (int) $wpdb->get_var(
			$wpdb->prepare(
				"SELECT COUNT(comment_ID)
				 FROM $wpdb->comments
				 WHERE comment_approved = 1
				 AND comment_author_email = %s
				 AND (comment_type = '' OR comment_type = 'comment')",
				$email
			)
		);
		$comment_counts[$email] = $count;
		set_transient($cache_key, $comment_counts, 2 * HOUR_IN_SECONDS);
	}
	return $comment_counts[$email];
}
// 清理某邮箱的缓存
function clear_comment_count_cache($comment_id) {
	$comment = get_comment($comment_id);
	if (!$comment || empty($comment->comment_author_email)) return;
	$email = sanitize_email($comment->comment_author_email);
	if (empty($email)) return;
	$first = strtolower($email[0]);
	$group = ctype_alnum($first) ? $first : 'other';
	$cache_key = 'comment_counts_group_' . $group;
	$comment_counts = get_transient($cache_key);
	if ($comment_counts !== false && isset($comment_counts[$email])) {
		unset($comment_counts[$email]); // 移除该邮箱缓存
		set_transient($cache_key, $comment_counts, 2 * HOUR_IN_SECONDS);
	}
}
// 评论新增/编辑/删除/状态变更时清理缓存
add_action('comment_post', function($comment_id, $comment_approved) {
	if ($comment_approved == 1) {
		clear_comment_count_cache($comment_id);
	}
}, 10, 2);
add_action('wp_set_comment_status', function($comment_id, $status) {
	clear_comment_count_cache($comment_id);
}, 10, 2);
add_action('edit_comment', function($comment_id) {
	clear_comment_count_cache($comment_id);
}, 10, 1);
add_action('delete_comment', function($comment_id) {
	clear_comment_count_cache($comment_id);
}, 10, 1);
评论数获取与缓存优化

评论数的统计如果每次都查数据库,会带来额外负担。为此我做了一个 分组缓存机制

  • 按邮箱首字母分组,把同一组的邮箱统计结果缓存在一个 transient 里;
  • 这样避免了「每个邮箱单独缓存」或「所有邮箱一起缓存」的极端情况;
  • 对于 评论量超过一万条 的博客,这种分组缓存能显著减少数据库查询压力;
  • 等级的title中新增进度提示,成长目标一目了然。

缓存设置为 2小时自动清理。此外,我还在评论新增、编辑、删除、状态变更时,触发清理对应分组缓存,保证数据一致性。

如果你不在乎实时性,其实这一步也可以省略,因为评论等级的变化频率通常不高。去掉上面代码中 // 清理某邮箱的缓存 后面的代码就行。

评论者等级设计

我设计了 12个等级。12 是一个相对合适的数字:既能涵盖大部分评论者,又能为未来留出拓展空间。

在划分等级区间时,我根据博客上 1.7万多条博友评论数据进行统计分析

  • 绝大多数人的评论数量不多,所以前期的等级区间要小一些;
  • 后期等级则逐渐拉大,避免升级过于频繁;
  • 只有一条评论的用户不展示标识,所以区间从 2 开始;
  • 同时预留 2-3 个高阶区间,给未来活跃评论者使用。

经过多次尝试,ChatGPT提供了一个基于对数分析的分组方案,我在此基础上进行了微调,得出了最终的分组数据。

等级命名与风格

每个人都可以根据喜好来命名等级,我个人喜欢武侠,所以设计了一个 江湖风格的升级体系

新秀 → 新锐 → 少侠 → 游侠 → 侠客 → 豪侠 → 大侠 → 宗师 → 泰斗 → 无双 → 传奇 → 神话

依照 资历 → 实力 → 声望,逐级递进。

每个称呼都经过我精心斟酌,体现了江湖气息的升级体验。

样式与配色

在前端样式上,我定义了 .com-level 类,里面包含了等级标识和数字标记。示例代码如下:


/* 评论者等级 */
.post-author{font-size:12px;margin-left:4px;padding:1px 4px 2px 4px;background:#555;border-radius:4px;color:#fff;}
.com-level{margin:0 5px 0 4px;cursor:default;}
.com-level sub{margin-left:-1px;font-weight:bold;vertical-align:-1px;font-size:10px;font-family:sans-serif,Helvetica,Arial;}
.vip1{color:#c0c0c0;} /* 微光灰 */
.vip2{color:#a0a0a0;} /* 哑光灰 */
.vip3{color:#9e7a5d;} /* 古朴青铜 */
.vip4{color:#b87333;} /* 经典青铜 */
.vip5{color:#cb6d1e;} /* 赤铜 */
.vip6{color:#cc8400;} /* 暗金 */
.vip7{color:#d4af37;} /* 古典金 */
.vip8{color:#ffb800;} /* 亮金 */
.vip9{color:#ffa500;} /* 华贵金 */
.vip10{color:#ff8c00;} /* 流光金 */
.vip11{color:#da70d6;} /* 紫金 */
.vip12{color:#a42be2;} /* 至尊紫金 */

颜色的思路是 逐级递增,从低阶的金属质感(黑铁、青铜、赤铜),逐步过渡到高阶的金色与紫金。

上面的代码用 V 字符代替图标,实际应用中你可以换成合适的图标。

将所有等级的图标放在一起看更有感觉一些。

123456789101112

模板调用

最后,在 comments.php 或自定义的评论函数中,比如在评论者的昵称旁边添加:


<?php echo get_comment_author_level($comment->user_id, $comment->comment_author_email); ?>

这样评论者的昵称后面就会带上等级标识,整个评论区会更有“江湖气息”。

相关推荐

给WordPress添加评论者等级功能:目前有 94 条评论

  1. 大峰
    47楼
    大峰4Firefox 144.0 Windows 10

    这个很好玩 :smile: :lol:

    2025-11-03 09:15 回复
    • William
      WilliamFirefox 144.0 Windows 10

      @大峰互动性比之前会强一点,也能看到发了多少条评论了。

      2025-11-06 14:20 回复
  2. 美樂地
    46楼

    看看我的等级

    2025-11-02 20:14 回复
  3. 书签网
    45楼

    瞬间高大上了

    2025-11-02 11:25 回复
  4. Feng
    44楼
    Feng2Microsoft Edge 141.0.0.0 Windows 10

    下次要是能这些功能都集成到主题最好了,懒人一键设置,哈哈。

    2025-10-24 19:38 回复
    • William
      WilliamGoogle Chrome 141.0.0.0 Windows 11

      @Feng这个功能已经集成到我自己做的主题中了,用的小工具方式,可以自己配置等级区间、等级个数和等级名称。

      2025-10-24 21:40 回复
  5. 似水流年
    43楼

    感觉回到了discuz论坛时代。

    2025-10-23 17:16 回复
  6. maqingxi
    42楼

    老朋友,小等级,哈哈。

    2025-10-23 08:08 回复
  7. Hary
    41楼
    Hary2Microsoft Edge 141.0.0.0 Android 10

    好耶,新秀来了,哈哈

    2025-10-22 20:10 回复
  8. 东方木
    40楼
    东方木2Google Chrome 130.0.0.0 Windows 11

    建议集成到主题中 :razz:

    2025-10-17 12:38 回复
    • William
      WilliamGoogle Chrome 141.0.0.0 Windows 11

      @东方木已经集成过了,后台-外观-小工具中 可以选择将 评论者等级小工具 放到指定小工具中就能展示评论者等级了。

      2025-10-17 17:25 回复
  9. 灰常记忆
    39楼

    :cool: 看起来不错,有时间用上。

    2025-10-11 01:29 回复
  10. 林羽凡
    38楼

    我来看看看我是啥级别了。

    2025-10-08 11:38 回复
  11. 夜枫
    37楼
    夜枫2Google Chrome 141.0.0.0 Mac OS X  10.15.7

    看看我的等级~

    2025-10-04 14:59 回复

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

gravatar

question razz sad smile redface biggrin eek shock confused cool lol mad rolleyes wink cry