WordPress自定义主题自定义注册$_POST不生效提交返回404问题
问题原因
- 表单代码存在语法错误:原代码中form标签的action属性书写不完整,
<?php echo $_SERVER['REQUEST_URI']缺少闭合标识和属性收尾引号,可能导致提交地址解析异常。 - 表单字段使用了WordPress系统保留参数名:如果表单内input的name属性为
name、p、page_id、post_type等WordPress内置查询参数,提交POST请求时会被系统识别为文章查询请求,匹配不到对应内容就会返回404。 - WordPress的 canonical 重定向规则拦截:默认的重定向校验会对自定义页面的POST请求做规则匹配,不符合规则的请求会被跳转到404页面。
修复方案
- 先修正表单语法错误,把form标签替换为正确写法:
<form class="form" method="POST" action="<?php echo esc_url($_SERVER['REQUEST_URI']); ?>">
- 排查所有表单字段的name属性,把和WordPress保留参数重名的字段改为自定义名称,例如把原本
name="name"的字段改为name="reg_username"即可。 - 在注册模板的PHP代码最顶部添加规则,禁用当前页面的重定向校验:
<?php /* Template Name: Registration */ // 新增以下代码禁用当前页面的canonical重定向 add_action('template_redirect', function() { if (is_page_template('registration.php')) { remove_action('template_redirect', 'redirect_canonical'); } }, 0); global $wpdb, $user_ID; if ($_POST) { // 原有注册逻辑 } get_header(); ?>
- 若上述方法仍不生效,可以改用
init钩子提前处理注册逻辑,避免模板加载阶段的规则拦截:
// 放在主题的functions.php文件中,或者注册模板的最顶部 add_action('init', function() { // 判断是注册页面的POST提交请求,reg_submit为你表单提交按钮的name属性值 if (isset($_POST['reg_submit']) && strpos($_SERVER['REQUEST_URI'], '/registration/') !== false) { // 这里放原来的参数获取、校验、创建用户逻辑 // 处理完成后可以自行跳转或者添加错误提示 } });
内容的提问来源于stack exchange,提问作者Michal Gally
相关产品推荐
相关产品推荐

