PHP / SQL / Wordpress: группировать список пользователей по алфавиту - PullRequest
1 голос
/ 13 апреля 2010

Я хочу создать (довольно большой) пользовательский индекс Wordpress с категориями пользователей в алфавитном порядке, например:

A

  • Эми
  • Адам

B

  • Bernard
  • Bianca

и так далее.

Я создал собственный запрос Wordpress, который отлично подходит для этого, за исключением одной проблемы: он также отображает «пустые» буквы, буквы, в которых нет пользователей, чье имя начинается с этой буквы. Я был бы рад, если бы вы могли помочь мне исправить этот код так, чтобы он отображал букву только в том случае, если на самом деле есть пользователь с именем этой буквы :) Я попытал счастья, проверив, сколько результатов есть для этой буквы но почему-то это не работает.

(К вашему сведению, я использую плагин для пользовательских фотографий и хочу показывать только пользователей в списке, у которых есть утвержденная картинка, отсюда и все, что в запросе 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>';
      }                     
    }
    ?>

Заранее спасибо!


Обновление:

Я отредактировал SQL-код в этом, но теперь у меня проблема в том, что он выплевывает </ul> перед первым li, что портит компоновку, вот так:

</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>

Это вообще довольно странно в отношении ul и liesting. Как я могу это исправить?

            <?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>';
            }  
    ?>

Ответы [ 2 ]

1 голос
/ 13 апреля 2010

Лучшим решением было бы перебрать всех пользователей в алфавитном порядке и при каждой проверке записи проверять, отличается ли первая буква от буквы последней записи Если отличается, вы повторяете новое письмо.

0 голосов
/ 13 апреля 2010

Вы делаете 52 звонка из базы данных.Является ли таблица пользователя слишком большой, чтобы захватить их все в одном запросе?Кроме того, я считаю, что заказ на счет не нужен.Я не знаю, игнорирует ли MySQL это или нет.

Ваша проблема в том, что get_results возвращает один массив элементов каждый раз для запроса на подсчет.Таким образом, $ user_count> 0 всегда возвращает true.(Большую часть времени я не понимаю логику PHP. Массив больше нуля?).Вам нужно сделать что-то вроде $ user_count [0], чтобы получить фактическое число.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...