web-dev-qa-db-fra.com

Utilisateur Dernière Connexion Tri Colonne

J'ai déjà vu qu'il y avait plusieurs façons d'afficher la dernière date de connexion d'un utilisateur sur la page Utilisateurs sans avoir à utiliser un plug-in tiers. Sur cette base, j'aimerais vraiment que la dernière colonne de date de connexion de l'utilisateur puisse être triée (espérons-le par ordre).

J'utilise la dernière connexion de l'utilisateur écran via wpdailybits , mais mes ajouts au code ne permettent pas de trier la colonne.

Suggestions? Je sais qu'il me manque quelque chose ...

//Capture User Last Login
    add_action('wp_login','wpdb_capture_user_last_login', 10, 2);
    function wpdb_capture_user_last_login($user_login, $user){
        update_user_meta($user->ID, 'last_login', current_time('mysql'));
    }

//Display Last Login Date in Admin
    add_filter( 'manage_users_columns', 'wpdb_user_last_login_column');
    function wpdb_user_last_login_column($columns){
        $columns['lastlogin'] = __('Last Login', 'lastlogin');
        return $columns;
    }

    add_action( 'manage_users_custom_column',  'wpdb_add_user_last_login_column', 10, 3); 
    function wpdb_add_user_last_login_column($value, $column_name, $user_id ) {
        if ( 'lastlogin' != $column_name )
            return $value;

        return get_user_last_login($user_id,false);
    }

    function get_user_last_login($user_id,$echo = true){
        $date_format = get_option('date_format') . ' ' . get_option('time_format');
        $last_login = get_user_meta($user_id, 'last_login', true);
        $login_time = 'Never logged in';
        if(!empty($last_login)){
           if(is_array($last_login)){
                $login_time = mysql2date($date_format, array_pop($last_login), false);
            }
            else{
                $login_time = mysql2date($date_format, $last_login, false);
            }
        }
        if($echo){
            echo $login_time;
        }
        else{
            return $login_time;
        }
    }
//Sort the Columns
    add_filter( 'manage_edit-users_sortable_columns', 'sortable_users_column' );
    function sortable_users_column( $sortable_columns  ) {

        $sortable_columns[ 'last_login_column' ] = 'lastlogin';

    }
1
timmyg

Je ne vois nulle part dans votre code que la requête est en cours de modification. Le simple fait de marquer une colonne pour qu'il soit triable ne signifie pas qu'il sait comment trier les données - cela va simplement ajouter la petite flèche haut/bas et rendre la colonne cliquable, mais vous devez intercepter la requête var en conséquence et dire à WP Que faire. Vous voudrez vous connecter à pre_get_users et modifier la requête en conséquence. Puisque vous stockez déjà l'heure en utilisant current_time( 'mysql' ), l'ordre par défaut devrait fonctionner comme prévu.

Ceci n’a pas été testé, mais devrait fonctionner ou au moins vous aider à démarrer.

add_action( 'pre_get_users', 'wpse_filter_user_query' );
function wpse_filter_user_query( $user_query ) {
    global $current_screen;

    if ( !is_admin() || 'users' != $current_screen->id ) 
        return;

    if( 'lastlogin' == $user_query->get( 'orderby' ) ) 
    {
        $user_query->set( 'orderby', 'meta_value' ); 
        $user_query->set( 'meta_key', 'last_login' );
    } 
}
1
brianjohnhanna