使用 WordPress Rest API 发布文章时,首先我们需用通过 WordPress Rest API 进行用户认证,然后我们就可以通过 Rest API 发布文章了,如果我们发布的是默认的文章,很简单,相信有点 Rest API 开发经验的朋友都可以搞定,如果需要提交 WordPress 文章之外的其他字段,事情就变得复杂了起来,因为 WordPress Rest API 中,文章接口接受的数据有限,只有 wp_posts 数据表中默认的字段,如果我们需要提交自定义字段并且附加到当前提交的文章,就要多做一些工作了。
我们来看下面的表单,其中,“Title of your story” 和 “Submission” 分别是文章的标题和正文内容,其他的字段都是自定义字段。
前端提交的数据格式
我们使用的是 React 开发的上面的表单,如果使用 jQuery、PHP、Python 或者其他语言开发,处理过程是类似的。首先,我们需要获取需要发送到 Rest API 接口的数据,下面代码中的 “values” 就是我们准备要的数据,其中的 ‘title’ 和 ‘content’ 是默认的文章数据,而 ‘metadata’ 是我们添加的一个自定义字段对象数组。“submitPost” 是封装好的提交数据到 Rest API 的方法。
// 发布文章需要的数据
values.title = rawValues.title;
values.content = rawValues.content;
values.metadata = [
{'key' : 'name', 'value': rawValues.name},
{'key' : 'email', 'value': rawValues.email},
{'key' : 'topic', 'value': rawValues.topic},
{'key' : 'photo', 'value': rawValues.photo},
{'key' : 'agree', 'value': rawValues.agree}
];
const submission = this.props.submitPost(values, 'contribute');
发送数据的时候,表单中的 “metadata” 会附加到我们提交的数据中,和默认的 Post 数据一起提交到 WordPress Rest API 接口。
后端处理的方法
前端提交了数据过来后,默认的 Rest API 文章接口的后端并没有对这个附加的 “metadata” 数据进行处理。WordPress 为我们提供了钩子,让我们可以自己对这些附加数据进行处理。我们通过下面的代码来看一下怎么保存通过 Rest API 提交过来的附加数据到文章的自定义字段。
add_action( 'rest_api_init', function() {
// 下面一行的 ‘post’ 文章类型,也可以是其他自定义文章类型;‘metadata’ 就是我们前端提交过来的 metadata 数组
register_rest_field( 'post', 'metadata', array(
// 显示数据时候的回调,我们可以在这个函数里面,把自定义字段数据附加到 Rest API 文章接口返回的 Json 数据里
'get_callback' => function( $object ) {
return get_post_meta($object->ID);
},
// 保存数据的回调,我们就是在这里获取前端提交过来的附加数据,然后逐个保存到自定义字段中的
'update_callback' => function( $meta, $post ) {
$postId = $post->ID;
foreach ($meta as $data) {
update_post_meta($postId, $data['key'], $data['value']);
}
return true;
},
));
});
通过上面的代码,我们就可以通过 WordPress Rest API 获取和保存文章类型的自定义字段了,有了这个功能,WordPress 的灵活性才能发挥出来。需要提醒的是,上面的代码并不会在 WordPress 文章编辑界面创建自定义字段 UI 表单,如果需要,我们可以通过 Metabox API 或者一些插件另外创建。