使用REST API更新CPT元数据

时间:2017-05-11 作者:Chet at C2IT

我正在尝试使用RESTAPI更新CPT帖子的元数据。我可以使用如下帖子更新数字元数据元素:

实例com/wp-json/wp/v2/posts/73/meta/229?值=2

此方法基于以下解决方法:WP REST API "rest_no_route" when trying to update meta

我还可以使用这里的帖子更新元数据:示例。com/wp-json/wp/v2/posts/73/meta/229

正文中包含此JSON:

{"value":"2"}
但是,我需要更新的字段包含一个序列化的数据数组。当我尝试使用第二个方法(JSON body)更新字段时,出现以下错误:

{"value": [
{
  "name": "Related Documents",
  "default": true,
  "documents": [
    {
      "label": "RFA - Revit File",
      "file_location": "http://example.com/wp-content/uploads/2017/03/file.pdf"
    }
  ]
}
]
}
我还尝试以序列化数组的形式发送数据(这就是它存储在MySql中的方式)。

发送时:

{"value": "{a:0}"}
我得到:

{
"code": "rest_post_invalid_action",
"message": "Invalid existing meta data for action.",
"data": {
"status": 400
}
}
注意:此元数据是WooCommerce插件的一部分:https://woocommerce.com/products/product-documents/

我安装了这个插件以向API公开我的自定义帖子类型(并且我能够检索数据):wordpress.org/plugins/wp-rest-api-controller/

我还安装了此插件以允许访问元端点:wordpress.org/plugins/rest-api-meta-endpoints/

我在这里的最终目标是将新数据填充到此自定义字段的MySql数据库中。我了解到,WP REST API仍然没有文档化,在元数据方面相当薄弱,尤其是(1)对于自定义post类型,以及(2)对于非字符串/数字数据类型。

我正在考虑编写一个基本的PHP页面,该页面将采用产品ID,使用WordPress函数找到正确的元记录,并通过将发布的JSON转换为序列化数组来更新数据,但我对PHP还不够熟悉,因此我还必须考虑一些安全问题。但是,有没有关于如何开始这项工作的示例或想法,或者有没有更好的方法来更新我的元数据?

1 个回复
SO网友:hwl

关于最初的问题,您是否确定插件正在注册api可用的字段?这个register_meta 需求show_in_rest => true 已分配。

此外,CPT需要custom-fields 在其支架阵列中,\'supports\' => array(\'title\',\'editor\',\'thumbnail\',\'custom-fields\') 使其在访问CPTs api端点时可用。

我在回答另一个问题时谈到了这一点(包括链接等):https://wordpress.stackexchange.com/a/266277/118366

如果缺少这些值中的任何一个,您可以挂接以添加它们,甚至完全覆盖这些函数。只是一个想法。

我正在考虑编写一个基本的PHP页面,该页面将采用产品ID,使用WordPress函数找到正确的元记录,并通过将发布的JSON转换为序列化数组来更新数据,但我对PHP还不够熟悉,无法做到这一点

为此,请查看json\\U解码和json\\U编码。您可以使用json\\u decode将assoc参数设置为true,并获取数组而不是对象。

一个(未测试的)快速示例函数,用于检索一些json并将解码结果设置为变量:

$json = file_get_contents(\'PATH/TO/FILE.json\');
function the_json_contents($json_to_get){

            $json_in_array = json_decode($json_to_get, true); //json string to array

            return $json_in_array;
        }
function do_stuff_do_json() {
    $json_array = the_json_contents($json);
    foreach($json_array[\'id\'] as $js) { //assuming we have an \'id\' key
        $somevariable  = $js[\'someKey\'];
        $somevariable2 = $js[\'someOtherKey\'];
    } 

}
但是,有没有关于如何开始这项工作的示例或想法,或者有没有更好的方法来更新我的元数据?

自定义路由和端点可能是实现这一点的最有效方法(假设不仅仅是插件没有向api公开这些项,如顶部所述)。您仍然需要考虑nonce检查和其他可能的身份验证,这取决于您使用端点的方式。Routes and EndpointsCustom Endpoints 是您在api文档中查找的内容;可能Controller Classes, 也

同样,我会检查插件,看看它是否为最初提到的api注册了元字段。

结束

相关推荐

列出分类法:如果分类法没有POST,就不要列出分类法--取决于定制的POST-META?

这可能很难解释,我不知道是否有解决办法!?我有一个名为“wr\\u event”的自定义帖子类型和一个名为“event\\u type”的分层自定义分类法。自定义帖子类型有一个元框,用于event_date 并且与此帖子类型关联的所有帖子都按以下方式排序event_date. 我在循环中有一个特殊的条件来查询event_date 已经发生了-在这种情况下,它没有显示,但只列在我的档案中。就像你可以使用wp_list_categories() 我编写了一个自定义函数,它以完全相同的方式列出所有分类术语。现在