web-dev-qa-db-ja.com

機能に基づいてルールのリストをフィルタリングする

私は役割のリストを取得し、特定の機能(カスタム)でそれらをフィルタリングしようとしています。私は この投稿 に出くわしました、しかし、私は彼らが能力があるかどうかによって役割をフィルターにかけたいです、例えば、edit_post

- ザック

1
Zack

テストされていませんが、簡単に拡張可能であるべきです(またはあなたがアイデアを取ることができるもの)。

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;
}
  • 最初の引数は、特定の上限があるかどうかを調べるために、単一のロール名(文字列)またはロールの配列のいずれかを取ります。
  • 2番目の引数は、(string)をチェックするための特異な機能を取ります。

使用例:

$role_can_edit_pages = roles_have_cap( 'administrator', 'edit_pages' ); 
// Result
// array( 0 => administrator )

関数がfalseを返した場合、あなたは役割が上限を持っていないことを知っているでしょう、すなわち..

if( !$role_can_edit_pages )
// Role cannot not edit pages

そうでなければ、結果は上限を持つ役割の配列になります(単一の役割で渡された場合でも複数の役割で渡された場合でも)。

あなたはそれを切り詰めてそれが望ましいなら単に戻り値を持つことができますが、あなたは上限を持つ役割のリストが欲しいと言ったので、私は当然配列が論理的な選択になると思いました..

配列を文字列に変換することはかなり簡単です、そしてあなたはあなた自身の区切り文字を使うことさえできます、単にimplode()を呼び出すことができます。

echo implode( ' | ', $role_can_edit_pages ); // | (pipe is the example seperator here)

関数を呼び出すときに分割を行わなくても済むように関数に分割を移動することもできます。注意してください。

私はそれがとにかく役立つことを願っています... :)

編集:最初の引数($ roles)がfalseに設定されている場合、関数はすべてのロールを見るようになりました。

3
t31os