これは実際には難しくありません。新しい機能を追加するには、を呼び出しますWP_Roles->add_cap()
。これはデータベースに格納されるため、1回だけ実行する必要があります。したがって、プラグインのアクティベーションフックを使用します。
他の読者への注意:次のコードはすべてプラグインのテリトリーです。
register_activation_hook( __FILE__, 'epp_add_cap' );
/**
* Add new capability to "editor" role.
*
* @wp-hook "activate_" . __FILE__
* @return void
*/
function epp_add_cap()
{
global $wp_roles;
if ( ! isset( $wp_roles ) )
$wp_roles = new WP_Roles;
$wp_roles->add_cap( 'editor', 'edit_pending_posts' );
}
次に、すべての呼び出しをフィルタリングする必要があります…
current_user_can( $post_type_object->cap->edit_post, $post->ID );
...ユーザーが投稿を編集できるかどうかをWordPressが確認する方法です。内部的には、これはedit_others_posts
他の著者の投稿の機能にマップされます。
そのため、この機能を使用したい場合はuser_has_cap
、新しいedit_pending_posts
機能をフィルタリングして調べる必要がありedit_post
ます。
delete_post
これも一種の編集なので、私も含めました。
複雑に聞こえますが、それは本当に簡単です:
add_filter( 'user_has_cap', 'epp_filter_cap', 10, 3 );
/**
* Allow editing others pending posts only with "edit_pending_posts" capability.
* Administrators can still edit those posts.
*
* @wp-hook user_has_cap
* @param array $allcaps All the capabilities of the user
* @param array $caps [0] Required capability ('edit_others_posts')
* @param array $args [0] Requested capability
* [1] User ID
* [2] Post ID
* @return array
*/
function epp_filter_cap( $allcaps, $caps, $args )
{
// Not our capability
if ( ( 'edit_post' !== $args[0] && 'delete_post' !== $args[0] )
or empty ( $allcaps['edit_pending_posts'] )
)
return $allcaps;
$post = get_post( $args[2] );
// Let users edit their own posts
if ( (int) $args[1] === (int) $post->post_author
and in_array(
$post->post_status,
array ( 'draft', 'pending', 'auto-draft' )
)
)
{
$allcaps[ $caps[0] ] = TRUE;
}
elseif ( 'pending' !== $post->post_status )
{ // Not our post status
$allcaps[ $caps[0] ] = FALSE;
}
return $allcaps;
}
edit_posts
し、edit_others_posts
新しいと上edit_pending_posts
。edit_pending_posts
他の2 つなしで着てみたところ、投稿メニューが表示されませんでした。これをテストしたところ、新しい投稿を追加することはできましたが、下書きを保存できませんでした(You are not allowed to edit this post
通知)。この役割で自分の投稿を保存するためにテストしましたか?保留中の投稿の編集は問題ありません。