web-dev-qa-db-fra.com

Comment vérifier si un rôle a une capacité spécifique

Dans un plugin, je crée un rôle utilisateur dédié avec quelques fonctionnalités. Ces fonctionnalités doivent également être affectées à d'autres rôles, tels que editor et admin.

Comme l'ajout de rôles et de fonctionnalités implique des écritures dans la base de données, ces opérations sont généralement considérées comme "coûteuses" et il est recommandé de les effectuer uniquement dans le hook d'activation du plug-in. Dans mon cas, il n'y a pas de hook d'activation, car le plugin doit être chargé en tant que mu-plugin . Par conséquent, je veux vérifier si les rôles d’administrateur et d’éditeur disposent déjà de mes capacités personnalisées avant de tenter de les ajouter.

Comment puis-je vérifier si un rôle spécifique a une capacité spécifique? Ou, alternativement: Est-ce encore moins "cher" de faire le chèque? Ou devrais-je simplement appeler add_cap() à partir du hook init sans vérification préalable?

2
jsphpl

Mettre à jour:

Wow, je me sens comme un bouffon ... haha. WP_Role::has_cap

Je ne peux pas (jouer) mes yeux assez durs.

$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 );
            }
        }
    }
}

Ne tenez pas compte de ce non-sens:

Je m'excuse, mon autre réponse était par utilisateur pas par rôle .

Ce que vous pouvez faire est de vérifier si le rôle a la capacité en utilisant get_role()

Vous pouvez voir que get_role( 'administrator' ) renverra un objet contenant un tableau de capacités.

$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' );
    }
}

Si, pour une raison quelconque, vous ne souhaitez pas exécuter la comparaison d'objet $role à chaque fois, vous pouvez la définir une fois, puis définir un indicateur dans la base de données avec update_option() et le vérifier avec 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 );
        }
    }
}

Voici une solution un peu plus longue qui permet de faire la boucle sur tous les rôles que vous ajoutez et de leur donner toutes les fonctionnalités appropriées. Une fois les boucles terminées, un indicateur est coché, de sorte qu'aucun objet WP_Role ne sera récupéré après sa première exécution.

// 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