WordPress simple_jwt_login插件钩子触发后未发送邮件问题排查
问题原因与排查方案
以下是该问题的常见诱因和可落地的分步排查路径:
高频触发失败原因
- Simple JWT Login插件默认关闭登录钩子的触发开关,未手动开启的情况下,无论怎么挂载函数都不会执行
- 钩子挂载时未声明接收参数、优先级设置不当,导致挂载失效
- 测试时调用的不是Simple JWT Login原生的登录REST接口,钩子根本不会被触发
- 发信逻辑未捕获返回值,SMTP校验拦截发信时无显性报错,同时未开启WP Debug模式看不到错误记录
- 缓存/安全插件拦截REST请求,插件核心登录逻辑未执行
分步排查操作
1. 先验证钩子是否真实触发
先替换你当前的挂载代码,加入文件日志逻辑,跳过系统日志配置的依赖直接验证执行状态:
// 增加优先级参数、声明接收1个传入的用户对象参数 add_action('simple_jwt_login_login_hook', 'my_test', 10, 1); function my_test($user = null) { // 写入钩子触发记录到wp-content目录下的自定义日志 $log = sprintf( "[%s] 登录钩子触发 | 登录用户ID:%s | 登录用户邮箱:%s\n", current_time('mysql'), $user instanceof WP_User ? $user->ID : '无有效用户对象', $user instanceof WP_User ? $user->user_email : '无有效用户对象' ); file_put_contents(WP_CONTENT_DIR . '/jwt_hook_test.log', $log, FILE_APPEND); // 原有发信逻辑,同时捕获返回值写入日志 $to = 'you@yourmail.com'; $subject = "Test mail"; $message = "Hello! This is a simple email message."; $headers[] = 'Content-type: text/html; charset=utf-8'; $headers[] = "From: me@email.com"; $mail_send_result = wp_mail($to, $subject, $message, $headers); file_put_contents( WP_CONTENT_DIR . '/jwt_hook_test.log', "发信执行结果:" . var_export($mail_send_result, true) . "\n---\n", FILE_APPEND ); }
替换代码后,用Postman等无登录态的工具模拟外部应用调用登录接口,之后到wp-content目录下查看是否生成jwt_hook_test.log文件:
- 没有生成日志文件:说明钩子完全没触发,走后续第2、3、5步排查
- 有日志但发信结果为
false:说明钩子正常触发,问题出在发信环节,走第4步排查
2. 检查插件钩子开关
进入WordPress后台Simple JWT Login的设置页面,找到Hooks配置板块,确认登录钩子对应的启用开关为打开状态,该选项插件默认为关闭状态,是此类问题最高发的诱因。
3. 确认登录接口正确性
确保你测试调用的REST接口是Simple JWT Login生成的原生登录端点(路径通常为/wp-json/simple-jwt-login/v1/login),自定义登录接口、其他JWT插件的登录接口都不会触发该插件的专属钩子。测试时不要使用已登录管理员账号的浏览器直接访问接口,避免权限校验、登录态判断跳过插件登录逻辑。
4. 排查发信环节故障
如果日志确认钩子正常触发但发信失败:
- 核对代码里填写的发件人邮箱,和Easy SMTP中配置的发件域名保持一致,多数SMTP服务会校验发件人身份,域名不匹配时会直接拒信,且不会写入默认的系统日志
- 临时创建一个测试页面,直接在页面模板中调用相同参数的
wp_mail函数发信,确认SMTP服务本身工作正常 - 开启WordPress原生Debug模式,在
wp-config.php中添加如下配置,触发请求后查看wp-content/debug.log中的隐性报错:
define( 'WP_DEBUG', true ); define( 'WP_DEBUG_LOG', true ); define( 'WP_DEBUG_DISPLAY', false );
5. 排除插件拦截影响
临时禁用所有缓存插件、WAF安全插件、REST API类增强插件后再次测试,部分防护类插件会拦截匿名REST请求,或直接缓存REST接口响应,导致插件的登录逻辑完全不执行。
内容的提问来源于stack exchange,提问作者Rollor
相关产品推荐
相关产品推荐

