web-dev-qa-db-ja.com

カスタムユーザロールを追加する前後にカスタムユーザ機能を追加する

カスタムユーザーロールを追加する前にカスタムユーザー機能を追加する必要がありますか。

  • add_role() は、関数の3番目のパラメータに$capabilitiesの配列を要求します。
  • add_cap() は、関数の最初のパラメータで機能を適用するための$roleを要求します。

add_role()add_cap() の両方がプラグインの起動時またはテーマの起動時に起動される必要があります。

私は考えていました、 add_cap() を使ってカスタムユーザケーパビリティを作成し、ケーパビリティのリストをクラスプロパティ配列に格納します。次に、 add_role() を使用して各カスタムユーザーロールを作成し、新しく作成した機能をクラスプロパティ配列から各 add_role() 関数の$capabilitiesパラメータに追加します。

OR

add_role() を使用して各カスタムユーザーロールを追加し、ロールに追加する各機能のクラスプロパティ配列を設定します。次に、各カスタムユーザーロールの機能ごとに、 add_cap() を使用して機能を追加します。

add_role()add_cap() の両方を調和させて実行する順序は私を困惑させます。この特定の状況についての洞察は大歓迎です。

それとも add_cap() さえ使ってはいけませんか?各ユーザーの役割に対応する一連の機能を設定し、それらを add_role() 関数の$capabilitiesパラメータに渡すだけでいいですか?

6
Michael Ecklund

add_role()が3番目のパラメータとして$capabilitiesを持つのには理由があります。

あなたがこの関数を使うとき、まず何が起こるのかについてのいくつかの洞察。

  1. WP_Roles->add_role() - クラスメソッドを呼び出します
  2. その後、メソッドはロールがすでに存在するかどうかを確認します。もしそうなら、それは中止します。
  3. 次のステップは、WP_Roles->roles[](2)でdisplay_name配列にロールを追加することです。nd arg)を$wpdb->prefix . 'user_roles'オプションテーブルエントリ(配列)に追加します。

結論

そのため、ロールを作成するときに機能を正しく追加しないと、空の機能を持つロールを保存できます。

コーデックスについてのメモ

コーデックスを決して信頼しないでください。単にadd_cap()と呼ばれる関数はありません。 WP_RolesWP_RoleWP_Userの中には、このような名前のクラスメソッドしかありません。 (しばらく時間があれば、Codexエントリを更新します。)

5
kaiser

同じ質問をしたことがあるか、少なくとも同じ質問について考えたことがある人のために...これが私が状況に近づいた方法です。

このシナリオでは、既存のユーザーベースを更新する必要があります。このコミュニティWebサイトには、すでに何百ものユーザーが積極的に参加しています。

私達はウェブサイトのランキングシステムを変えていました。 (ランクはカスタムユーザーロールでした。)コミュニティにもっと参加することで、より高いランクを達成できます。そのため、ユーザーが目標を達成すると、コミュニティWebサイトへのアクセスが増え、新しいカスタムユーザーロールに昇格します。

既にカスタムユーザーロールがあり、コミュニティの各ユーザーに割り当てられていました。カスタムユーザーロールの名前を変更し、さらにいくつか追加し、これらのランクに新しい権限を割り当てたい(WordPressの用語では、各カスタムユーザーロールに新しい機能を追加します)。


ステップ1 - ユーザーメタを更新する

すべてのユーザーを取得し、現在のカスタムユーザーロールを決定し、新しいロールを追加し、その他の既存のロールを削除します。 (既存のユーザーロールのいくつかを安全にリストしました。これらのロールが現状のまま維持され、変更または削除されないようにしたいからです。)

注: このステップでは、実際にはカスタムユーザーロールは追加されません。それは基本的にWordPressがどの役割を持っているのか、そしてどの登録済みの役割が後でアクセス権や機能をチェックすべきなのかを知るために各ユーザーのユーザーメタを更新するだけです。

private function update_user_roles(){
    global $wp_roles;   

    /* Don't update users with these roles. */
    $safelisted_roles = array(
        'administrator',
        'editor',
        'author',
        'contributor',
        'subscriber', 
        'bbp_moderator',
        'bbp_participant'
    );

    /* Convert existing user's role to the newly added roles. */
    $users = get_users();
    for($i = 0; $i < count($users); $i++){
        $user = new WP_User($users[$i]->ID);
        /* Skip user, if user has no roles. */
        if(is_array($user->roles) && empty($user->roles) || !is_array($user->roles)){
            continue;
        }
        foreach($user->roles as $role){
            if($role == 'rank_name'){// Existing user role
                $user->add_role('new_rank_name');// New user role
            } else{
                /* Set remaining users as Subscribers, ignoring safe-listed user roles. */
                if(!in_array($role, $safelisted_roles)){
                    $user->add_role('subscriber');// Reset everyone to default role.
                }
            }
            /* Remove the old junky roles from the user, ignoring safe-listed user roles. */
            if(!in_array($role, $safelisted_roles)){
                $user->remove_role($role);
            }
        }
    }
}

要約すると、基本的にすべてのユーザーを調べ、現在のユーザーロールが何であるかを確認し、それらに新しいロールを割り当てるかどうかを決定しました。ユーザーの役割がセーフリストに含まれていた場合、それらの役割は同じままです。


ステップ2 - 新しいユーザーの役割と機能を定義する

コードをきれいに整理して整理するために、新しいユーザーの役割と機能を準備するための別の方法を作成してください。これにより、各カスタムユーザーロールの機能をより適切に管理でき、すべてを簡単に追加でき、手間が省けます。

次のステップで使用するために、このメソッドのデータを配列形式でクラスプロパティ($this->user_capabilities)に格納しました。

/* Prepare specific permissions for each new user role. */
public function set_user_capabilities(){
    $this->user_capabilities[] = array(
        'role_key' => 'new_rank_one',// Registered role name
        'role_value' => 'Rank One',// Role display name
        'capabilities' => array(// Permissions
            'new_capability_one' => true,
            'new_capability_two' => false,
            'new_capability_three' => false
        )
    );
    $this->user_capabilities[] = array(
        'role_key' => 'new_rank_two',
        'role_value' => 'Rank Two',
        'capabilities' => array(
            'new_capability_one' => true,
            'new_capability_two' => true,
            'new_capability_three' => false
        )
    );
    $this->user_capabilities[] = array(
        'role_key' => 'new_rank_three',
        'role_value' => 'Rank Three',
        'capabilities' => array(
            'new_capability_one' => true,
            'new_capability_two' => true,
            'new_capability_three' => true
        )
    );
}

要約すると、クラスプロパティ$this->user_capabilitiesのキーは、追加するカスタムユーザーロールを配置する場所です。配列内には、ロールが持つことになる各機能が含まれています。これらの機能により、サイトへのアクセスが増えます。

Notice: 3つの新しいユーザーロールすべてが同じ機能を共有する方法最初のユーザーロールは最初の機能に対する権限のみを継承し、2番目のユーザーロールは上位2つの機能であるため最初の2つの機能に対する権限を継承し、3番目のユーザーロールは上位3つの機能であるためそして最も多くの権限を持っています。


ステップ3 - 共有アクセス許可の定義とユーザーロールの作成

すべての登録ユーザーが共有するために必要な一般的な機能をいくつか設定する必要がありました。そのため、新しいカスタムユーザーロールを追加する直前に、一連の共有機能を作成し、それらをクラスプロパティ($this->user_capabilities)に格納されている手順2で作成した各特定のユーザーロールの機能とマージしました。繰り返しになりますが、安全なユーザーリストを尊重する必要があります。

/* Add custom user roles for registered members. */
public function set_user_roles(){
    global $wp_roles;

    /* Global capabilities for all registered users. */
    $user_capabilities = array(
        'bp_groups' => true,
        'bp_groups_create' => true,
        'bp_groups_join' => true,
        'bp_groups_directory' => true,
        'bp_groups_search' => true
    );

    /* Don't update users with these roles. */
    $safelisted_roles = array(
        'administrator',
        'editor',
        'author',
        'contributor',
        'subscriber', 
        'bbp_moderator',
        'bbp_participant'
    );

    /* Remove old junky user roles. */
    foreach($wp_roles->get_names() as $role_name => $display_name){
        if(!in_array($role_name, $safelisted_roles)){
            $wp_roles->remove_role($role_name);
        }
    }

    /* Add new custom user roles. */
    for($i = 0; $i < count($this->user_capabilities); $i++){
        $role = $this->user_capabilities[$i];
        $capabilities = array_merge($user_capabilities, $role['capabilities']);
        $wp_roles->add_role($role['role_key'], $role['role_value'], $capabilities);
    }

}

最終的な要約...我々は、彼らがどんなランクであるかにかかわらず、すべての登録されたユーザが共有する必要があるであろう能力パーミッションのリストをセットアップしました。その後、WordPressに登録されているすべての登録済みカスタムユーザーロールを削除しました(変更されないように安全リストに記載されていない限り)。その後、新しいカスタムユーザーロールをそれぞれ作成し、新しいユーザーロールごとにすべての機能を割り当てました。ステップ1からユーザーのメタに設定したロールは、WordPressで有効になります。


結論

これは私のために働いたものです。追加しようとしている役割で、ユーザーのすべてのメタデータを更新します。次に、新しく作成したカスタムユーザーロールを実際にWordPressに登録します。

2
Michael Ecklund