WordPress-Discord注册通知集成:Hook触发失败求助
问题排查与修复方案
核心问题分析
你的插件存在几个关键问题导致钩子不触发或通知失败:
user_register钩子仅在前端注册表单创建新用户时触发,后台手动添加用户不会触发该钩子- 函数
on_user_register内部无法访问全局变量$discord_bot_endpoint,导致请求地址为空 - 发送给Discord Webhook的数据格式不符合要求,Discord需要特定的结构(比如
content或embeds字段)
修复步骤
1. 兼容后台用户创建动作
添加user_created钩子覆盖后台添加用户的场景,同时保留user_register覆盖前端注册:
add_action('user_register', 'on_user_register'); add_action('user_created', 'on_user_register');
2. 修正变量作用域
在函数内部声明global $discord_bot_endpoint,或者直接把Webhook地址写在函数内部避免全局变量问题:
function on_user_register($user_id) { global $discord_bot_endpoint; // 声明访问全局变量 // 或者直接定义:$discord_bot_endpoint = '你的Webhook地址'; // ... 其他代码 }
3. 调整Discord Webhook数据格式
Discord Webhook需要指定content字段显示消息内容,或者用embeds格式化消息。示例格式:
$data = array( 'content' => "新用户注册通知:\n用户名: {$username}\n姓名: {$first_name} {$last_name}\n用户ID: {$user_id}" );
4. 增加调试日志
除了请求失败日志,添加成功日志便于排查:
if (is_wp_error($response)) { error_log('Discord通知发送失败: ' . $response->get_error_message()); } else { error_log('Discord通知发送成功,响应状态码: ' . wp_remote_retrieve_response_code($response)); }
完整修正代码
<?php /* Plugin Name: Discord Registration Notification Description: Send notifications to Discord when a user registers. Version: 1.0 */ // Define the Discord bot endpoint where the notification should be sent $discord_bot_endpoint = 'https://discord.com/api/webhooks/1171354893924171787/5Exxxx_xxxF'; // User registration event handling function on_user_register($user_id) { global $discord_bot_endpoint; $user = get_userdata($user_id); if (!$user) { error_log('无法获取用户数据,用户ID: ' . $user_id); return; } $username = $user->user_login; $first_name = $user->first_name; $last_name = $user->last_name; $email = $user->user_email; // 可选:添加邮箱信息 // 符合Discord Webhook要求的数据格式 $data = array( 'content' => "📢 新用户注册通知\n" . "用户名: {$username}\n" . "姓名: {$first_name} {$last_name}\n" . "邮箱: {$email}\n" . "用户ID: {$user_id}" ); $response = wp_safe_remote_post($discord_bot_endpoint, array( 'body' => json_encode($data), 'headers' => array('Content-Type' => 'application/json'), 'timeout' => 10, // 增加超时时间 )); if (is_wp_error($response)) { error_log('Discord通知发送失败: ' . $response->get_error_message()); } else { $status_code = wp_remote_retrieve_response_code($response); if ($status_code === 204) { error_log('Discord通知发送成功'); } else { error_log('Discord通知响应异常,状态码: ' . $status_code . ',响应内容: ' . wp_remote_retrieve_body($response)); } } } // 挂载钩子,覆盖前端和后台创建用户场景 add_action('user_register', 'on_user_register'); add_action('user_created', 'on_user_register');
额外排查建议
- 检查WordPress错误日志(通常在
wp-content/debug.log,需要开启WP_DEBUG) - 验证Discord Webhook地址是否有效:可以用Postman直接发送请求测试
- 确保服务器允许对外发送HTTP请求(部分主机可能禁用
wp_safe_remote_post)
内容的提问来源于stack exchange,提问作者PyDeveloper
相关产品推荐
相关产品推荐

