alleyinteractive / wp-caper
流畅地将能力分配给WordPress中的角色。
Requires
- php: ^8.0
- alleyinteractive/composer-wordpress-autoloader: ^1.0.0
Requires (Dev)
README
Caper
为将文章类型、分类或通用原始能力分配给WordPress中的角色提供了一个流畅的接口。
安装
使用以下命令安装最新版本:
$ composer require alleyinteractive/wp-caper
基本用法
Caper
的调用形式为 "<grant to|deny to>
<these roles>
<these capabilities>
."
Caper
可以直接分配原始能力
<?php use Alley\WP\Caper; Caper::grant_to( 'editor' )->primitives( 'edit_theme_options' ); Caper::deny_to( 'administrator' )->primitives( 'manage_options' );
Caper
还可以分配与文章类型或分类相关联的原始能力。例如
<?php use Alley\WP\Caper; Caper::grant_to( 'author' )->caps_for( 'page' ); Caper::deny_to( 'editor' )->caps_for( 'category' );
这授予具有 author
角色的用户对 page
文章类型的所有能力,并拒绝具有 editor
角色的用户对 category
分类的能力。 (务必阅读确保唯一文章类型和分类能力类型 部分,以避免意外修改其他对象类型的能力。)
在授予文章类型或分类的能力时,可以拒绝这些能力的子集,反之亦然。例如
<?php use Alley\WP\Caper; Caper::grant_to( 'author' ) ->caps_for( 'page' ) ->except( 'delete_posts' ); // Pass "generic" keys; the actual capability names will be determined automatically. Caper::deny_to( 'editor' ) ->caps_for( 'category' ) ->except( 'assign_terms' ); // Pass "generic" keys; the actual capability names will be determined automatically.
这授予具有 author
角色的用户对 page
文章类型的所有能力,除了与 delete_posts
对应的 page
能力外,并拒绝具有 editor
角色的用户对 category
分类的能力,除了与 assign_terms
对应的 category
能力外。
或者,可以授予或拒绝一组独特的文章类型或分类能力
<?php use Alley\WP\Caper; Caper::deny_to( 'editor' ) ->caps_for( 'category' ) ->only( 'delete_terms' ); Caper::grant_to( 'author' ) ->only( 'create_posts' ) // `only()` and `except()` can occur in either order. ->caps_for( 'page' );
这拒绝 author
用户对 page
文章类型的所有能力,除了与 delete_posts
对应的能力外,并授予 editor
用户对所有 category
分类的能力,除了与 assign_terms
对应的能力外。
可以将多个文章类型或分类传递给 caps_for()
。将为所有传递的对象类型授予或拒绝相同的能力,包括异常或独家能力
<?php use Alley\WP\Caper; Caper::grant_to( 'author' ) ->caps_for( [ 'post', 'page' ] ); Caper::grant_to( 'contributor' ) ->caps_for( [ 'post', 'category' ] ); Caper::deny_to( 'editor' ) ->caps_for( [ 'post', 'page' ] ) ->except( 'edit_posts' ); Caper::deny_to( 'administrator' ) ->caps_for( [ 'page', 'category' ] ) ->only( [ 'edit_posts', 'edit_published_posts', 'manage_terms' ] );
也可以一次性将能力授予或拒绝给所有角色
<?php use Alley\WP\Caper; Caper::grant_to_all()->primitives( 'moderate_comments' ); Caper::deny_to_all()->primitives( 'activate_plugins' );
grant_to_all()
和 deny_to_all()
方法可以与 then_grant_to()
和 then_deny_to()
方法结合使用,在系统性地重新分配之前“重置”角色间的权限。例如
<?php use Alley\WP\Caper; Caper::grant_to_all() ->caps_for( 'post' ) ->then_deny_to( [ 'subscriber', 'contributor' ] ); Caper::deny_to_all() ->caps_for( 'category' ) ->then_grant_to( 'administrator' );
内部,then_grant_to()
和 then_deny_to()
方法创建新的 Caper
实例,这些实例结合了新提供的角色和先前提供的原始或对象类型。
因为每个 Caper
实例都通过向 user_has_cap
添加过滤器来修改用户权限,所以第二个创建的实例将在第一个实例之后应用其权限分配。
可以使用 at_priority
方法修改任何 Caper
实例的 user_has_cap
过滤器的优先级
<?php use Alley\WP\Caper; Caper::grant_to( 'editor' )->primitives( 'manage_options' )->at_priority( 99 );
确保唯一能力类型
Caper
不会尝试确定它分配的文章类型或分类能力是否是特定对象类型的唯一能力。
例如
<?php use Alley\WP\Caper; \register_post_type( 'review', [ // ... 'capability_type' => 'post', ] ); Caper::deny_to( 'editor' )->caps_for( 'review' );
也会拒绝编辑者对 post
文章类型的能力。建议使用具有不同 capability_type
参数注册文章类型和具有 capability
参数数组的分类
<?php \register_post_type( 'review', [ // ... 'capability_type' => 'review', ] ); \register_taxonomy( 'rating', 'review', [ // ... 'capabilities' => [ 'manage_terms' => 'manage_ratings', 'edit_terms' => 'edit_ratings', 'delete_terms' => 'delete_ratings', 'assign_terms' => 'assign_ratings', ] ] );