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

WordPress中通过get_posts生成嵌套JSON结构问题求助

解决WP_Query生成指定嵌套JSON结构的方案

核心思路

先通过WP_Query获取所有**pays(国家/地区)自定义文章,再关联对应的tarif(资费)**文章,按country_zone分组,最终整理成目标嵌套结构。

具体实现代码

假设你的ACF字段配置如下:

  • pays文章类型:包含country_zone字段(存储区域名称,如"欧洲区")
  • tarif文章类型:包含linked_pays(关联对应的pays文章)、tarif_out(境外通话资费)、tarif_in(境内通话资费)、tarif_data(流量资费)字段
// 初始化最终JSON结构数组
$final_json_data = [];

// 查询所有pays自定义文章类型
$pays_query = new WP_Query([
    'post_type' => 'pays',
    'posts_per_page' => -1,
    'post_status' => 'publish'
]);

if ($pays_query->have_posts()) {
    while ($pays_query->have_posts()) {
        $pays_query->the_post();
        
        // 获取当前pays所属的country_zone
        $country_zone = get_field('country_zone');
        if (!$country_zone) continue; // 跳过未设置区域的条目

        // 查询关联的tarif文章
        $tarif_query = new WP_Query([
            'post_type' => 'tarif',
            'posts_per_page' => -1,
            'post_status' => 'publish',
            'meta_query' => [
                [
                    'key' => 'linked_pays', // 关联pays的ACF字段名
                    'value' => get_the_ID(),
                    'compare' => '='
                ]
            ]
        ]);

        $tarif_zones = [];
        if ($tarif_query->have_posts()) {
            while ($tarif_query->have_posts()) {
                $tarif_query->the_post();
                
                // 提取tarif的三个字段,空值设为默认值(根据需求调整)
                $tarif_zones[] = [
                    'out' => get_field('tarif_out') ?: '0',
                    'in' => get_field('tarif_in') ?: '0',
                    'data' => get_field('tarif_data') ?: '0'
                ];
            }
            wp_reset_postdata(); // 重置tarif查询的全局post对象
        }

        // 合并同一country_zone下的tarif_zones(避免重复区域覆盖)
        if (isset($final_json_data[$country_zone])) {
            $final_json_data[$country_zone] = array_merge($final_json_data[$country_zone], $tarif_zones);
        } else {
            $final_json_data[$country_zone] = $tarif_zones;
        }
    }
    wp_reset_postdata(); // 重置pays查询的全局post对象
}

// 转成JSON格式(带JSON_UNESCAPED_UNICODE避免中文转义)
$output_json = json_encode($final_json_data, JSON_UNESCAPED_UNICODE);

// 输出JSON(如果是供前端AJAX调用,记得设置header)
// header('Content-Type: application/json');
// echo $output_json;

关键注意点

  • 若多个pays属于同一个country_zone,代码会自动合并对应的tarif数据,不会覆盖已有条目
  • 需根据你实际的ACF字段名替换代码中的字段标识(比如country_zone、linked_pays等)
  • 空值处理可根据业务需求调整,示例中设为'0',也可改为null或其他默认值
  • 如果需要通过AJAX提供JSON,记得在函数开头添加header('Content-Type: application/json');,并确保没有其他输出干扰

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 20:17:06