流畅地将能力分配给WordPress中的角色。

v2.0.1 2023-02-06 22:16 UTC

This package is auto-updated.

Last update: 2024-09-13 22:38:35 UTC


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',
        ]
    ]
);

关于

许可

GPL-2.0-or-later

维护者

Alley Interactive