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

