web-dev-qa-db-fra.com

add_cap n'ajoute que les deux premiers dans un tableau

Après de nombreux jours à tenter de localiser un problème de code, il s’avère que add_cap ne prend que les deux premiers d’un tableau. Le premier (éditeur) ajoutera uniquement delete_others_pages et delete_others_posts à la base de données. Si j'utilise la deuxième méthode de répétition de add_cap, je peux obtenir toutes les fonctionnalités de la base de données.

Quelqu'un peut-il regarder ce code et voir ce qui ne va pas? Pourquoi seuls les deux premiers éléments du tableau vont-ils dans la base de données?

        if( $new_roles == 'editor' ) {

            $user = new WP_User( $user_id );

            $user->add_cap(
                'delete_others_pages','delete_others_posts','delete_pages','delete_posts','delete_private_pages','delete_private_posts','delete_published_pages','delete_published_posts','edit_others_pages','edit_others_posts','edit_pages','edit_posts','edit_private_pages','edit_private_posts','edit_published_pages','edit_published_posts','manage_categories','manage_links','moderate_comments','publish_pages','publish_posts','read','read_private_pages','read_private_posts');

        }

        elseif( $new_roles == 'author' ) {

            $user_id = $XF->visitor->get('user_id');

            $user = new WP_User( $user_id );

            $user->add_cap(
                'delete_posts', 'delete_published_posts'
            );

            $user->add_cap(
                'edit_posts', 'edit_published_posts'
            );

            $user->add_cap(
                'publish_posts', 'read', 'upload_files'
            );

            $user->add_cap(
                'upload_files'
            );

        }

UPDATE CODE pour placer la fonction complete: Ajoute maintenant des tableaux afin que ma question initiale soit répondue, mais ils sont ajoutés aux mauvais utilisateurs.

public static function set_user_roles( &$classObj, $user_group_id, $secondary_group_ids ) {
    /**
     * Function set_user_roles(&$classObj, $user_group_id, $secondary_group_ids)
     * 
     * This function sets the current user role based on the secondary group
     */
    global $XF, $wp_roles;
    $user_groups = explode( ',', $secondary_group_ids );
    $user_groups[] = $user_group_id;

    /**
     * Loop through the user_roles and find the WP role equivalent for each
     */
    $user_roles = array();
    foreach( $user_groups as $user_group ) {
        $user_roles[] = $XF->options['xf_user_role'][$user_group];

        /**
         * wp_die( 'This is the role:' . var_dump( $XF->options['xf_user_role'] ) );
         * 
         * Returns:
         *
         * array(7) { [3]=> string(13) "administrator" [4]=> string(6) "author" [2]=> string(10) "subscriber" [1]=> string(10) "subscriber" [5]=> string(6) "author" [7]=> string(11) "contributor" [6]=> string(6) "editor" }
         */

        /**
         * wp_die( var_dump( $XF->options['xf_user_role'][$user_group] ) ); 
         *
         * Returns for user Ellie who has secondary group related to author
         * string(6) "author"
         * 
         * Returns Albert who has secondary group set to editor
         * string(6) "editor"
         *
         * Returns Pascal who has secondary group related to contributor
         * string(11) "contributor"
         *
         * Returns Gracie NO secondary group for registered members.
         * NULL
         *           
         */


        $new_roles =  $XF->options['xf_user_role'][$user_group];

        if( $new_roles == '' || $new_roles == null) {

            $user_id = $XF->visitor->get('user_id');

            $caps = array( 'read' );

            $user = new WP_User( $user_id );

            foreach ( $caps as $cap ) {

                $user->add_cap( $cap ); 

            }
            break;

        }

        elseif( $new_roles == 'subscriber' ) {

            $user_id = $XF->visitor->get('user_id');

            $caps = array( 'read' );

            $user = new WP_User( $user_id );

            foreach ( $caps as $cap ) {

                $user->add_cap( $cap ); 

            }
            break;

        }

        elseif( $new_roles == 'contributor' ) {

            $user_id = $XF->visitor->get('user_id');

            $caps= array( 'delete_posts', 'edit_posts', 'read' );

            $user = new WP_User( $user_id );

            foreach ( $caps as $cap ) {

                $user->add_cap( $cap ); 

            }
            break;

        }

        elseif( $new_roles == 'author' ) {          

            $user_id = $XF->visitor->get('user_id');

            $caps = array(
                'delete_posts', 'delete_published_posts','edit_posts', 'edit_published_posts','publish_posts', 'read', 'upload_files','upload_files'
                );

            $user = new WP_User( $user_id );

            foreach ( $caps as $cap ) {

                $user->add_cap( $cap ); 

            }
            break;

        }           

        elseif( $new_roles == 'editor' ) {

            $user_id = $XF->visitor->get('user_id');

            $caps = array ( 
                'delete_others_pages','delete_others_posts','delete_pages','delete_post','delete_private_pages','delete_private_posts','delete_published_pages','delete_published_posts','edit_others_pages','edit_others_posts','edit_pages','edit_posts', 'edit_private_pages','edit_private_posts','edit_published_pages','edit_published_posts','manage_categories','manage_links','moderate_comments','publish_pages','publish_posts','read','read_private_pages','read_private_posts'
            );

            $user = new WP_User( $user_id );

            foreach ( $caps as $cap ) {

                $user->add_cap( $cap ); 

            }
            break;

        }

        elseif( $new_roles == 'administrator' ) {

            $user_id = $XF->visitor->get('user_id');

            $caps = array ( 
                'activate_plugins', 'delete_others_pages','delete_others_posts','delete_pages','delete_plugins','delete_posts','delete_private_pages','delete_private_posts','delete_published_pages','delete_published_posts','edit_dashboard','edit_files','edit_others_pages','edit_others_posts','edit_pages','edit_posts','edit_private_pages','edit_private_posts','edit_published_pages','edit_published_posts','edit_theme_options','export','import','list_users','manage_categories','manage_links','manage_options','moderate_comments','promote_users','publish_pages','publish_posts','read_private_pages','read_private_posts','read','remove_users','switch_themes','upload_files','create_product'
            );

            $user = new WP_User( $user_id );

            foreach ( $caps as $cap ) {

                $user->add_cap( $cap ); 

            }
            break;

        }


    }

}

Mise à jour: des fonctionnalités ont été ajoutées, mais tous les comptes bénéficient désormais de fonctionnalités d'administration. Ceci est maintenant demandé: Les rôles d’éditeur et de contributeur ne sont pas corrects après l’ajout de la fonction

1
LPH

En regardant votre code, je pense que vous essayez de modifier les capacités des rôles existants. Est-ce que j'ai raison?

Pour ce faire, vous devez exécuter add_cap pour un objet de rôle et non pour un objet d'utilisateur. De plus, vous devez savoir que add_cap n'accepte qu'une capacité en tant que chaîne:

 $role = get_role( 'editor' );
 $role->add_cap( 'the_capability' );

Si vous souhaitez ajouter plusieurs fonctionnalités, vous pouvez effectuer une boucle. Par exemple:

$capabilities = array( 'cap_1', 'cap_2', 'cap_3' );
$role = get_role( 'editor' );

foreach( $capabilities as $cap ) {
        $role->add_cap( $cap );
}

La même chose s'applique pour effectuer add_cap pour un objet utilisateur:

//example of user ID
$user_id = 25
$capabilities = array( 'cap_1', 'cap_2', 'cap_3' );
$user = new WP_User( $user_id );

foreach( $capabilities as $cap ) {
        $user->add_cap( $cap );
}
3
cybmeta