web-dev-qa-db-fra.com

Laisser le nouveau rôle utilisateur à 'edit_others_posts' d'un autre rôle utilisateur, mais pas de son propre type

Dans mon système, je crée deux nouveaux rôles:

  • Tierce partie (TP) (privilèges moindres)
  • Opérateur de saisie de données (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. DEOs peut également ajouter librement son contenu, et DEOs peut également éditer/modifier le contenu de TP et enfin en publier. Mais ils (DEOs) 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?

2
Mayeenul Islam

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 );
1
Riffaz Starr