WordPress Rest API限制作者只能拉取自己的文章/媒体库列表
2022-05-20
WordPress Rest API拉取文章列表的接口是:
/wp-json/wp/v2/posts
参数author,指定一个或多个作者。
前端限制限制作者只能拉取自己的文章,请求接口时,单独发作者自身的ID就行了,例:
const userId = 12;
Request.get('/wp-json/wp/v2/posts', {
author: userId,
}).then((e) => {//
//
}).catch((e) => {
//
});
前端参数处理是可以被用户篡改的,必须后端进一步限制。
我们用过滤器rest_post_query能轻松完成,自定义逻辑修改过滤参数。
add_filter( 'rest_post_query', 'pury_custom_rest_post_query', 10, 2 );
/**
* 查询post - 参数处理
*/
function pury_custom_rest_post_query( $args, $request ) {
$user_id = get_current_user_id();
// 管理员不受限制
if (!current_user_can('manage_options')) {
$args['author'] = $user_id;
$args['author__in'] = array();
$args['author__not_in'] = array();
}
return $args;
}
说明:
- current_user_can(‘manage_options’)是针对管理员角色,一般不做限制。
- $args[‘author’] = $user_id; 是强制带上当前请求者的ID,避免前端不传任何作者信息而默认拉取全部文章。
需要特别注意的是author__in和author__not_in,笔者查看内核代码后发现,WordPress会预先把前端传过来的参数另存到$args[‘author__in’]和$args[‘author__not_in’],如此要想彻底控制参数中的作者列表信息,必须清空这两个数组。
拉取媒体库和文章的原理一样,同样方法实现媒体库专属过滤器即可:
add_filter( 'rest_attachment_query', 'pury_custom_rest_attachment_query', 10, 2 );
/**
* 查询attachment - 参数处理
*/
function pury_custom_rest_attachment_query( $args, $request ) {
$user_id = get_current_user_id();
if (!current_user_can('manage_options')) {
$args['author'] = $user_id;
$args['author__in'] = array();
$args['author__not_in'] = array();
}
return $args;
}
(版权归cpury.com所有,转载请注明出处。)