2010-04-13 4 views
1

Je veux créer un index utilisateur Wordpress (assez grand) avec les utilisateurs classés par ordre alphabétique, comme ceci:PHP/SQL/Wordpress: Groupe une liste d'utilisateurs par ordre alphabétique

A

  • Amy
  • Adam

B

  • Bernard
  • Bianca

et ainsi de suite.

J'ai créé une requête Wordpress personnalisée qui fonctionne correctement, sauf pour un problème: Elle affiche également des lettres "vides", des lettres où il n'y a aucun utilisateur dont le nom commence par cette lettre. Je serais heureux si vous pouviez m'aider à corriger ce code afin qu'il affiche seulement la lettre s'il y a en fait un utilisateur avec un nom de cette lettre :) J'ai tenté ma chance en vérifiant combien de résultats il y a pour cette lettre, mais de toute façon ça ne marche pas.

(FYI, j'utilise le plugin photo utilisateur et je veux seulement montrer aux utilisateurs de la liste qui ont une image approuvée, d'où le contenu de la requête SQL).

<?php 
    $alphabet = range('A', 'Z'); 
    foreach ($alphabet as $letter) { 
     $user_count = $wpdb->get_results("SELECT COUNT(*) FROM wp_users WHERE display_name LIKE '".$letter."%' ORDER BY display_name ASC"); 
     if ($user_count > 0) { 
     $user_row = $wpdb->get_results("SELECT wp_users.user_login, wp_users.display_name 
     FROM wp_users, wp_usermeta 
     WHERE wp_users.display_name LIKE '".$letter."%' 
     AND wp_usermeta.meta_key = 'userphoto_approvalstatus' 
     AND wp_usermeta.meta_value = '2' 
     AND wp_usermeta.user_id = wp_users.ID 
     ORDER BY wp_users.display_name ASC"); 
     echo '<li class="letter">'.$letter.''; 
     echo '<ul>'; 
     foreach ($user_row as $user) { 
      echo '<li><a href="/author/'.$user->user_login.'">'.$user->display_name.'</a></li>'; 
     } 
     echo '</ul></li>'; 
     }      
    } 
    ?> 

Merci d'avance!


Mise à jour:

J'édité le SQL dans, mais maintenant j'ai le problème qu'il recrache un </ul> avant la première li, qui se visse la mise en page, comme ceci:

</ul> 
</li> 
<li class="letter"> 
    <div class="letter_head">A</div> 
    <ul> 
    <li>Abigail</li> 
    </ul> 
</li> 

<li class="letter"> 
<div class="letter_head">B</div> 
<ul> 
    <li>Bernard</li>  
    <li>Bianca</li>  
</li> 
</ul> 

En général, il est plutôt difficile de savoir où se trouvent les ul et li. Comment puis-je le réparer?

  <?php 
    $qry = "SELECT DISTINCT wp_users.user_login, wp_users.display_name, 
      LEFT(UPPER(wp_users.display_name), 1) AS first_char 
      FROM wp_users, wp_usermeta 
      WHERE UPPER(wp_users.display_name) BETWEEN 'A' AND 'Z' 
      OR wp_users.display_name BETWEEN '0' AND '9' 
      AND wp_usermeta.meta_key = 'userphoto_approvalstatus' 
      AND wp_usermeta.meta_value = '2' 
      AND wp_usermeta.user_id = wp_users.ID 
      ORDER BY wp_users.display_name ASC"; 
      $result = mysql_query($qry); 
      $current_char = ''; 
      while ($row = mysql_fetch_assoc($result)) { 
       if (!isset($current_char)) { 
         echo '<li class="letter"><div class="letter_head">'.$current_char.'</div>'; 
         echo '<ul>'; 
       } elseif ($row['first_char'] != $current_char) { 
         echo '</ul>'; 
         $current_char = $row['first_char']; 
         echo '<li class="letter"><div class="letter_head">'.$current_char.'</div>'; 
         echo '<ul>'; 
       } 
       echo '<li><a href="/member/'.$row['user_login'].'">'.$row['display_name'].'</a></li>'; 
      } 
    ?> 

Répondre

1

Une meilleure solution serait de boucle par tous les utilisateurs dans l'ordre alphabétique et pour chaque vérification du dossier si la première lettre est différente de celle du dernier enregistrement. Si différent, vous faites écho à la nouvelle lettre.

+0

Cela semble être une bonne idée. Comment ça marche? (Je sais comment faire quelque chose comme ça pour les dates, mais je n'ai aucune idée de comment le faire dans ce cas). – rayne

0

Vous effectuez 52 appels de base de données. La table utilisateur est-elle trop volumineuse pour pouvoir tous les saisir dans une requête? En outre, je crois que l'ordre sur le compte est inutile. Je ne sais pas si MySQL l'ignore ou pas.

Votre problème est que get_results renvoie un seul tableau d'éléments à chaque fois pour la requête de comptage. Donc $ user_count> 0 retourne toujours vrai. (Je ne comprends pas la logique PHP la plupart du temps, est-ce qu'un tableau est plus grand que zéro?). Vous devez faire quelque chose comme $ user_count [0] pour obtenir le nombre réel.

+0

Ce n'est pas qu'un tableau est "plus grand que zéro", c'est qu'un tableau n'est pas un néant, un tableau n'est pas une valeur nulle. Zéro n'est pas une valeur nulle non plus d'ailleurs. – magi182

Questions connexes