Hace unos meses Mannie Schumpert publicó un excelente artículo sobre cómo modificar al vuelo (en lugar de guardar los datos permanentemente en la base de datos) algunas capacidades y roles de usuario de WordPress.
Básicamente se trata de utilizar los filtros user_has_cap y map_meta_cap creando funciones en el archivo functions.php que cambien los permisos de usuarios que cumplan unas determinadas condiciones.
Pero para quienes no son programadores o no tienen unos conocimientos demasiado avanzados de PHP, lo más interesante del artículo es el filtro que protege la cuenta original de administrador, evitando que pueda ser editada o borrada por otro usuario.
¿Cuándo podemos necesitar proteger la cuenta de administrador?
Es posible que en algún momento necesitemos otorgar a alguien permisos de administrador en el blog, ya sea para que nos resuelva un problema, para instalar un nuevo theme, o cualquier otro imprevisto que nos pueda surgir.
En esos casos, aun cuando la persona a la que concedemos el acceso sea de absoluta confianza, siempre puede haber accidentes no deseados. Y si uno de ellos es borrar nuestra cuenta de administrador, tendremos un problema.
La solución es añadir al archivo functions.php de nuestro theme estas líneas de código:
<?php
/**
* Prevent Editing of a specified user
*
* This example shows how you can protect the original admin from being edited or deleted by anyone else
*/
add_filter('map_meta_cap', 'prevent_user_edit', 10, 4 );
function prevent_user_edit( $required_caps, $cap, $user_id, $args ){
$protected_user = 1; // ID of user not editable
if ( $user_id === $protected_user ) // Don't block caps if current user = protected user
return $required_caps;
$blocked_caps = array(
'delete_user',
'edit_user'
);
if ( in_array( $cap, $blocked_caps ) && $args[0] === $protected_user )
$required_caps[] = 'do_not_allow';
return $required_caps;}
Además Schumpert ha creado un Gist con más ejemplos, donde podemos encontrar el código para otorgar a los administradores secundarios menos control sobre la instalación:
<?php
// Give secondary "administrators" less control:
add_filter( 'user_has_cap',
function( $caps, $cap, $args ) {
$user_id = $args[1];
$user = new WP_User( $user_id );
$email = $user->user_email;
if ( $email != get_option('admin_email') )
$caps['manage_options'] = false;
return $caps;
}, 10, 3 );
O para permitir sólo a los administradores borrar posts publicados:
<?php
// Only administrators can delete published posts:
add_filter( 'map_meta_cap',
function( $required_caps, $cap ) {
if ( 'delete_post' == $cap )
$required_caps[] = 'manage_options';
return $required_caps;
}, 10, 2 );