在wordpress使用了微慕小程序,网站中必须要安装rest-api-to-miniprogram插件,可惜安装之后,修改网站的页面出现了wp-content/plugins/rest-api-to-miniprogram/includes/filter/ram-custom-post-fields.php on line 16 错误

一、发生问题的原因

这个错误 Fatal error: Uncaught Error: Cannot use object of type WP_REST_Response as array 发生在 ram-custom-post-fields.php 文件的第 16 行。

在 WordPress 的 REST API 中,过滤器 rest_prepare_post(该函数 custom_post_fields 很可能挂载于此)传递给回调函数的第一个参数 $_data 的类型在不同版本的 WordPress 或不同上下文中可能发生变化。

代码在第 16 行尝试像访问数组一样访问它:$content=$_data['content']['rendered'];

因为 $_data 是对象,不能使用 ['key'] 语法,所以报错 "Cannot use object ... as array"。

二、原因分析

WordPress 核心更新导致 rest_prepare_* 过滤器传递的参数类型更加严格地定义为 WP_REST_Response 对象,而旧版插件代码没有适配造成的。

三、解决办法

需要修改custom_post_fields函数,正确处理WP_REST_Response对象

你可以打开ram-custom-post-fields.php文件,在 custom_post_fields函数内:

(1)在函数开头(global $wpdb; 之前)插入:

if ($_data instanceof WP_REST_Response) {
    $data_array = $_data->get_data();
    $is_response_object = true;
} else {
    $data_array = $_data;
    $is_response_object = false;
}

(2)使用文本编辑器的“查找替换”功能,将函数内部所有的 $_data[ 替换为 $data_array[

注意:不要替换函数参数定义里的 $_data,也不要替换最后返回逻辑里的 $_data

(3)删除或注释掉文件末尾的 $data->data = $_data; 和 return $data;大概在文件的250行左右。

删除或注释掉文件末尾的 $data->data = $_data; 和 return $data
删除或注释掉文件末尾的 $data->data = $_data; 和 return $data

后面添加如下代码

if ($is_response_object) {
    $_data->set_data($data_array);
    return $_data;
} else {
    return $data_array;
}

修复后的页面,请下载

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注