WordPress Rest API删除帖子时,添加自定义过滤器rest_{$this->post_type}_deletable

WordPress Rest API创建/修改/查询帖子(posts),均有过滤器,唯独没有删除操作的过滤器。

添加自定义过滤器很简单,拓展删除方法delete_item

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

public function delete_item( $request ) {
// ...

$prepared_check_delete = apply_filters( "rest_{$this->post_type}_deletable", $post, $request );

if ( is_wp_error( $prepared_check_delete ) ) {
	return $prepared_check_delete;
}

// ...
}

WordPress中post(文章)、page(页面)和attachment(附件)是一类对象,存取操作大同小异。如此,这里会产生三个过滤器:

  1. rest_post_deletable
  2. rest_page_deletable
  3. rest_attachment_deletable

系统自带的其他六组过滤器:WordPress Rest API操作文章/媒体库的过滤器列表,灵活控制用户权限

实际使用:

add_filter( 'rest_post_deletable', 'custom_rest_post_deletable', 10, 2);

function custom_rest_post_deletable( $post, $request ) {
  // 自定义判断条件 $flag 
  $flag = true;

  if ($flag) return $post;

	return new WP_Error(
		'rest_cannot_delete',
		__( 'Sorry, you are not allowed to delete this post.' ),
		array( 'status' => rest_authorization_required_code() )
	);
}

切记:此方法需要修改内核文件,一定要谨慎选择。不到万不得已的情况下,一般不要修改内核。

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