如何在WordPress中用PHP解码API返回的多维数组格式JSON数据
问题排查&修复方案
你代码一共存在4个核心问题:
- 没有做错误兼容处理:API请求失败、JSON解析失败时直接取数组键会抛出PHP警告
- WordPress环境不推荐用
file_get_contents发起外部请求:多数主机默认禁用allow_url_fopen配置,会导致请求失败,应使用WordPress内置的HTTP API - JSON结构遍历逻辑错误:接口返回的
$datetim['times']本身就是包含Sunrise等键的一维关联数组,不需要再嵌套遍历,你额外加了一层foreach遍历times,会直接取到各个时间的字符串值,自然取不到Sunrise键 - 短代码回调函数直接输出内容违反WordPress规范:短代码的返回值才会插入到内容对应位置,直接echo会导致内容输出到页面错误位置
修复后可直接运行的代码
function decode_func(){ // 使用WordPress内置HTTP API发起请求 $response = wp_remote_get('https://api.pray.zone/v2/times/today.json?city=jakarta'); // 校验请求是否成功 if(is_wp_error($response) || wp_remote_retrieve_response_code($response) != 200){ return '请求数据失败'; } $json = wp_remote_retrieve_body($response); $decoded_json = json_decode($json,true); // 校验JSON解析是否成功、结构是否符合预期 if(json_last_error() !== JSON_ERROR_NONE || !isset($decoded_json['results']['datetime'])){ return '数据解析失败'; } $output = ''; // 直接遍历datetime数组,不需要多层无效嵌套 foreach($decoded_json['results']['datetime'] as $item){ // 直接取times下的Sunrise字段即可 if(isset($item['times']['Sunrise'])){ $output .= esc_html($item['times']['Sunrise']).'<br>'; } } return $output; } add_shortcode('decode','decode_func');
内容的提问来源于stack exchange,提问作者yasin
相关产品推荐
相关产品推荐

