根据功能过滤规则列表

时间:2011-02-15 作者:Zack

我正在尝试获取角色列表,并根据特定功能(自定义)对其进行筛选。我遇到过this post, 但我想通过他们是否能够,edit_post.

-扎克

1 个回复
最合适的回答,由SO网友:t31os 整理而成

未经测试,但应易于扩展(或您可以从中获取想法)。

function roles_have_cap( $roles = false, $cap ) {
    global $wp_roles;

    if( !isset( $wp_roles ) || !isset( $cap ) )
        return false;

    if( !$roles )
        $roles = array_keys( $wp_roles->roles );

    if( !is_array( $roles ) )
        $roles = array( $roles );

    $hascap = array();
    foreach( $roles as $role ) {
        if( !isset( $wp_roles->roles[$role][\'capabilities\'][$cap] ) || ( 1 != $wp_roles->roles[$role][\'capabilities\'][$cap] ) )
            continue;

        $hascap[] = $role;
    }

    if( empty( $hascap ) )
        return false;

    return $hascap;
}
第一个参数要么采用单数角色名称(字符串),要么采用要检查是否具有特定cap的角色数组

Example usage:

$role_can_edit_pages = roles_have_cap( \'administrator\', \'edit_pages\' ); 
// Result
// array( 0 => administrator )
如果函数返回false,您就会知道角色没有cap,即。。

if( !$role_can_edit_pages )
// Role cannot not edit pages
否则,结果是一个具有cap的角色数组(无论您传入的是单个角色还是多个角色)。

如果愿意的话,可以删减它并只返回一个值,但您提到需要一个有上限的角色列表,所以我自然认为数组是一个合乎逻辑的选择。。

将数组转换为字符串相当容易,您甚至可以使用自己的分隔符,只需调用implode(), 就像这样。。。(使用前面的示例变量)。。

echo implode( \' | \', $role_can_edit_pages ); // | (pipe is the example seperator here)
您还可以将内插移动到函数中,以避免在调用函数时必须进行内插,请注意,内插将在单个项数组上正确工作(即,您将得到一个没有分隔符的字符串)。

我希望这对任何情况都有帮助……:)

EDIT:如果第一个参数($roles)设置为false,函数现在将查看所有角色。

结束

相关推荐