WordPress插件更新报错:无效JSON响应及翻译挂钩疑问
问题诊断与修复方案
一、“更新失败。响应不是有效的JSON响应”错误原因
你的my_plugin_show_confirm函数挂载在init钩子上并直接输出HTML内容,这是核心问题:
init属于WordPress早期初始化阶段,此时页面输出流程尚未启动,直接输出HTML会导致响应头提前发送。- 后台更新文章/页面依赖AJAX请求,虽然函数里有
!is_admin()判断,但前端页面的init输出会打乱全局响应结构,最终导致AJAX请求期望的JSON格式被破坏,触发错误。
二、修复步骤
1. 拆分逻辑:表单处理与弹窗输出分离
- 表单提交的Cookie设置逻辑保留在
init钩子(需在页面输出前完成Cookie设置)。 - 弹窗HTML输出移至
wp_body_open(WordPress 5.2+支持)或wp_footer钩子,确保HTML输出到页面正确位置,不会干扰响应结构。
2. 修正翻译挂钩流程
register_pll_translation函数必须挂载到init钩子(Polylang要求在初始化阶段完成字符串注册),同时要把占位符"string"替换为实际需要翻译的文本。
三、翻译与弹窗流程正确性确认
翻译挂钩流程(正确)
- 挂载到
init钩子符合Polylang的规范,能保证字符串被正确注册到翻译系统。注意第二个参数必须是原始文本,不能用占位符,否则无法正常触发翻译。
弹窗显示流程(原逻辑错误,修正后正确)
- 原逻辑在
init输出HTML违反WordPress输出规范,修正为wp_body_open或wp_footer输出后,既能保证弹窗正常显示,又不会破坏响应结构。
四、修改后的完整代码
if(!defined('ABSPATH')) { exit; } // 注册样式与脚本 add_action('wp_enqueue_scripts', 'cp_scripts'); function cp_scripts() { wp_enqueue_style('cookie-style', plugins_url('style.css', __FILE__)); wp_enqueue_script('cookie-script', plugins_url('script.js', __FILE__)); } // 处理表单提交与Cookie设置 add_action('init', 'my_plugin_handle_cookie_submit'); function my_plugin_handle_cookie_submit() { // 仅处理前端的表单提交 if (!is_admin() && isset($_POST['submit'])) { setcookie('cp_enter', 1, time() + (60 * 60 * 24 * 30), COOKIEPATH, COOKIE_DOMAIN); // 提交后刷新页面,避免重复提交 wp_redirect(get_permalink()); exit; } } // 注册Polylang翻译字符串 add_action('init', 'register_pll_translation'); function register_pll_translation() { if(function_exists('pll_register_string')) { pll_register_string('cp_form_subtitle', "Click to enter", 'cp-form', false); pll_register_string('cp_form_age_ok', "Enter", 'cp-form', false); } } // 输出弹窗HTML add_action('wp_body_open', 'my_plugin_show_confirm'); function my_plugin_show_confirm() { if (!isset($_COOKIE['cp_enter']) && !is_admin()) { $current_url = get_permalink(); ?> <div id="my-plugin-confirm"> <form action="<?php echo esc_url($current_url); ?>" method="post"> <h2><?php echo esc_html(get_bloginfo('name'));?></h2> <p><?php echo pll__("Click to enter");?></p> <button type="submit" name="submit"><?php echo pll__("Enter");?></button> </form> </div> <?php } }
额外优化点
- 表单
action使用esc_url()转义,符合WordPress安全规范。 - 表单提交后用
wp_redirect()跳转,避免页面刷新后重复提交。 - 翻译文本使用
pll__()调用,确保显示对应语言内容。
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

