LoginSignup
7
6

More than 5 years have passed since last update.

WordPressプラグイン作成、ユーザーと権限と愉快ななk・・・ メモ。

Posted at

WordPressのユーザー、ロール、権限等

コードは面倒なのでfunctions.phpに記述してます。

ログイン中のユーザー情報を得る

// ログインユーザー
add_action('admin_notices', function(){

    $user = wp_get_current_user();

    echo '<div class="updated">';
    echo "ID : {$user->ID}";
    echo "ユーザー名:{$user->user_login}($user->display_name}<br />";
    echo "ニックネーム:{$user->nickname}<br />";
    echo "プロフィール情報:{$user->description}";
    echo '</div>';

});

wordpress-user.png

wp_get_current_user()でWP_Userを取得します。
*WordPressの管理画面からユーザー情報の変更を行えます。

ユーザー一覧を取得する。

add_action('admin_notices', function(){

    $users = get_users();

    foreach( $users as $user )
    {
        $id = $user->ID;
        $name = $user->user_login;
        $display = $user->display_name;

        echo "<h2>{$id} ... ユーザー名:{$name}({$display})</h2>";

    }

});

wordpress_admin-user-list.png

get_users()でWP_User一覧を取得できます。
ユーザーは管理画面から追加・削除等行えます。

並び替えたいなどをいじくれます。

add_action('admin_notices', function(){

    $users = get_users('orderby=id&oder=ASC');

    foreach( $users as $user )
    {
        $id = $user->ID;
        $name = $user->user_login;
        $display = $user->display_name;

        echo "<h2>{$id} ... ユーザー名:{$name}({$display})</h2>";

    }

});

wordpress-admin-user-list-sort.png

この辺はググってください。

権限とか、権限グループ(ロール)とかって何?

WordPressの権限についてはまず下記のサイトを一通り読んでください。

ワードプレスは複数のユーザーを持つように設計されていて、管理画面のユーザー一覧からユーザーを追加・削除・編集が行えます。
そしてユーザーの編集画面でユーザー名やニックネームなど変更出来ます。

その変更の項目の中に、権限グループという項目があります。

wordpress-admin-user-setting.png

display role
管理者 administrator
編集者 editor
投稿者 author
寄稿者 contributor
購読者 subscriber

ユーザー一覧からみると、権限ブループの項目に乗ってます。

データベース上は、管理者であれば、「administrator」が、購読者はれば「subscriber」といった具合に保存されます。

そして権限グループ(ロール)ごとに権限が付与されてます。
たとえは、「admin_options」であれば管理者以上のロールにしか付与されていません。
readだと全てのロールに付与されています。

ちょっとわかりにくいですよね、実際にコードで例を見てみます。

権限グループと権限一覧

add_action('admin_notices', function(){
    $roles = wp_roles(); // WP_Rolesのインスタンス、$wp_rolesからも取得可

    $names = wp_roles()->role_names; // 名前のハッシュ
    $roles = wp_roles()->role_objects; //WP_Roleのハッシュ

    foreach($roles as $role)
    {
        echo '<div class="updated">';
        echo "ロール名:{$role->name}<br />";

        foreach( $role->capabilities as $cap => $grunt )
        {
            echo " * {$cap} : {$grunt}<br />";
        }

        echo '</div>';
    }

});

wordpress-caps.png

wp_roles()でロールのコレクションを取得出来ます。
ロールを表すクラスはWP_Roleですが、wp_roles()ではその配列を返すのではなく、WP_Rolesのインスタンスを返すことに注意してください。

WP_Roles#role_namesでロール名前のハッシュ
WP_Roles#role_objectsでロールインスタンスのハッシュ

WP_Role#nameでロール名
WP_Role#capabilitiesで権限のハッシュ

をそれぞれ取得出来ます。

コードが追えない方もおられるかもなので、とりあえずロールのみを取得します。

add_action('admin_notices', function(){
    $roles = wp_roles(); // WP_Rolesのインスタンス、$wp_rolesからも取得可

    $names = wp_roles()->role_names; // 名前のハッシュ
    $roles = wp_roles()->role_objects; //WP_Roleのハッシュ


    foreach($roles as $role)
    {
        echo '<div class="updated">';
        echo "ロール名:{$role->name}";
        echo '</div>';
    }

});

wordpress-roles.png

ここまでは、権限グループ(ロール)と権限についてです。

ログインユーザーのロールと権限の一覧

ユーザーにはそれぞれ権限グループ(ロール)が与えられています。
ここではログインユーザーに与えられたロールと、その権限を取得します。

権限グループ(ロール)はWP_Userのrolesで取得出来ます。
権限はWP_Userのallcapsで取得出来ます。

add_action('admin_notices', function(){

    $user = wp_get_current_user();
    $roles = implode( ',', $user->roles);
    $allcaps = $user->allcaps;

    echo '<div class="updated">';
    echo "ユーザー:{$user->user_login}<br />";
    echo "ロール:{$roles}<br />";

   foreach($allcaps as $cap => $grant)
   {
       echo " * {$cap} : {$grant}<br />";
   }

    echo '</div>';
});

wordpress-user-allcaps.png

WP_User#allcaps で権限一覧を連想配列で取得出来ます。
allcapsは名前の通り全ロール中の権限情報を持ってます。
キーが権限名になってる点に注意してください。

$user->roles でロールを取得出来ますが、複数形になっています。
ということは、ユーザーに対し複数のロールを指定できることを意味します。

例えば、複数のロールを持つユーザーであれば、それぞれのロールの権限をマージした権限をallcapsで取得出来ます。
この辺はまた後で説明します。

権限って何? どうやって使う?

身近なのは「admin_options」で、これは管理者以上でしか扱えません。
一体どういう使えばいいのかわかりづらいですが、次の例を見たら理解出来るはずです。

function sample1()
{
    if( current_user_can('admin_options') )
    {
        echo '<div class="updated">権限あり!</div>';
    }
    else
    {
        echo '<div class="error">出なおしてください!</div>';
    }
}

add_action('admin_notices', function(){
    sample1();
});

wordpress-has-cap-1.png

ダッシュボードにアクセスします。

current_user_can()は、現在のログインユーザーが引数(この例ではadmin_options)の権限を持っているかどうかをチェックします。

diconは管理者、tamagoは投稿者の権限グループを指定してます。
admin_optionsは管理者には付与されていますが、投稿者にはありません。
よって投稿者であるtamagoでは失敗します。

WP_Userのhas_cap()を直接呼び出すことも出来ます。

add_action('admin_notices', function(){

    $user = wp_get_current_user();

    if( $user->has_cap('read') )
    {
        echo '<div class="updated">権限あり!</div>';
    }
    else
    {
        echo '<div class="error">出なおしてください!</div>';
    }
});

今回の権限は「read」にしています。
readはデフォルトですべてのロールに付与されているので、dicon、tamago共に成功します。

権限のフィルター

add_filter('user_has_cap', function($allcaps, $caps, $args){
    $allcaps['admin_options'] = true; // みーんなadmin_options権限を持ってることにする!
    return $allcaps;
}, 10, 3);

add_action('admin_notices', function(){

    $user = wp_get_current_user();

    if( $user->has_cap('admin_options') )
    {
        echo '<div class="updated">権限あり!</div>';
    }
    else
    {
        echo '<div class="error">出なおしてください!</div>';
    }
});

ちょっと危険ですが、「user_has_cap」なんてのも有ります。
見つけたのでメモっておきますが実用性なさそう。
has_cap()が実行されるたびフィルタが処理されます。
本来「admin_options」権限を持っていないtamagoでもhas_cap()が成功してしまいます。

独自のロールや権限を追加する

まずは存続の権限グループ(ロール)に対して権限の追加です。

// 試しに購読者に「wwwwwwwwwwwww_dicon」権限を追加する。
// 購読者は認められるが、管理者ではエラーになる。
add_action('init', function(){
    wp_roles()->add_cap('subscriber', 'wwwwwwwwwwwww_dicon');
});

function sample2()
{
    if( current_user_can('wwwwwwwwwwwww_dicon') )
    {
        echo '<div class="updated">権限あり!</div>';
    }
    else
    {
        echo '<div class="error">出なおしてください!</div>';
    }
}

add_action('admin_notices', function(){
    sample2();
});

WP_Roles#add_cap()で権限を追加します。
今回は、購読者(subscriber)に「wwwwwwwwwwwww_dicon」権限を与えます。

管理者(administrator)には付与されていない権限なので、管理者すら失敗します。
別途ユーザーを作成し、管理者グループを「購読者」にしてからアクセスすると成功します。

コードは今回省略しますが、subscriberに権限が追加されていることが確認出来ます。

wordpress-add_cap.png

ちなみに、add_cap()は通常プラグインをインストールする際など一度だけ実行すればいいものなのですが、今回は面倒だったのでinitに記述してます。

二重に実行してもエラーにはなりませんが。

管理者グループ(ロール)の追加。

add_action('init', function(){
    wp_roles()->add_role(
        'invader',
        '侵入者',
        array(
            'read' => true,
            'chikuwa_love' => true,
            'oden_world' => true
        )
    );
});

WP_Roles#add_role()でロールを追加出来ます。
第一引数はロール名、第二引数は管理画面に表示されるディスプレイ名。
第三引数はデフォルトの権限をハッシュで。

別に「侵入者」に意味はありません。思いつきでつけたけど、よく考えるとおかしい・・・。

wordpress-role-invaderadd.png

wordpress-role-invader-display.png

ロールに侵入者(invader)が追加されています。
権限には、適当に「chikuwa_love」と「oden_world」を追加してます。
そして、「read」も追加してます。

readの権限を与えていないと、管理画面にアクセスすら出来なくなります。
管理画面開いても「このページにアクセスする権限がありません。」と出ます。

ログアウトできなくなったらまずいので(別のブラウザからアクセスするとか方法はある)、一応readは最低限つけてます。

適当にユーザーを作って、「侵入者」権限を与えてログインできます。
後はcurrent_user_can('chikuwa_love') とか試してみてください。

ユーザーに複数の管理者グループ(ロール)を与える

#chikuwaユーザーに権限「subscriber」を追加しようじゃないか!
add_action('init', function(){
    $chikuwa = get_user_by('login', 'chikuwa');
    $chikuwa->add_role('subscriber');
});

add_action('admin_notices', function(){

    $user = wp_get_current_user();
    $roles = implode( ',', $user->roles);
    $allcaps = $user->allcaps;

    echo '<div class="updated">';
    echo "ユーザー:{$user->user_login}<br />";
    echo "ロール:{$roles}<br />";

    foreach($allcaps as $cap => $grant)
    {
        echo " * {$cap} : {$grant}<br />";
    }

    echo '</div>';
});

wordpress-chikuwa-role.png

get_user_by()でchikuwaユーザー(予めinvaderロールで登録しておいた)を取得してます。
WP_User#add_role()でユーザーに対してロールを追加出来ます。

注目すべき点は、\$user->rolesが2つのロールを返している点と、
\$user->allcapsが2つのロールの権限を含んでいる点です。

wordpress-user-display.png

ユーザー一覧からも確認してみます。

どこに保存される?

wordpress-user-roles-db.png

wp_optionsのoption_name = wp_user_rolesにあるようです。

そして最後に、

今回なんでユーザー権限を調べたのかというと、管理画面にメニューを追加する際の権限がいまいちわからなかったからです。
add_menu_page()の第三引数、管理者専用なら「admin_options」を渡せばいいですが。
他の権限を渡して見ましょう。

add_action('admin_menu', function(){
    add_menu_page(
        'だいこんらん!',
        '大根乱設定',
        'oden_world',
        'diconran-config',
        function(){
            echo '<h2>大根乱の設定だどー</h2>';
        }
    );
});

第三引数に「oden_world」を指定してます。
これまでのサンプルで、oden_worldはinvaderロールに付与しています。
よってinvaderロールを与えられたchikuwaユーザーのみがこのメニューが表示され、アクセスすることが出来ます。

oden_world権限を持ってない管理者ではメニューが表示もされなければアクセスも出来ません。

あー、WordPress嫌いだー、面倒だー、疲れた。

次は管理画面のフォーム&Ajax周り行ってみよう・・・。

7
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
6