【问题标题】:PHP/SQL/Wordpress: Group a user list by alphabetPHP/SQL/Wordpress:按字母对用户列表进行分组
【发布时间】:2010-04-13 12:23:43
【问题描述】:

我想创建一个(相当大的)Wordpress 用户索引,用户按字母顺序分类,如下所示:

一个

  • 艾米
  • 亚当

B

  • 伯纳德
  • 比安卡

等等。

我创建了一个自定义 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 编辑成这个,但现在我的问题是它在第一个 li 之前吐出一个&lt;/ul&gt;,这搞砸了布局,如下所示:

</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 和 li 的嵌套,一般来说是很奇怪的。我该如何解决?

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

【问题讨论】:

    标签: php mysql wordpress


    【解决方案1】:

    更好的解决方案是按字母顺序遍历所有用户,并检查每条记录的第一个字母是否与最后一条记录的不同。如果不同,您就回显新的字母。

    【讨论】:

    • 听起来是个好主意。它是如何工作的? (我知道如何为约会做类似的事情,但我不知道在这种情况下如何做)。
    【解决方案2】:

    您正在执行 52 次数据库调用。用户表是否太大而无法在一次查询中全部获取?另外,我认为按计数排序是不必要的。不知道MySQL有没有忽略。

    您的问题是 get_results 每次为计数查询返回一个元素数组。所以 $user_count > 0 总是返回 true。 (我大部分时间都不懂 PHP 逻辑。数组是否大于零?)。您需要执行 $user_count[0] 之类的操作才能获得实际数字。

    【讨论】:

    • 不是数组“大于零”,而是数组不是虚无,数组不是空值。零也不是空值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-29
    • 2017-02-28
    • 1970-01-01
    • 1970-01-01
    • 2018-12-03
    • 1970-01-01
    相关资源
    最近更新 更多