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()
:(
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).
@ 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;