WordPress用户角色变更邮件通知未触发,set_user_role钩子失效问题求教
问题诱因及排查解决方向
核心原因:set_user_role钩子未被触发
你贴的代码本身逻辑没有问题,所有邮件配置正常但无发送记录,本质是你修改用户角色的操作没有触发该钩子,常见诱因如下:
- 你使用的会员插件/用户管理插件自定义了角色修改逻辑,没有调用WordPress核心的
set_user_role()函数,而是直接操作数据库更新用户角色字段,或使用了自定义的角色变更钩子 - 批量修改用户角色、通过前端自助审核类功能修改角色时,部分操作会调用
wp_update_user()传role参数的方式更新,该场景下如果没有额外处理也不会触发set_user_role钩子 - 其他主题或插件通过
remove_action('set_user_role', ...)提前移除了你的钩子挂载,或钩子执行优先级设置冲突导致你的回调函数没有被执行 - 如果你是多站点环境,
set_user_role的触发逻辑和单站点有差异,也可能出现回调未执行的情况
修复方案
你可以改用覆盖场景更广的profile_update钩子,或者同时挂载两个钩子确保触发,修改后的代码如下:
// 同时挂载两个钩子覆盖所有角色变更场景 add_action( 'set_user_role', 'send_role_change_notification', 10, 2 ); add_action( 'profile_update', 'send_role_change_notification_on_profile_update', 10, 2 ); function send_role_change_notification( $user_id, $new_role ) { $site_url = get_bloginfo('wpurl'); $user_info = get_userdata( $user_id ); if ( !$user_info ) return; $to = $user_info->user_email; $subject = "角色变更通知:".$site_url; $message = "您好 ".$user_info->display_name.",您在 ".$site_url." 的账户角色已变更,当前角色为:" . $new_role; wp_mail($to, $subject, $message); } function send_role_change_notification_on_profile_update( $user_id, $old_user_data ) { $new_user_data = get_userdata( $user_id ); $old_roles = $old_user_data->roles; $new_roles = $new_user_data->roles; // 仅当角色发生变化时发送邮件 if ( $old_roles !== $new_roles ) { $new_role = implode(',', $new_roles); send_role_change_notification( $user_id, $new_role ); } }
额外排查建议
如果修改后仍不生效,可按以下步骤排查:
- 先手动调用
set_user_role()函数测试钩子是否正常触发,比如在测试页面临时加代码set_user_role(1, 'administrator')看是否发邮件 - 暂时停用其他会员类、用户管理类插件,排查是否是插件拦截了钩子执行
- 确认你修改的
functions.php是当前启用的主题/子主题的文件,不要误改了未启用主题的配置
内容的提问来源于stack exchange,提问作者Æthelstan
相关产品推荐
相关产品推荐

