为何json_encode($custom_query['query_vars'])返回NULL?wp_localize_script传值异常求助
问题排查与解决方案
让我一步步帮你拆解这两个常见的WordPress开发问题:
1. 为什么json_encode($custom_query['query_vars'])会返回NULL?
json_encode()返回NULL几乎都是因为数据无法被JSON序列化,常见原因和排查步骤如下:
快速定位错误原因
先通过内置函数获取具体失败信息,这是最高效的排查方式:
$encoded_data = json_encode($custom_query['query_vars']); if ($encoded_data === false) { // 把错误信息写入PHP日志,方便后台查看 error_log('JSON编码失败原因: ' . json_last_error_msg()); }
常见错误比如Malformed UTF-8 characters(非UTF-8编码字符)或者Recursion detected(循环引用)。
检查数据类型与内容
$custom_query->query_vars(注意WP_Query的正确属性是->query_vars而非['query_vars'])里可能包含JSON无法处理的内容:
- 比如WP内部类实例(如
WP_Tax_Query)、资源对象 - 或者存在循环引用的数组
这种情况不要直接序列化整个数组,而是提取你实际需要的字段:
// 只提取分页、分类ID这类你需要的参数 $needed_vars = array( 'paged' => $custom_query->query_vars['paged'], 'category_name' => $custom_query->query_vars['category_name'] ); $encoded_data = json_encode($needed_vars);
修复字符编码问题
如果内容里有GBK、GB2312这类非UTF-8编码的字符,json_encode会直接失败。可以用递归函数统一转换编码:
function convert_array_to_utf8($data) { if (is_array($data)) { return array_map('convert_array_to_utf8', $data); } elseif (is_string($data)) { return mb_convert_encoding($data, 'UTF-8', mb_detect_encoding($data)); } return $data; } $encoded_data = json_encode(convert_array_to_utf8($custom_query->query_vars));
2. wp_localize_script传值为NULL的问题
看你贴的代码片段,wp_localize_script( 'my_loadm...' );明显是截断了,这大概率是问题之一,另外还有几个常见坑需要排查:
补全并修正wp_localize_script调用
这个函数需要三个必填参数,且要和注册的脚本handle完全一致:
function wordpress_my_load_more_scripts() { global $custom_query; // 先确认$custom_query是有效的WP_Query实例 if (!isset($custom_query) || !($custom_query instanceof WP_Query)) { error_log('$custom_query 不是有效的WP_Query实例'); return; } wp_enqueue_script('jquery'); // 注册脚本 wp_register_script( 'my_loadmore', get_stylesheet_directory_uri() . '/myloadmore.js', array('jquery') ); // 准备要传递的数据,只传需要的字段避免序列化问题 $localize_data = array( 'query_vars' => convert_array_to_utf8($custom_query->query_vars), // 也可以只传单个参数:'current_page' => $custom_query->query_vars['paged'] ); // 正确调用wp_localize_script,handle要和注册的一致 wp_localize_script( 'my_loadmore', 'MyLoadMoreData', $localize_data ); // 别忘了入队脚本! wp_enqueue_script('my_loadmore'); } // 绑定到wp_enqueue_scripts钩子,调整优先级确保在查询之后执行 add_action('wp_enqueue_scripts', 'wordpress_my_load_more_scripts', 15);
确保$custom_query能被全局访问
如果你的$custom_query是在模板文件里实例化的,一定要在实例化前加global $custom_query;,否则全局作用域里拿不到这个变量:
// 模板文件里的查询代码 global $custom_query; $custom_query = new WP_Query(array( // 你的查询参数 ));
前端验证数据是否传递成功
在myloadmore.js里打印变量确认:
jQuery(document).ready(function($) { console.log(MyLoadMoreData); // 查看控制台是否有数据输出 });
内容的提问来源于stack exchange,提问作者Dougless
相关产品推荐
相关产品推荐

