Hoe werkt dat nu eigenlijk die user roles & capabilities?

Laat ons beginnen bij het begin

Een rare titel nu ik ‘m lees maar laat ons beginnen bij het begin zodat onze setup correct is opgezet.

Custom post type

Laat ons beginnen met het registreren van een custom post type dog. Waarom dog? Wel simpelweg omdat mijn tweede passie hondengedragstherapie is en dat ik die beestjes nu éénmaal graag zie.

function register_dog_post_type() {
    register_post_type(
        'dog',
        array(
            'label' => 'Dogs',
            'labels' => array(
                'name' => __('Dogs'),
                'singular_name' => __('Dog'),
            ),
            'public' => true,
            'hierarchical' => false,
            'has_archive' => true,
            'show_in_rest' => true,
            'show_in_menu' => true,
            'rewrite' => array(
                'slug' => 'dog',
                'with_front' => false,
            ),
            'capability_type' => array('dog', 'dogs'),
            'map_meta_cap' => true,
        )
    );
}

add_action( 'init', 'register_dog_post_type', 10, 0 );
PHP

De register_post_type() argumenten

Naast de default post type instellingen vind je volgende user specific array keys terug:

  1. capability_type: dit is de naam die we gebruiken voor de read, edit en delete capabilities. Hier heb ik een array gebruikt waarbij de eerste value dog het enkelvoud is en dogs, inderdaad voor het meervoud. Ik had ook gewoonweg de string dog kunnen gebruiken. WordPress voegt dan automatisch de ‘s’ achteraan toe. Hier zou dit ook dogs zijn maar als je bijvoorbeeld category gebruikt dan wordt dit categorys (raar maar waar). Dus, “Choose your slug wisely”.
  2. map_meta_cap: wanneer deze ingesteld staat op false betekent dit dat je de edit_post capability zelf moet toevoegen aan alle beschikbare user roles. Klinkt onduidelijk maar wat je moet onthouden is dat WordPress de edit capabilities gaat mappen met de user rechten. Dit betekent dat posts (hier dog posts) kunnen worden bewerkt door de gebruiker die de post heeft aangemaakt. Als we de map_meta_cap instelling niet inschakelen sta je zelf in voor het beheren van de meta capabilities (read_dog, edit_dog, delete_dog). Dit houdt ook in dat standaard gebruikers met deze rechten elke post van het post type dog kunnen beheren aangezien er geen meta map controle wordt uitgevoerd met de rechten van de gebruiker.

Custom User Role

Naast onze custom post type dog maken we ook een custom user role dog_admin.

public function add_dog_admin_role() {
    add_role(
        'dog_admin',
        'Dog Admin',
        array(
            'read' => true,
            // 'read_dog' => true, // Mapped to primitive capabilities
            'read_private_dogs' => true,
            // 'edit_dog' => true, // Mapped to primitive capabilities
            'edit_dogs' => true,
            'edit_published_dogs' => true,
            'edit_private_dogs' => true,
            'edit_others_dogs' => true,
            'publish_dogs' => true,
            // 'delete_dog' => true, // Mapped to primitive capabilities
            'delete_dogs' => true,
            'delete_published_dogs' => true,
            'delete_private_dogs' => true,
            'delete_others_dogs' => true,
        )
    );
}
PHP

Belangrijke opmerkingen

In de functie hierboven vind je geen meta capabilities terug.

Dit zijn, weet je het nog, read_dog, edit_dog en delete_dog. Deze worden via de map_meta_cap() functie beheerd.

De functie is niet voorzien van een action hook.

De reden hiervoor is omdat we tijdens het development de capabilities grondig willen testen alvorens we dit naar een live productie omgeving uitrollen.

Belangrijk om te onthouden tijdens het development is dat indien je capabilities wijzigt in één of meerdere user roles dat je ervoor zorgt dat WordPress deze ook opnieuw kan indexeren en bewaren in de databank. Dit kan je doen door eerst de user roles (met uitzondering van de administrator rol) te verwijderen. Hiervoor kan je WP CLI gebruiken:

wp role delete dog_admin
Bash

Dit commando zorgt ervoor dat de user role dog_admin wordt verwijderd. Als je vervolgens je admin pagina herlaad (mits je tijdens het development de add_role() functie voor je user roles uitvoert dan worden de user roles opnieuw bewaard in de databank via de tabel wp_options met de key wp_user_roles.

Voor het herstellen/updaten van de administrator capabilities kan je volgend WP CLI commando gebruiken:

wp role reset administrator
Bash

Wat is nu de ideale WordPress hook voor je user roles?

Het is aangewezen om de register_activation_hook() hook te gebruiken. Dit kan binnen je theme of een plugin. Waarom deze hook? We willen vermijden dat deze functie steeds wordt uitgevoerd in een productie omgeving.

Tijdens je development fase kan je de add_role() functies inhaken op de init() hook.

Ik hoop dat mijn blog post je wat wijzer heeft gemaakt hoe die user roles en hun capabilities hun ding doen in WordPress. User roles en capabilities zijn één van de complexere WordPress integraties maar éénmaal als je het concept onder de knie hebt is het een krachtige tool als WordPress developer om functionaliteit op gebruikersniveau veilig en gecontroleerd te beheren.

Tags: