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
相关产品推荐
相关产品推荐

