Ik begrijp je vraag en dat is ook de reden van deze blog post? En eerlijk gezegd, de officiële documentatie is niet zo duidelijk. Wat zijn die meta en primitive capabilities, map_meta_cap, capability type en capability settings?
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 );
PHPDe register_post_type()
argumenten
Naast de default post type instellingen vind je volgende user specific array keys terug:
capability_type
: dit is de naam die we gebruiken voor deread
,edit
endelete
capabilities. Hier heb ik een array gebruikt waarbij de eerste valuedog
het enkelvoud is endogs
, 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 bijvoorbeeldcategory
gebruikt dan wordt ditcategorys
(raar maar waar). Dus, “Choose your slug wisely”.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 demap_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 typedog
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,
)
);
}
PHPBelangrijke 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
BashDit 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
BashWat 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.
That’s all folks
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.