web-dev-qa-db-fra.com

Basculer les rôles d'utilisateur avec le bouton

Je ne sais pas si cela est possible, mais j'ai deux rôles d'utilisateur: Hero et Legend. Lorsque des personnes s'abonnent à mon site Web, le rôle d'utilisateur Hero leur est attribué.

J'aimerais pouvoir basculer les utilisateurs sur le rôle d'utilisateur Legend en disposant un bouton sur /users.php dans sa propre colonne.

Y a-t-il une fonction qui pourrait permuter les rôles d'utilisateur entre les deux rôles? Ou est-ce quelque chose qui ne peut pas être fait à la volée?

Je sais que vous pouvez "changer de rôle d'utilisateur" en haut de la table, mais pour les autres administrateurs du site Web, j'aimerais pouvoir disposer d'un bouton pour qu'ils aient l'impression de l'avoir changé.


Remarque: Legend permet de voir plus de contenu que Hero utilisateurs

1
Andrew Lazarus

Il se trouve que l’un de mes sites a quelque chose de très similaire qui permet aux administrateurs de mettre à jour des méta utilisateurs personnalisés.

Fondamentalement, vous devez ajouter une colonne supplémentaire, puis la remplir avec un lien pour faire ce que vous voulez. Lorsque vous cliquez sur le lien, certaines requêtes jQuery sont déclenchées par une demande AJAX pour mettre à jour le rôle d'utilisateur, puis vous êtes redirigé vers le /wp-admin/users.php page.

Voici le principal wp_update_user() , que je vous encourage à jeter un coup d'œil.


PHP

Tout d’abord, ajoutez ceci à votre fichier functions.php pour ajouter la colonne supplémentaire et son contenu. Cela ajoutera également la fonction AJAX qui fera réellement toute la magie quand elle est appelée -

/** Manage custom columns on instances of 'WP_List_Table' */
add_action('init', 'my_setup_custom_columns', 110, 0);
function my_setup_custom_columns(){

    /** Manage columns on the WP_Users_List_Table */
    add_filter('manage_users_columns', 'my_add_custom_columns');

    /** Populate additional columns on the WP_Users_List_Table */
    add_action('manage_users_custom_column', 'my_fill_custom_columns_return', 10, 3);

}

/**
 * Add additional custom columns to the list table views in the admin area
 *
 * @param required array $columns   The columns that currently exist
 */
function my_add_custom_columns($columns){

    /** Grab the page that is currently being viewed */
    global $pagenow;

    /** Users specific columns (http://www.blog.com/wp-admin/users.php) */
    if($pagenow === 'users.php') :

        $new_columns['my-change-user-role'] = __('Change Role');

    endif;

    $columns = $columns + $new_columns;

    return $columns;

}

/**
 * Fill the custom columns by returning data
 *
 * @param required string $column_value The current column value (in this case 'null' since the columns are new)
 * @param required string $column_name  The name of the column to return data for
 * @param required integer $object_id   The ID of the curent object to fill the column for
 * @return string $column_value         The value to fill the column with
 */
function my_fill_custom_columns_return($column_value, $column_name, $object_id){

    switch($column_name) :

        /**
         * ID (the ID of the current object)
         */
        case 'my-change-user-role' :

            $user = get_userdata($object_id);
            $role = $user->roles[0];

            if($role === 'legend') :
                $column_value = '<span user-id="' . $object_id . '" new-role="subscriber" class="change-user-role">Downgrade to a Hero</span>';
            elseif($role === 'hero') :
                $column_value = '<span user-id="' . $object_id . '" new-role="document_administrator" class="change-user-role">Upgrade to a Legend</span>';
            else:
                $column_value = '&#8212;';
            endif;

            break;

    endswitch;

    return $column_value;

}

/**
 * Change the role of a given user
 */
add_action('wp_ajax_change_user_role', 'my_update_user_role');
function my_update_user_role(){

    /** Update the user role */
    $args = array(
        'ID'    => $_POST['user_id'],
        'role'  => $_POST['new_role']
    );
    $result = wp_update_user($args);

    /** Check whether or not the update was successful */
    if(is_wp_error($user_id)) :
        $message = 'An unexpected error occured, please try again.';
        $url = false;
    else :
        $message = 'success';
        $url = admin_url('users.php');
    endif;

    $return = array(
        'message'   => $message,
        'url'       => $url
    );
    echo json_encode((object)$return);

    wp_die(); // This is required to terminate immediately and return a proper response

}

CSS

Ajoutez ensuite ceci à une feuille de style accessible lorsque vous affichez la zone d'administration -

.wp-list-table.users .manage-column.column-my-change-user-role{
    width:  150px;
}
.wp-list-table.users span.change-user-role{
    color:  #0074A2;
    cursor: pointer;
}
.wp-list-table.users span.change-user-role:hover{
    color:  #2EA2CC;
}

JS

Enfin, ajoutez ceci à un fichier JS accessible lorsque vous consultez la zone d'administration -

jQuery(function($){

    $(document).ready(function(){
        updateUser.init();
    });

    var updateUser = {

        /**
         * Psuedo constructor
         */
        init : function(){

            this.userChangeRoleButtons = $('.wp-list-table.users span.change-user-role');   // Grab all instance of the buttons to change the user role
            this.createEvents();                                                            // Create the events to be handled by this object

        }, // init

        /**
         * Create the events that are to be handled by this object
         */
        createEvents : function(){

            var t = this;   // This object

            /**
             * Handle clicks of the change user role buttons
             */
            this.userChangeRoleButtons.on('click', function(e){

                t.changeRole($(this));

            });

        }, // createEvents

        /**
         * Updates the user role as required
         */
        changeRole : function(clicked){

            var t               = this, // This object
                user_id         = clicked.attr('user-id'),
                new_role        = clicked.attr('new-role');

            var data = {    // The data object to pass to the AJAX request
                action:     'change_user_role',
                user_id:    user_id,
                new_role:   new_role
            };

            /** Make the AJAX request to update the download count */
            var action_jqxhr = $.post(ajaxurl, data, function(response){

                /** Parse the JSON response */
                var obj = JSON.parse(response);

                /** Ensure that there were no errors and update the 'Change role' button text */
                if(obj.message.indexOf('error') === -1){    // There was no error, redirect the user back to this page

                    top.location.replace(obj.url);

                } else {    // There was an error, tell the user about it

                    alert(obj.message); // Show the error to the user

                }

            }).fail(function(){ // There was an AJAX error...
                alert('An unexpected error occured, please try again.');
            });

        } // changeRole

    };

});
1
David Gard