WordPress Rest API操作文章/媒体库的过滤器列表,灵活控制用户权限

WordPress Rest API操作文章/媒体库,系统自带六组过滤器,内核文件位置:

/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php

// 当通过REST API查询帖子时,过滤WP Query参数。
`rest_post_query`
`rest_page_query`
`rest_attachment_query`	

// 在通过REST API创建或更新单个帖子后触发。
`rest_insert_post`
`rest_insert_page`
`rest_insert_attachment`	

// 在通过REST API完全创建或更新单个帖子后触发。
`rest_after_insert_post`
`rest_after_insert_page`
`rest_after_insert_attachment`

// 过滤一个帖子是否可丢弃。
`rest_post_trashable`
`rest_page_trashable`
`rest_attachment_trashable`

// 在通过REST API插入帖子之前对其进行筛选。
`rest_pre_insert_post`
`rest_pre_insert_page`
`rest_pre_insert_attachment`

// 为REST API响应过滤发布数据。
`rest_prepare_post`
`rest_prepare_page`
`rest_prepare_attachment`

过滤器的作用非常大,举个简单例子,给查询API添加额外参数,如用户id:

add_filter( 'rest_post_query', 'custom_rest_post_query', 10, 2 );

function custom_rest_post_query( $args, $request ) {
	  $user_id = get_current_user_id();
	  $args['author'] = $user_id;    
	  return $args;
}

笔者的主要应用场景是,除了WordPress自带的用户权限系统,拓展了新的用户管理概念,类似用户分组。在处理业务逻辑时,使用过滤器加入自定义门槛,进一步控制用户权限。

add_filter( 'rest_pre_insert_post', 'custom_rest_pre_insert_post', 10, 2 );

function custom_rest_pre_insert_post( $prepared_post, $request ) {
	$user_id = get_current_user_id();
   
  // 自定义逻辑 begin
  $flag = $user_id >= 1000;
  // 自定义逻辑 end

  if (flag) return $prepared_post;
	return  new WP_Error(
				'rest_cannot_edit',
				__( 'Sorry, you are not allowed to edit this post.' ),
				array( 'status' => rest_authorization_required_code() )
			);
}

(版权归cpury.com所有,转载请注明出处。)