web-dev-qa-db-fra.com

Comment mettre à jour les capacités de rôle

J'ai créé manuellement un rôle appelé "planificateur d'événements". Je lui ai attribué certaines capacités et cela fonctionne comme prévu. Toutefois, si par la suite je mets l'une des fonctionnalités de true à false (ou vice-versa), les modifications ne seront pas reflétées dans Wordpress. Je pense que cela est lié au fait que Wordpress ne met pas à jour les fonctionnalités, car si je supprime le rôle, puis que je rajoute le code, cela fonctionnera.

Existe-t-il un moyen de "dire" à Wordpress de mettre à jour les fonctionnalités de mon rôle une fois celles-ci définies?

Voici mon code:

$result = add_role( 'event-planner', __(

'Event Planner' ),

array(

'read' => true,     
'delete_others_events' => false, 
'delete_private_events' => true,
'delete_published_events' => true, 
'delete_events' => true, 
'edit_others_events' => false, 
'edit_private_events' => true, 
'edit_published_events' => true, 
'edit_events' => true,
'publish_events' => true, 
'read_private_events' => true


)

);
2
Johann

Vous pouvez utiliser la fonction add_cap

peut-être comme ça:

function add_my_capabilities($cap){
     $role = get_role('event-planner');
     $role->add_cap($cap);
}

add_my_capabilities('edit_others_events');
1
kuchenundkakao

add_role() ne fera rien si le rôle existe déjà, il ne peut donc pas être utilisé pour modifier des fonctionnalités. Pour modifier les fonctionnalités, utilisez les méthodes add_cap() et remove_cap() de l'objet WP_Role. Vous pouvez obtenir un WP_Role pour votre rôle à l'aide de get_role():

$role = get_role( 'event-planner' );
$role->add_cap( 'edit_others_events' );

Cependant, voici le problème: les rôles sont stockés dans la base de données. L'ajout de rôles ou de fonctionnalités ne devrait donc pas se produire à chaque chargement de page. Si vous souhaitez modifier un rôle existant, vous devrez le faire une seule fois. Cela signifie donc que vous devrez le faire lors de l'activation du thème ou du plug-in, ou lors de l'enregistrement d'une page d'options. Il en va de même pour la création du rôle.

Etant donné que, s'il ne s'agit que d'un plugin/rôle existant uniquement sur votre site, il est probablement préférable d'utiliser un plugin tel que Editeur de rôle utilisateur .

Si c'est un plugin distribué, vous pouvez le faire dans un hook qui se charge sur chaque page, mais cochez simplement une option pour voir si la mise à jour a déjà été faite:

function wpse_289293_update_role() {
    // Get current version of user role.
    $version = get_option( 'wpse_289293_roles_version' )

    // Define version number that represents this change.
    $new_version = 2;

    // If current version is lower than new version.
    if ( $version < $new_version ) {
        // Update the role.
        $role = get_role( 'event-planner' );
        $role->add_cap( 'edit_others_events' );

        // Update db to indicate role has been updated.
        update_option( 'wpse_289293_db_version', $new_version );
    }
}
add_action( 'plugins_loaded', 'wpse_289293_update_role' );

Comme les fonctionnalités du rôle ne sont pas forcées lors de chaque rechargement de page, cela présente également l'avantage de permettre aux utilisateurs d'utiliser un plug-in d'éditeur de rôle utilisateur pour modifier les fonctionnalités eux-mêmes. Si vous exécutiez add_cap() à chaque chargement de page, les modifications apportées seraient écrasées.

0
Jacob Peattie