
当 wordpress 的 `$request['body']` 返回 `wp_error` 实例而非预期字符串时,直接对其调用 `json_decode()` 会导致“cannot use object of type wp_error as array”致命错误;正确做法是先校验类型再解析 json。
在 WordPress 开发中,尤其是使用 wp_remote_get()、wp_remote_post() 等 HTTP 请求函数后,其返回值 $request 是一个关联数组,其中 'body' 键通常包含响应正文(字符串)。但若请求失败(如网络超时、DNS 解析失败、HTTP 4xx/5xx 错误等),WordPress 不会返回空字符串或 false,而是将 'body' 设为一个 WP_Error 对象——这是 WordPress 的标准错误处理机制。
此时若直接执行 json_decode($request['body']),PHP 会尝试将 WP_Error 对象当作字符串解码,而 json_decode() 内部隐式调用 __toString() 或强制转换时失败,最终在后续代码(如 $files_data['key'])中触发 “Cannot use object of type WP_Error as array” 致命错误。
✅ 正确做法:始终在 json_decode() 前检查 $request['body'] 是否为有效字符串:
// ✅ 安全解析:先排除 WP_Error,再确保非空字符串
$body = $request['body'];
if (is_wp_error($body)) {
error_log('HTTP request failed: ' . $body->get_error_message());
return; // 或抛出自定义异常、返回默认值等
}
if (!is_string($body) || trim($body) === '') {
error_log('Empty or non-string response body received.');
return;
}
$files_data = json_decode($body, true); // 推荐使用 associative = true
if (json_last_error() !== JSON_ERROR_NONE) {
error_log('Invalid JSON in response: ' . json_last_error_msg());
return;
}
// ✅ 此时 $files_data 可安全作为数组使用
if (isset($files_data['files']) && is_array($files_data['files'])) {
foreach ($files_data['files'] as $file) {
// 处理单个文件数据
}
}⚠️ 注意事项:
- is_wp_error() 是 WordPress 核心函数,必须在 WordPress 环境中使用(不可在纯 PHP CLI 脚本中直接调用);
- 始终配合 json_last_error() 验证 JSON 解析结果,避免静默失败;
- 不要依赖 json_decode() === null 判断失败——因为 null 也可能是合法 JSON(如 null 字面量),应使用 json_last_error();
- 若该请求由第三方 API 触发,建议追查 WP_Error 的根源:检查 $request['response']['code']、启用 WP_DEBUG_LOG 查看完整错误堆栈,定位是认证失败、URL 错误还是服务器拒接。
从根本上讲,此错误不是代码“突然出错”,而是暴露了原有逻辑对 WordPress 错误传播机制的忽视。健全的远程请求处理流程应包含:请求发起 → 错误拦截 → 响应体校验 → JSON 解析 → 数据结构验证 —— 缺一不可。










