Dans mon système, je crée deux nouveaux rôles:
TP
) (privilèges moindres)DEO
) (puissant sur tiers - mais pas de son propre groupe)Le paramètre "Capacités" de mon CPT a été modifié avec 'map_meta_cap' => true
comme:
...
'capabilities' => array ( 'read' => 'read_cpt', 'edit_posts' => 'edit_cpt' ),
'map_meta_cap' => true
...
Le scénario est: TP
peut ajouter son contenu librement, mais ne peut pas publier. DEO
s peut également ajouter librement son contenu, et DEO
s peut également éditer/modifier le contenu de TP
et enfin en publier. Mais ils (DEO
s) ne peuvent pas toucher les messages de leur propre rôle. Supposons que 'X en tant que DEO
' ajoute un article, 'Y en tant que DEO
' ne puisse y toucher. Mais X et Y peuvent toucher individuellement les posts de 'Z en tant que TP
'.
En ajoutant un nouveau rôle, je fais:
$tp = add_role(
'third_party',
__('Third Party'),
array(
'read_cpt' => true,
'edit_cpt' => true,
//'edit_others_cpt => false //by default not assigned
)
);
$deo = add_role(
'data_entry_operator',
__('Data Entry Operator'),
array(
'read_cpt' => true,
'edit_cpt' => true,
'edit_others_cpt => true
)
);
Vous savez, edit_others_cpt
y aura accès en modifiant les publications de TP
, mais ne les empêchera pas de modifier les publications de leur propre rôle d'utilisateur (DEO
).
Comment puis-je laisser DEO
'edit_others_posts' du rôle TP
uniquement, pas de DEO
?
Ajoutez d’abord des fonctionnalités aux rôles comme celui-ci
add_action( 'after_setup_theme', 'add_caps_to_custom_roles' );
function add_caps_to_custom_roles() {
$caps = array(
'read_cpt',
'edit_cpt',
'edit_others_cpt',
);
$roles = array(
get_role( 'third_party' ),
get_role( 'data_entry_operator' ),
);
foreach ($roles as $role) {
foreach ($caps as $cap) {
$role->add_cap( $cap );
}
}
}
PUIS
/**
* Helper function getting roles that the user is allowed to create/edit/delete 'TP' post.
*
* @param WP_User $user
* @return array
*/
function allowed_roles_to_edit_TP_post( $user ) {
$allowed = array();
if ( in_array( 'administrator', $user->roles ) ) { // Admin can edit all roles post
$allowed = array_keys( $GLOBALS['wp_roles']->roles );
} else ( in_array( 'data_entry_operator', $user->roles ) ) {
$allowed[] = 'third_party';
}
return $allowed;
}
/**
* Remove roles that are not allowed for the current user role.
*/
function editable_roles( $roles ) {
if ( $user = wp_get_current_user() ) {
$allowed = allowed_roles_to_edit_TP_post( $user );
foreach ( $roles as $role => $caps ) {
if ( ! in_array( $role, $allowed ) )
unset( $roles[ $role ] );
}
}
return $roles;
}
add_filter( 'editable_roles', 'editable_roles' );
/**
* Prevent users deleting/editing users with a role outside their allowance.
*/
function controll_map_meta_cap( $caps, $cap, $user_ID, $args ) {
if ( ( $cap === 'read_cpt' || $cap === 'edit_cpt' || $cap === 'edit_others_cpt' ) && $args ) {
$the_user = get_userdata( $user_ID ); // The user performing the task
$user = get_userdata( $args[0] ); // The user being edited/deleted
if ( $the_user && $user ) {
$allowed = allowed_roles_to_edit_TP_post( $the_user );
if ( array_diff( $user->roles, $allowed ) ) {
// Target user has roles outside of our limits
$caps[] = 'not_allowed';
}
}
}
return $caps;
}
add_filter( 'map_meta_cap', 'controll_map_meta_cap', 10, 4 );