web-dev-qa-db-fra.com

Liste des utilisateurs par ordre alphabétique

Comment puis-je afficher une liste d'utilisateurs avec des en-têtes alphabétiques? Par exemple:

A
Adam
Alan

B
Facture
Bob

J'ai trouvé des exemples qui le font avec Posts, mais je ne vois pas comment le faire fonctionner avec WP_User_query() :(

1
thv20

Après un peu de bricolage, j'ai trouvé quelque chose. Ce n'est certainement pas la meilleure méthode, mais comme il n'y a pas de bonne façon de le faire directement dans le noyau sans avoir à faire un tas de réordonnancement de tableaux, je pense que SQL est une meilleure solution ici. Quoi qu'il en soit, le code SQL est comme suit:

SELECT users.*, meta.meta_value
FROM $wpdb->users AS users LEFT JOIN $wpdb->usermeta AS meta
    ON users.ID = meta.user_id
WHERE meta.meta_key = 'first_name'
    AND meta.meta_value != ''
ORDER BY meta.meta_value ASC

Rien de spécial ne se passe là-bas, il récupère simplement toutes les valeurs de la table users où un prénom est défini.

Pour la liste, vous pouvez simplement parcourir ces résultats, c'est assez simple. La seule chose à faire est de faire en sorte que les titres fonctionnent correctement. Si vous stockez l'en-tête, puis effectuez une comparaison insensible à la casse, cela devrait être assez facile. Par exemple (pseudocode):

$cur_first_letter = substr( $first_name, 0, 1 );

if( strtoupper( $cur_first_letter ) != strtoupper( $prev_first_letter ) ) {
    // output header for strtoupper( $cur_first_letter )
}

$prev_first_letter = $cur_first_letter;

Note: Le SQL est testé, le PHP ne l'est pas (évidemment, puisqu'il s'agit d'un pseudocode).

0
mor7ifer

@ m0r7if3r a fourni la bonne réponse. Dans le but de fournir un extrait directement utilisable à quiconque examine ce problème, voici ce que j'ai finalement utilisé.

$wp_users = $wpdb->get_results("
    SELECT users.*, meta.meta_value
    FROM $wpdb->users AS users LEFT JOIN $wpdb->usermeta AS meta
        ON users.ID = meta.user_id
    WHERE meta.meta_key = 'first_name'
        AND meta.meta_value != ''
    ORDER BY meta.meta_value ASC
");

foreach ($wp_users as $wp_user) :

    $cur_first_letter = substr( $wp_user->meta_value, 0, 1 );

    if( strtoupper( $cur_first_letter ) != strtoupper( $prev_first_letter ) ) {
        echo "<h3 class='alpha-heading'>$cur_first_letter</h3>";
    }

    echo "<li><a href=''>$wp_user->meta_value</a></li>";

    $prev_first_letter = $cur_first_letter;

endforeach;
5
thv20