WordPress插件XE Preview参数类型警告报错求助
解决XE Preview插件的「第一个参数必须是对象或现有类的名称」警告
错误原因定位
警告出现在第24行的property_exists($data,"data"),核心问题是$data不符合property_exists的参数要求:
- 当API请求失败(如主机禁用
file_get_contents、网络超时),file_get_contents返回false,json_decode(false)得到null,此时property_exists(null, "data")触发警告。 - 若API返回JSON数组而非对象,
json_decode默认返回数组,property_exists无法用于数组类型。
修复方案
1. 替换file_get_contents为CURL(更可靠的请求方式)
多数主机会禁用allow_url_fopen导致file_get_contents无法请求外部API,改用CURL可避免此问题,同时能获取HTTP状态码判断请求是否成功。
2. 严格校验json_decode结果
调用property_exists前,先确认$data是对象,避免传入null或数组。
修改后的核心代码
function render($attributes){ $key= 0; $out =""; if (isset($attributes["key"])){ $key = $attributes["key"]; } $url = parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH); $catid = 0; if(isset($_GET['catid'])) { $catid = $_GET['catid']; } $api_url = "https://xeev.app/en/tmpl_api_v3?key=$key&catid=$catid"; // 使用CURL发起API请求 $ch = curl_init($api_url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); $j_data = curl_exec($ch); $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); // 检查请求是否成功 if ($j_data === false || $http_code !== 200) { error_log("XE Preview API请求失败:状态码{$http_code}"); return $out; } $data = json_decode($j_data); // 确保$data是对象且存在data属性 if (is_object($data) && property_exists($data,"data")){ ob_start(); include(XEP_PLUGIN_VIEWS_DIR."list.php"); $out = ob_get_contents(); ob_end_clean(); } return $out; }
额外排查建议
- 直接在浏览器中访问拼接好的
$api_url,查看返回的JSON格式是否正确,是否包含data字段。 - 开启WordPress调试模式(设置
WP_DEBUG=true),查看wp-content/debug.log获取更详细的错误信息。 - 确认主机防火墙、安全插件未阻止对外请求到
xeev.app。
内容的提问来源于stack exchange,提问作者Digital HOST Services
相关产品推荐
相关产品推荐

