WordPress wp-admin sorteren op custom column in de lijst

Sorteren op custom column in de wp-admin lijstweergave.Wist je dat je in de wp-admin omgeving de lijst weergave van het Gebruikers scherm uit kan breiden met eigen kolommen?

Een eigen kolom wordt in het Engels een custom column genoemd. Een voorbeeld is om een kolom toe te voegen met daarin de registratiedatum van een gebruiker.

In dit blog wordt in een aantal stappen telkens PHP code toegevoegd. Voeg dit toe aan het functions.php bestand van jouw child theme. Heb je geen child theme dan zou je een drop-in plugin kunnen gebruiken.

Stap 1: Kolom titel “geregistreerd” toevoegen

Voeg onderstaande PHP code toe om een nieuwe kolom met titel toe te voegen.

/**
 * Add new column to the user screen list.
 *
 * @param array $columns
 * @return array $columns
 */
function custom_userscreen_column_titles(array $columns) : array { 
   $columns['custom_account_created'] = 'Geregistreerd'; 

   return $columns; 
} 
add_filter('manage_users_columns', 'custom_userscreen_column_titles');

Bovenstaande code kan je eenvoudig uitbreiden met titels voor andere kolommen.

Stap 2: Kolom met registratie datums toevoegen

Om data in de kolommen onder de titel van stap 1 te tonen heb je deze PHP code nodig.

/**
 * Added new column with data to the user screen list.
 *
 * @param string $value
 * @param string $columnName
 * @param int $idUser
 * @return string
 */
function custom_userscreen_column_data(string $value, string $columnName, int $idUser) : string {
    switch ($columnName) {
        case 'custom_account_created':
            $userData = get_userdata($idUser);
            $value    = $userData->user_registered;
            break;
        default:
    }

    return $value;
}
add_filter('manage_users_custom_column', 'custom_userscreen_column_data', 10, 3);

Bovenstaande code kan je eenvoudig uitbreiden met meer kolommen. Belangrijk is dat het aantal kolommen in stap 1 en 2 hetzelfde zijn om vreemde resultaten te voorkomen.

Stap 3: sorteren op registratie datum

Plaats nu onder de volgende regel code uit stap 1:

 add_filter('manage_users_columns', 'custom_userscreen_column_titles'); 

De volgende regel PHP code:

 add_filter('manage_users_sortable_columns', 'custom_userscreen_column_titles'); 

Eigenlijk voeren we voor 2 verschillende acties dezelfde PHP functie uit. Het enige verschil is dat je nu ook kan klikken op de titel om te sorteren op de registratie datums.

Vreemd genoeg gaat het sorteren niet helemaal goed. Dit lossen we op in stap 4.

Stap 4: nu echt sorteren op registratie datum

Voeg onderstaande derde PHP functie toe om echt te sorteren op datums.

/**
 * @param $user_search
 * @return void
 */
function custom_userscreen_column_orderby($user_search) {
    global $wpdb, $current_screen;

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

    $vars = $user_search->query_vars;
    if('Geregistreerd' == $vars['orderby']) {
        $user_search->query_orderby = ' ORDER BY user_registered '. $vars['order'];
    }
}
add_action('pre_user_query','custom_userscreen_column_orderby');

Bovenstaande code wordt alleen uitgevoerd voor het ‘Users’ scherm wat de Engelse vertaling is voor Gebruikers.

Deze functie past de SQL query aan die naar de database wordt gestuurd om de lijst met gebruikers op te halen en te sorteren op de kolom “user_registered”.

Omdat je sorteren van van “oud naar nieuw” en van “nieuw naar oud” kan doen wordt de variabele $vars[‘order’] gebruikt.

Bonustip: custom column met meta value sorteren

De code uit stap 4 werkt niet als je een “custom column” vult met een “meta value”. Dit is een custom waarde die je zelf aan een gebruiker hebt toegevoegd. Bijvoorbeeld wanneer de gebruiker voor het laatst is ingelogd. Met andere woorden: het is geen standaard WordPress gebruiker veld zoals gebruikersnaam en e-mailadres wel zijn.

Om toch te kunnen sorteren voeg je aan de functie van stap 4 de volgende code toe:

if('Laatst ingelogd' == $vars['orderby']) {
   $user_search->query_from .= " LEFT JOIN {$wpdb->usermeta} m1 ON {$wpdb->users}.ID=m1.user_id AND (m1.meta_key='custom_account_lastlogin')";
   $user_search->query_orderby = ' ORDER BY m1.meta_value '. $vars['order'];
}

Voor de kolom “Laatst ingelogd” sorteer je op de meta key “custom_account_lastlogin”. Deze waarde zit in een andere database tabel genaamd “user_meta” die verbonden wordt met de “users” tabel op basis van het unieke record id.

Laat een reactie achter

Je e-mailadres zal niet worden gepubliceerd. vereiste velden zijn gemarkeerd met *

Deze site gebruikt Akismet om spam te verminderen. Bekijk hoe je reactie-gegevens worden verwerkt.