WordPress Rest API限制作者只能拉取自己的文章/媒体库列表

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__inauthor__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所有,转载请注明出处。)