解析嵌套的JSON并将结果保存为WordPress post meta



我很难解析嵌套JSON文件中的值。JSON是从对外部API的wp_remote_post请求生成的,它包括需要解析并保存为给定类别中不同帖子的postmeta的数据。当在后台编辑/更新类别时,每个请求都会被触发,并且项目ID(通过PHP从$wpdb查询传递(都对应于数据库中的现有帖子。

虽然我能够获得数据,但我不知道如何提取/解析";位置";以及";措施";值,然后将这些值保存为与每个项目ID关联的帖子的postmeta。更为复杂的是,响应中项目ID的顺序永远不会与请求中的顺序相同,并且对于某些项目,可能有多个具有不同度量值的子ID(因此,我们只希望来自与父/项目ID匹配的子ID的度量值(。

以下是我生成请求的方式。。。

基于模板构建请求主体

function build_json_body( $itemids ) {
$request = '{"batch_list": [{
"page"                  : 1,
"page_size"             : 2000,
"id_type"               : "item_id",
"id_list"               : ['.$itemids.'],
"target_geography_list" : ["local_dma"],
"fieldset"              : ["item_id","start_time","end_time","location.zip_code","location.county_name","location.state","child_references.child_id","child_references.measures"]
},{
"page"                  : 1,
"page_size"             : 2000,
"id_type"               : "item_id",
"id_list"               : ['.$itemids.'],
"target_geography_list" : ["local_cbsa"],
"fieldset"              : ["item_id","start_time","end_time","location.zip_code","location.county_name","location.state","child_references.child_id","child_references.measures"]
}]}';
return $request;
}

发出POST请求并检索JSON

function make_post_request($id) {
$term_var = $_GET['tag_ID']; 
$term_name = get_category($term_var)->slug; 
global $wpdb;
$data = $wpdb->get_var("SELECT GROUP_CONCAT(pm1.meta_value) FROM wp_term_relationships t INNER JOIN wp_posts p ON t.object_id = p.ID LEFT JOIN wp_postmeta pm1 ON (pm1.post_id = p.ID AND pm1.meta_key = 'item_id') WHERE p.post_type ='post' AND p.post_status = 'publish' AND t.term_taxonomy_id = $term_var");
if (empty($data)) return; 

$request = build_json_body( $data );
$url = "https://api.com/v1.0/items/search/batch";
$response = wp_remote_post( $url, array(
'method' => 'POST',
'timeout' => 45,
'headers' => array(
'Key' => 'djfaijfdnflaenfkn',
'Content-Type' => 'application/json',
'Connection' => 'keep-alive'          
),
'body'    => $request
));
$json = wp_remote_retrieve_body ($response);
}
add_action( 'category_edit_form_fields', 'make_post_request', 1 );

嵌套的JSON响应

[
{
"summary": {
"count": 4,
"items": [
{
"item_id": 1141,
"start_time": "00:00:00",
"end_time": "23:59:59",
"location": {
"county_name": "Fulton County",
"zip_code": "30318",
"state": "GA"
},
"child_references": [
{
"child_id": 1062,
"measures": {
"market": "local_dma",
"reach_pct": 12.339821134389794,
"reach_net": 676047,
"eff_freq_min": 3,
"eff_freq_avg": 8.198273562390643,
"eff_reach_net": 89426,
"eff_reach_pct": 1.6322835094198298,
}
},
{
"child_id": 1055,
"measures": {
"market": "local_dma",
"reach_pct": 12.339821134389794,
"reach_net": 676047,
"eff_freq_min": 3,
"eff_freq_avg": 8.198273562390643,
"eff_reach_net": 89426,
"eff_reach_pct": 1.6322835094198298,
}
},
{
"child_id": 1141,
"measures": {
"market": "local_dma",
"reach_pct": 12.339821134389794,
"reach_net": 676047,
"eff_freq_min": 3,
"eff_freq_avg": 8.198273562390643,
"eff_reach_net": 89426,
"eff_reach_pct": 1.6322835094198298,
}
}
]
},
{
"item_id": 298,
"start_time": "06:00:00",
"end_time": "23:59:59",
"location": {
"county_name": "Fulton County",
"zip_code": "30312",
"state": "GA"
},
"child_references": [
{
"child_id": 298,
"measures": {
"market": "local_dma",
"reach_pct": 13.685710910296048,
"reach_net": 734316,
"eff_freq_min": 3,
"eff_freq_avg": 13.019577760704172,
"eff_reach_net": 122804,
"eff_reach_pct": 1.9785748227633993,
}
}
]
},
{
"item_id": 3877,
"start_time": "00:00:00",
"end_time": "23:59:59",
"location": {
"county_name": "Fulton County",
"zip_code": "30312",
"state": "GA"
},
"child_references": [
{
"child_id": 3877,
"measures": {
"market": "local_dma",
"reach_pct": 13.255470390000001,
"reach_net": 726211,
"eff_freq_min": 3,
"eff_freq_avg": 12.946919262713509,
"eff_reach_net": 87695,
"eff_reach_pct": 1.6006934500000016,
}
}
]
},
{
"item_id": 5002,
"start_time": "06:00:00",
"end_time": "23:59:59",
"location": {
"county_name": "Floyd County",
"zip_code": "30161",
"state": "GA"
},
"child_references": [
{
"child_id": 5002,
"measures": {
"market": "local_dma",
"reach_pct": 2.3949999818141943,
"reach_net": 131212,
"eff_freq_min": 3,
"eff_freq_avg": 14.373137857978316,
"eff_reach_net": 13961,
"eff_reach_pct": 0.25483470695073507,
}
}
]
}
],
"pagination": {
"page": 1,
"page_size": 1000,
"number_of_pages": 1,
"number_of_items": 4,
"number_of_children": 6
}
}
},
{
"summary": {
"count": 4,
"items": [
{
"item_id": 1141,
"start_time": "00:00:00",
"end_time": "23:59:59",
"location": {
"county_name": "Fulton County",
"zip_code": "30318",
"state": "GA"
},
"child_references": [
{
"child_id": 1062,
"measures": {
"market": "local_cbsa",
"reach_pct": 13.923677970045933,
"reach_net": 640729,
"eff_freq_min": 3,
"eff_freq_avg": 8.205504112511724,
"eff_reach_net": 85192,
"eff_reach_pct": 1.8513057200313823,
}
},
{
"child_id": 1055,
"measures": {
"market": "local_cbsa",
"reach_pct": 13.923677970045933,
"reach_net": 640729,
"eff_freq_min": 3,
"eff_freq_avg": 8.205504112511724,
"eff_reach_net": 85192,
"eff_reach_pct": 1.8513057200313823,
}
},
{
"child_id": 1141,
"measures": {
"market": "local_cbsa",
"reach_pct": 13.923677970045933,
"reach_net": 640729,
"eff_freq_min": 3,
"eff_freq_avg": 8.205504112511724,
"eff_reach_net": 85192,
"eff_reach_pct": 1.8513057200313823,
}
}
]
},
{
"item_id": 298,
"start_time": "06:00:00",
"end_time": "23:59:59",
"location": {
"county_name": "Fulton County",
"zip_code": "30312",
"state": "GA"
},
"child_references": [
{
"child_id": 298,
"measures": {
"market": "local_cbsa",
"reach_pct": 15.129410910296048,
"reach_net": 696214,
"eff_freq_min": 3,
"eff_freq_avg": 10.339577760704172,
"eff_reach_net": 117002,
"eff_reach_pct": 2.5425748227633993,
}
}
]
},
{
"item_id": 3877,
"start_time": "00:00:00",
"end_time": "23:59:59",
"location": {
"county_name": "Fulton County",
"zip_code": "30312",
"state": "GA"
},
"child_references": [
{
"child_id": 3877,
"measures": {
"market": "local_cbsa",
"reach_pct": 15.533829340000004,
"reach_net": 714824,
"eff_freq_min": 3,
"eff_freq_avg": 12.947291296187263,
"eff_reach_net": 86320,
"eff_reach_pct": 1.8758217000000021,
}
}
]
},
{
"item_id": 5002,
"start_time": "06:00:00",
"end_time": "23:59:59",
"location": {
"county_name": "Floyd County",
"zip_code": "30161",
"state": "GA"
},
"child_references": [
{
"child_id": 5002,
"measures": {
"market": "local_cbsa",
"reach_pct": 84.46830572687526,
"reach_net": 62052,
"eff_freq_min": 3,
"eff_freq_avg": 15.370369275263602,
"eff_reach_net": 11180,
"eff_reach_pct": 15.219251666046995,
}
}
]
}
],
"pagination": {
"page": 1,
"page_size": 1000,
"number_of_pages": 1,
"number_of_items": 4,
"number_of_children": 6
}
}
}
]

我想你想要WP_oEmbed::_parse_json( string $response_body )

https://developer.wordpress.org/reference/classes/wp_oembed/_parse_json/

最新更新