CRUD
- Create
- Read
- Upload
- Delete
JSON 文件查看工具
postman
URL 格式
https://域名地址/wp-json/wp/v2/文章类型名称
https://puji.design/wp-jason/wp/v2/post
定制数据
在 WordPress 默认的 JSON 文件中如果没有我们想要的数据,我们可以使用 rest_api_init 来自定义 JSON 文件中返回的数据
在 function.php 文件中修改,WordPress 会自动生成 JSON 对应的格式文件。
function customize_rest_api() {
register_rest_field('post', 'author_name', array(
'get_callback' => function() {return get_the_author();}
));
}
add_action('rest_api_init', 'customize_rest_api');
- register_rest_field 方法中包含了三个参数,第一个参数是文章类型,第二个参数是自定义的名称,第三个参数描述了我们希望如何处理这个字段,他为一个 array
自定义文章类型启用 JSON
WordPress 默认情况下不会对自定义文章类型生成相应的 JSON 数据,如需开启,在注册文章类型时将 show_in_rest 设置为 true 即可。
如注册了一个event的文章类型
https://域名地址/wp-json/wp/v2/event
自定义 JSON URL
原因:
- 自定义搜索逻辑
- 仅返回需要使用的 JSON 数据,优化读取速度
- 减少文件请求数量
function customize_rest_search() {
register_rest_route('puji/v1', 'search', array(
'methods' => WP_REST_SERVER::READABLE, // WP中的常量,类似 GET
'callback' => 'searchResults'
));
}
function searchResults($data) {
$allPosts = new WP_Query(array(
'post_type' => array('post', 'page', 'event'),
's' => sanitize_text_field($data['term'])
));
$searchResults = array(
'generalInfo' => array(),
'artists' => array(),
'events' => array()
);
while($allPosts->have_posts()) {
$allPosts->the_post();
if (get_post_type() == 'post' OR get_post_type() == 'page') {
array_push($searchResults['generalInfo'], array(
'title' => get_the_title(),
'link' => get_the_permalink(),
'post_type' => get_post_type()
));
}
if (get_post_type() == 'artist') {
array_push($searchResults['artists'], array(
'id' => get_the_id(),
'title' => get_the_title(),
'link' => get_the_permalink(),
'thumb' => get_the_post_thumbnail_url(0, 'medium')
));
}
if (get_post_type() == 'event') {
$eventDate = new DateTime(get_field('event_date')); // event_date是自定义字段
array_push($searchResults['events'], array(
'title' => get_the_title(),
'link' => get_the_permalink(),
'month' => $eventDate->format('M'),
'day' => $eventDate->format('d')
));
}
}
// 增强选项:根据自定义字段筛选关联文章类型,如event文章关联了artist文章类型
if ($searchResults['artists']) {
$artistMetaQuery = array('relation' => 'OR');
foreach($searchResults['artists'] as $item) {
array_push($artistMetaQuery, array(
'key' => 'related_artist',
'compare' => 'LIKE',
'value' => '"' . $item[id] . '"'
));
}
$artistRelationshipQuery = new WP_Query(array(
'post_type' => 'event',
'meta_query' => $artistMetaQuery
));
while($artistRelationshipQuery->have_posts()) {
$artistRelationshipQuery->the_post();
if (get_post_type() == 'event' {
array_push($searchResults[events], array(
'title' => get_the_title(),
'link' => get_the_permalink(),
'month' => $eventDate->format('M'),
'day' => $eventDate->format('d')
));
}
}
$searchResults['events'] = array_values(array_unique($searchResults['events'], SORT_REGULAR));
}
return $searchResults;
}
add_action('rest_api_init', 'customize_rest_search');
register_rest_route 方法中有三个参数
- 第一个参数为命名空间
- 第二个参数是路由名称
- 第三个参数为一个数组,数组中包含了两个关联数据,第一个数据为需要提供的操作,可参考 CRUD,第二个返回数据
请求类型
GET
WP_REST_SERVER::READABLE