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

如何为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 18:36:04