未经测试,但应易于扩展(或您可以从中获取想法)。
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,函数现在将查看所有角色。