如何为wpa_front_end_login添加单次运行判断解决重复发邮件问题
根因说明
该问题是wpa_front_end_login登录处理函数被重复触发导致的:函数每次运行都会生成新的一次性token并发送邮件,后生成的token会覆盖前一个的有效记录,所以先收到的邮件里的链接会提示token过期,只有最后一封的链接可用。
方案1:修改插件核心代码(最简单直接)
打开插件的passwordless_login.php文件,找到wpa_front_end_login函数的定义位置,在函数内部的最开头添加以下代码即可:
// 防止函数重复执行 static $execution_flag = false; if ($execution_flag) { return; } $execution_flag = true;
这里用静态变量做单次执行标记,同一个请求生命周期内函数只会运行一次,不会重复生成token和发邮件。
注意:插件更新升级会覆盖修改的代码,升级后需要重新添加。
方案2:主题侧钩子拦截(无插件升级兼容问题)
如果你不想修改插件代码,可以将以下代码添加到当前使用主题的functions.php文件中,或者通过Code Snippets这类代码片段插件添加:
add_action('init', 'fix_passwordless_duplicate_email', 0); function fix_passwordless_duplicate_email() { if (isset($_POST['wpa_submit']) && function_exists('wpa_front_end_login')) { // 移除所有重复挂载的登录处理钩子 remove_all_actions('wp_ajax_nopriv_wpa_front_end_login'); remove_all_actions('wp_ajax_wpa_front_end_login'); // 仅挂载一次处理函数 add_action('wp_ajax_nopriv_wpa_front_end_login', 'wpa_front_end_login'); add_action('wp_ajax_wpa_front_end_login', 'wpa_front_end_login'); } }
这段代码会在表单提交请求初始化时,清理所有重复挂载的处理钩子,只保留一次有效执行。
验证步骤
修改完成后清空站点缓存,做以下测试确认修复:
- 输入已注册用户名提交表单,检查收到的邮件数量
- 输入已绑定邮箱提交表单,检查收到的邮件数量
- 点击邮件内的登录链接,确认可正常登录无token过期提示
内容的提问来源于stack exchange,提问作者user17604307
相关产品推荐
相关产品推荐

