web-dev-qa-db-fra.com

Autoriser l'utilisateur à modifier un utilisateur spécifique avec une clé méta à l'aide de map_meta_cap

Existe-t-il un moyen "hook" ou un code personnalisé permettant à un utilisateur doté du rôle personnalisé "abc" de modifier et de supprimer d'autres utilisateurs dotés d'un rôle personnalisé "xyz" à l'aide de map_meta_cap?

Merci

2
Mohammed

Je pense que c'est possible, j'ai écrit un code dans functions.php dans le thème et cela fonctionne bien. Si quelqu'un pouvait améliorer les choses: D Nous avons une méta personnalisée pour chaque utilisateur, ce qui pourrait être fait avec ACF. Seuls les administrateurs peuvent définir cette méta sur l'utilisateur (esthéticiennes).

J'ai 2 rôles personnalisés propriétaire de salon et esthéticiennes. salonowner ont accès à éditer, lister les utilisateurs. Nous avons un type de message "Listing" et salonowner peut y créer un message. Permet d'appeler cela Salon1. Seuls les administrateurs peuvent affecter des esthéticiennes à Salon1 en utilisant "méta" d'ACF et j'ai créé le champ Relationshop .. ici, il s'appelle list_for_user.

Nous créons ici les 2 nouveaux rôles personnalisés:

add_action( 'after_setup_theme', 'create_custom_roles' );
function create_custom_roles() {
    add_role( 'salonowner', 'salonowner');
    add_role( 'beauticians', 'beauticians');
}

Ici, nous assignons les utilisateurs à éditer et à lister pour le rôle salonowner:

add_action('admin_init','add_role_caps',999);
function add_role_caps() {
    $salonowner = get_role('salonowner');
    $salonowner->add_cap('edit_users');
    $salonowner->add_cap('list_users');
}

Avec ce code personnalisé, nous pouvons empêcher le propriétaire de salon d’éditer d’autres utilisateurs et de le laisser éditer uniquement les utilisateurs qui ont les mêmes méta pour leur listing "Salon1".

add_filter( 'map_meta_cap', 'custom_map_meta_cap', 10,4);
function map_meta_cap( $caps, $cap, $user_id, $args ){
if ( ! function_exists( 'get_current_screen' ) )
        return;
    $screen = get_current_screen();

    if($screen->base == 'users' || $screen->base == 'user-edit') {

        $user_meta = get_userdata($user_id); 
        $user_roles = $user_meta->roles; 
        if($user_roles){
            if (in_array("salonowner", $user_roles)) {

                if( isset($args[0]) ){
                    $edit_user_id = $args[0];
                }

                $listing_ids = get_user_meta( $edit_user_id, 'list_for_user', true);
                if($listing_ids){
                $arr = get_current_user_posts_can_edit();
                    foreach ($listing_ids as $key => $listing_id) {
                        if (in_array($listing_id, $arr )){
                            return $caps;
                        }else{
                            $caps = 'do_not_allow';
                        }
                    }
                }else{
                    // Don't allow for edit all other users 
                    $user = get_userdata( $edit_user_id );
                    if ( $user ) {
                       $caps = 'do_not_allow';
                    } 
                }
            }
        }
    }
    return $caps;

}

Voici la fonction pour obtenir toutes les publications pour que l'utilisateur actuel vérifie s'il peut éditer l'utilisateur qui l'a assigné:

function get_current_user_posts_can_edit(){
    $current_user_id = get_current_user_id();
    $posts = get_posts(array(
        'posts_per_page'    => -1,
        'post_type'         => 'listing',
        'post_status'       => 'publish',           
        'author'            =>  $current_user_id,
    ));  
    $post_ids = array();
    foreach ($posts as $key => $post) {
        $post_ids[] = $post->ID;
    } 
    return $post_ids;
  }
1
Mohammed