许多 WordPress 博客的评论框支持输入 QQ 号后自动获取昵称和头像,这个功能非常实用。网上相关的教程很多,但部分内容可能已过时或存在错误。本文将提供一个经过整理和修正的实现方案,效果如下图所示:

实现原理与步骤概述
该功能主要分为三个部分:在评论表单中新增 QQ 字段并存储到数据库;通过前端 JavaScript 调用后端接口实时获取 QQ 昵称和头像;最后在评论列表和后台显示 QQ 头像而非 Gravatar 默认头像。
请注意:本文提供的部分 API 接口可能已失效,且涉及前端直接调用外部接口,存在安全与稳定性风险。建议仅作为学习参考,生产环境使用需谨慎评估。
步骤一:在评论表单中添加并存储QQ字段
首先,需要在主题的评论表单模板文件(通常是 comments.php)中,参照已有的昵称、邮箱等字段,添加一个 QQ 号的输入框。
<p class="comment-form-qq">
<label for="qq">QQ号</label>
<input id="comment-qq" name="new_field_qq" type="text" value="" placeholder="选填" />
</p>
关键点:name 属性值设为 new_field_qq,后续代码将依赖此名称。
接着,需要将用户提交的 QQ 号保存到数据库的评论元数据中。将以下代码添加到主题的 functions.php 文件中:
// 将QQ字段存入数据库
add_action('wp_insert_comment', 'save_comment_qq_field', 10, 2);
function save_comment_qq_field($comment_id, $commentdata) {
if (isset($_POST['new_field_qq'])) {
$qq = sanitize_text_field($_POST['new_field_qq']);
update_comment_meta($comment_id, 'new_field_qq', $qq);
}
}
// 在后台评论管理列表显示QQ字段
add_filter('manage_edit-comments_columns', 'add_qq_column_to_comments');
function add_qq_column_to_comments($columns) {
$columns['new_field_qq'] = __('QQ号');
return $columns;
}
add_action('manage_comments_custom_column', 'display_qq_in_comments_column', 10, 2);
function display_qq_in_comments_column($column, $comment_id) {
if ($column === 'new_field_qq') {
echo get_comment_meta($comment_id, 'new_field_qq', true);
}
}
步骤二:实时获取QQ昵称与头像(前端交互)
当用户在 QQ 输入框填写号码并离开(blur事件)时,通过 AJAX 请求后端接口获取信息并填充到昵称、邮箱和头像区域,同时使用 Cookie 记录,以便页面刷新后保持显示。
重要提醒:以下代码依赖的第三方 API (qzone.qq.com, ptlogin2.qq.com) 可能已变更或限制外部调用,且代码中存在硬编码的本地路径 (127.0.0.1),必须根据你的实际环境修改。弹出警告(alert)体验较差,建议改为更友好的提示方式。
前端 JavaScript 代码(需要 jQuery):
jQuery(document).ready(function($) {
// 页面加载时,尝试从Cookie读取并填充信息
var savedQQ = getCookie('user_qq');
var savedAvatar = getCookie('user_avatar');
if (savedQQ && savedAvatar) {
$('#comment-qq').val(savedQQ);
$('.comment-avatar-preview img').attr('src', savedAvatar);
}
// QQ输入框失去焦点时触发
$('#comment-qq').on('blur', function() {
var qq = $(this).val().trim();
if (!qq || !/^[1-9]d{4,11}$/.test(qq)) return; // 简单验证QQ号格式
// 自动填充邮箱(假设邮箱字段id为‘comment-email’)
$('#comment-email').val(qq + '@qq.com');
// 获取昵称
$.ajax({
type: 'GET',
url: '/wp-content/themes/your-theme/func_getqqinfo.php?type=getqqnickname&qq=' + qq, // 注意修改路径!
dataType: 'jsonp',
jsonp: 'callback',
jsonpCallback: 'portraitCallBack',
success: function(data) {
if (data && data[qq]) {
$('#comment-author').val(data[qq][6]); // 假设昵称字段id为‘comment-author’
setCookie('user_qq', qq, 7); // 保存7天
console.log('QQ昵称获取成功');
}
},
error: function() {
console.error('QQ昵称获取失败');
}
});
// 获取头像
$.ajax({
type: 'GET',
url: '/wp-content/themes/your-theme/func_getqqinfo.php?type=getqqavatar&qq=' + qq, // 注意修改路径!
dataType: 'jsonp',
jsonp: 'callback',
jsonpCallback: 'qqavatarCallBack',
success: function(data) {
if (data && data[qq]) {
var avatarUrl = data[qq];
$('.comment-avatar-preview img').attr('src', avatarUrl);
setCookie('user_avatar', avatarUrl, 7);
console.log('QQ头像获取成功');
}
},
error: function() {
console.error('QQ头像获取失败');
}
});
});
});
// 简单的Cookie操作函数
function setCookie(name, value, days) {
var d = new Date();
d.setTime(d.getTime() + (days * 24 * 60 * 60 * 1000));
var expires = "expires=" + d.toUTCString();
document.cookie = name + "=" + encodeURIComponent(value) + ";" + expires + ";path=/";
}
function getCookie(name) {
var nameEQ = name + "=";
var ca = document.cookie.split(';');
for (var i = 0; i < ca.length; i++) {
var c = ca[i];
while (c.charAt(0) == ' ') c = c.substring(1, c.length);
if (c.indexOf(nameEQ) == 0) return decodeURIComponent(c.substring(nameEQ.length, c.length));
}
return null;
}
后端 PHP 处理接口 (func_getqqinfo.php):
<?php
// 此文件应放在主题目录下,并确保Web服务器可访问
header("Content-Type: application/json; charset=UTF-8");
$type = isset($_GET['type']) ? $_GET['type'] : '';
$qq = isset($_GET['qq']) ? trim($_GET['qq']) : '';
// 验证QQ号格式
if (!preg_match('/^[1-9]d{4,11}$/', $qq)) {
echo json_encode(array('error' => 'Invalid QQ number'));
exit;
}
if ($type == 'getqqnickname') {
// 注意:此API可能已失效或限制调用
$apiUrl = 'http://users.qzone.qq.com/fcg-bin/cgi_get_portrait.fcg?uins=' . $qq;
$response = @file_get_contents($apiUrl);
if ($response !== false) {
$response = mb_convert_encoding($response, 'UTF-8', 'GBK');
// 返回JSONP格式
$callback = isset($_GET['callback']) ? $_GET['callback'] : 'portraitCallBack';
echo $callback . '(' . $response . ')';
} else {
echo json_encode(array('error' => 'Failed to fetch nickname'));
}
} elseif ($type == 'getqqavatar') {
// 注意:此API可能已失效或限制调用
$apiUrl = 'http://ptlogin2.qq.com/getface?appid=1006102&imgtype=3&uin=' . $qq;
$response = @file_get_contents($apiUrl);
if ($response !== false) {
// 替换回调函数名
$response = str_replace("pt.setHeader", "qqavatarCallBack", $response);
echo $response;
} else {
echo json_encode(array('error' => 'Failed to fetch avatar'));
}
} else {
echo json_encode(array('error' => 'Invalid request type'));
}
?>
步骤三:在评论列表及后台显示QQ头像
默认情况下,WordPress 使用 Gravatar 头像。我们可以通过 get_avatar 过滤器,在评论有 QQ 号时优先显示 QQ 头像。
将以下代码添加到主题的 functions.php:
// 替换评论列表中的头像为QQ头像
add_filter('get_avatar', 'replace_gravatar_with_qq_avatar', 10, 3);
function replace_gravatar_with_qq_avatar($avatar, $id_or_email, $args) {
// 仅处理评论头像
$comment = null;
if (is_object($id_or_email) && isset($id_or_email->comment_ID)) {
$comment = $id_or_email;
} elseif (is_numeric($id_or_email)) {
$comment = get_comment($id_or_email);
}
if ($comment) {
$qq_number = get_comment_meta($comment->comment_ID, 'new_field_qq', true);
if (!empty($qq_number)) {
// 注意:此API可能已失效
$apiResponse = @file_get_contents('http://ptlogin2.qq.com/getface?appid=1006102&imgtype=3&uin=' . $qq_number);
if ($apiResponse && preg_match('/http:(.*?)&t/', $apiResponse, $matches)) {
$qq_avatar_url = 'http:' . stripslashes($matches[1]);
$avatar = sprintf(
'<img src="%s" class="%s" width="%d" height="%d" alt="%s" />',
esc_url($qq_avatar_url),
esc_attr($args['class']),
$args['width'],
$args['height'],
esc_attr__('QQ Avatar')
);
}
}
}
return $avatar;
}
注意事项与优化建议
- API稳定性:本文使用的腾讯API并非公开稳定接口,随时可能失效或限制调用。这是本方案最大的风险点。
- 安全性:应对所有用户输入进行严格的验证和过滤,防止XSS等攻击。示例中的
sanitize_text_field和正则验证是基本措施。 - 性能:每次获取头像都远程调用API会影响速度,建议考虑本地缓存机制。
- 用户体验:可考虑将 alert 提示改为更优雅的非阻塞提示,并增加加载状态。
- 替代方案:如果追求稳定,可以考虑使用其他稳定的第三方头像服务,或者引导用户使用Gravatar。
以上便是实现 WordPress 评论框通过 QQ 号获取头像和昵称的完整流程。请根据你的主题结构和实际需求调整选择器、路径和细节。由于外部依赖较强,部署前请充分测试。