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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 04:06:32