web-dev-qa-db-ja.com

ロールに特定の機能があるかどうかを確認する方法

プラグインでは、私はいくつかの機能と一緒に専用のユーザーロールを作成します。これらの機能は、editoradminなどの他の役割にも割り当てる必要があります。

ロールと機能の追加にはデータベースの書き込みが含まれるため、これらの操作は一般的に「高価」と見なされ、プラグインアクティベーションフックでのみ実行することをお勧めします。私の場合、プラグインを mu-plugin としてロードする必要があるので、アクティベーションフックはありません。したがって、それらを追加しようとする前に、管理者と編集者の役割にすでに私のカスタム機能があるかどうかを確認したいと思います。

特定の役割に特定の機能があるかどうかを確認するにはどうすればよいですか。 または、あるいは:チェックを行うことはさらに「高価」ではないか?それとも私は事前のチェックなしでinitフックからadd_cap()への呼び出しをするべきですか?

2
jsphpl

更新:

うわー、私はそのようなバフーンのように感じます...笑。 WP_Role::has_cap

私は私の目を十分に難しい(役割)ことはできません。

$caps  = array( 'cap_1', 'cap_2', 'cap_3' );
$roles = array( 'administrator', 'editor' );

foreach( $roles as $role ){
    if( $role_object = get_role( $role ){
        foreach( $caps as $cap ){
            if( !$role_object->has_cap( $cap ){
                $role_object->add_cap( $cap );
            }
        }
    }
}

このナンセンスを無視してください。

お詫び申し上げます、私の他の答えは ユーザーごと not 役割ごと でした。

あなたができることは、その役割が get_role() を使った能力を持っているかどうかを確認することです。

get_role( 'administrator' )は一連の機能を持つObjectを返すことがわかります。

$administrator = get_role( 'administrator' );

// Make sure role object was retrieved
if( $administrator ){
    //See if it's got our capability or not
    if( !in_array( 'my-custom-cap', $administrator->capabilities ) ){
        // Wasn't there, so add it here
        $administrator->add_cap( 'my-custom-cap' );
    }
}

何らかの理由で毎回$roleオブジェクト比較を実行したくない場合は、一度定義してから update_option() でデータベースにフラグを設定し、 get_option() でそれをチェックすることができます。

if( get_option( 'manually_set_add_cap_admin' ) != true ){
    $administrator = get_role( 'administrator' );

    // Make sure role object was retrieved
    if( $administrator ){
        //See if it's got our capability or not
        if( !in_array( 'my-custom-cap', $administrator->capabilities ) ){
            // Wasn't there, so add it here
            $administrator->add_cap( 'my-custom-cap' );
            update_option( 'manually_set_add_cap_admin', true );
        }
    }
}

これはあなたが追加したロールをループし、それらにすべての適切な機能を与える、もう少し長いソリューションです。ループが完了すると、チェックされたフラグが設定されるため、初回実行後にWP_Roleオブジェクトがフェッチされることはありません。

// Define flag as a variable to prevent typos, in update/get_option
// or it will constantly run (I know from experience...)
$flag = 'manually_added_my_custom_caps';

if( !get_option( $flag ) ){
    // Our flag option wasn't set, that means this code hasn't run yet.

    $roles        = array( 'administrator', 'editor' );
    $capabilities = array( 'custom-cap-1', 'custom-cap-2' );

    // Loop through each role
    foreach( $roles as $role ){
        // Make sure we got a WP_Role object back
        if( $role_object = get_role( $role ) ){
            // Loop through our custom capabilities
            foreach( $capabilities as $cap ){
                // Our option flag wasn't set, but let's confirm
                // that the role doesn't have the cap
                if( !in_array( $cap, $role_object->capabilities ) ){
                    // Confirmed not there, add it here
                    $role_object->add_cap( $cap );
                }
            }
        }
    }

    // Our function ran, it should have set all caps to all the roles
    // so now our code will skip this entirely next time
    update_option( $flag, true );
}
2
Xhynk