WordPress用Duplicator复制页面后未登录提交表单报JSON解析错误
问题原因分析
- 你遇到的
Unexpected token < in JSON at position 0报错,本质是未登录状态下请求admin-post.php时服务端返回302跳转,跳转后的响应内容为HTML页面而非前端预期的JSON格式,前端尝试将HTML解析为JSON时触发语法错误。 - 结合Duplicator克隆站点的场景,302跳转的常见触发原因如下:
- 克隆时同步了原环境的
.htaccess规则,原环境配置了wp-admin目录未登录访问限制,本地环境无对应豁免逻辑导致公开admin-post请求被拦截跳转 - Duplicator迁移后未完全替换旧域名路径,WordPress站点URL/首页URL配置与实际本地路径不匹配,权限校验时路径判定异常触发跳转
- 主题或自定义代码的
admin_init钩子存在未登录拦截逻辑,仅豁免了已登录用户的admin-post请求,未兼容admin_post_nopriv_*类的公开请求场景
- 克隆时同步了原环境的
修复步骤
- 校验站点基础配置
进入WordPress后台「设置-常规」,确认WordPress地址(URL)和站点地址(URL)均为http://localhost/mysite,与表单提交的admin-post.php请求前缀完全一致。 - 排查
.htaccess规则
检查站点根目录、wp-admin目录下的.htaccess文件,删除针对wp-admin路径的未登录跳转规则,本地测试环境可暂时替换为WordPress默认规则:# BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteBase /mysite/ RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /mysite/index.php [L] </IfModule> # END WordPress - 排查
admin_init拦截逻辑
若上述两步无效,搜索主题、自定义代码中admin_init钩子的回调函数,为公开admin-post请求添加豁免逻辑,参考代码如下:add_action('admin_init', function() { // 豁免当前表单的公开提交请求 if (isset($_REQUEST['action']) && $_REQUEST['action'] === 'create_pre_lead') { return; } // 保留原有未登录跳转逻辑 if (!is_user_logged_in() && !defined('DOING_AJAX')) { wp_redirect(home_url()); exit; } }); - 验证修复效果
未登录状态下触发表单提交,确认admin-post.php请求返回状态码为200、响应内容为标准JSON格式即可。
内容的提问来源于stack exchange,提问作者enky
相关产品推荐
相关产品推荐

