You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 22:45:03