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

为何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:37:05