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

WordPress钩子插件输出JSON带HTML页面,如何仅返回纯JSON?

解决WordPress钩子输出JSON时附带完整HTML的问题

这个问题的核心是钩子的执行时机不对,导致WordPress已经开始渲染页面的HTML结构后,你的JSON输出才被追加进去。另外你原代码里的循环逻辑也有小问题(每次循环会覆盖$myContents,应该用数组存储多条数据),我给你一步步梳理解决方案:

1. 选择正确的钩子并添加请求判断

不要用wp_footer、wp_head这类会在页面渲染阶段触发的钩子,应该用init钩子——这是WordPress初始化完成后、页面渲染前的关键节点。同时要添加一个自定义的GET参数(比如fetch_gc_posts),用来标识这是一个JSON请求,避免影响正常页面的加载。

2. 修正数据处理逻辑

你原来的循环会每次覆盖$myContents,如果有多条数据的话只会保留最后一条,应该把它改成数组来存储所有结果。

3. 确保输出纯JSON并终止执行

wp_send_json()函数本身会自动设置正确的Content-Type头,并且调用wp_die()终止WordPress的后续执行,但前提是在它之前没有任何HTML输出。结合钩子时机和请求判断,就能保证只输出纯JSON。

完整修正后的代码示例

add_action('init', 'gc_output_custom_posts_json');

function gc_output_custom_posts_json() {
    // 检查是否是目标JSON请求,这里用自定义GET参数判断
    if (!isset($_GET['fetch_gc_posts'])) {
        return; // 如果不是,直接返回,不影响正常页面
    }

    global $wpdb, $target_dir; // 确保全局变量可用
    $organization = $_GET['organization']; // 假设你从GET参数获取userid,注意要做安全验证!

    // 安全处理:用prepare防止SQL注入,这是更规范的写法
    $getPosts = $wpdb->get_results(
        $wpdb->prepare("SELECT * FROM gc_posts WHERE userid = %d", $organization)
    );

    $myContents = []; // 用数组存储多条数据
    foreach($getPosts as $post) {
        $imageLocation = $target_dir . $post->image;
        $myContents[] = [
            'title' => $post->title,
            'description' => $post->description,
            'image' => $imageLocation
        ];
    }

    // 输出JSON并终止执行
    wp_send_json($myContents);
}

调用方式

现在你可以通过类似这样的URL请求纯JSON:
http://your-site.com/?fetch_gc_posts=1&organization=xxx

额外注意事项

  • 安全验证:一定要对用户输入做SQL注入防护,上面示例用的$wpdb->prepare()是WordPress推荐的安全做法,比单纯转义更可靠。
  • 避免提前输出:确保你的插件代码中没有任何echo、print或者PHP标签外的空白字符(比如多余的换行、空格),这些都会导致HTML输出提前,破坏JSON的纯净性。

内容的提问来源于stack exchange,提问作者Mohd Ahmed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:13:02