
本文详解如何修复 wordpress 中因将 wp_error 对象当作数组或 json 字符串解码而导致的 “fatal error: cannot use object of type wp_error as array” 错误,并提供健壮的防御性代码写法。
该错误通常出现在调用 WordPress HTTP API(如 wp_remote_get() 或 wp_remote_post())后,未校验响应结果就直接对 $response['body'] 执行 json_decode() —— 而当请求失败时,WordPress 并不会返回字符串,而是返回一个 WP_Error 实例。此时 $request['body'] 实际上并不存在(WP_Error 对象不支持数组访问语法),强行用 [] 访问或传给 json_decode() 就会触发致命错误。
✅ 正确做法是:在解析前严格判断响应类型。以下为推荐的健壮写法:
// ✅ 安全获取并解析响应体
$body = $request['body'] ?? null;
// 先检查是否为 WP_Error(最常见错误源)
if (is_wp_error($request)) {
error_log('WP Remote Request failed: ' . $request->get_error_message());
return;
}
// 再确保 $body 是非空字符串,再尝试 JSON 解析
if (!is_string($body) || trim($body) === '') {
error_log('Empty or invalid response body received.');
return;
}
$files_data = json_decode($body, true); // 建议加第二个参数 true,返回关联数组而非对象
if (json_last_error() !== JSON_ERROR_NONE) {
error_log('JSON decode failed: ' . json_last_error_msg());
return;
}
// ✅ 此时 $files_data 是安全的数组或 null,可继续业务逻辑
if ($files_data === null) {
return;
}⚠️ 关键注意事项:
- 不要假设 $request 一定是数组 —— wp_remote_*() 成功时返回关联数组,失败时返回 WP_Error 对象;
- 永远不要跳过 is_wp_error() 检查,这是 WordPress 插件/主题开发的必备防御习惯;
- 使用 json_decode($body, true) 显式要求返回数组,避免后续代码中混淆对象与数组访问方式;
- 结合 json_last_error() 进一步验证 JSON 格式合法性,防止服务端返回 HTML 错误页等“假成功”响应。
? 总结:该错误本质是类型安全缺失。通过前置类型校验 + 清晰的错误日志,不仅能快速定位问题根源(如 API 地址失效、SSL 验证失败、超时等),还能显著提升代码健壮性与可维护性。建议将上述模式封装为复用函数,统一处理所有远程请求响应。










