2010-04-13 77 views
1

我想创建一个(相当大)的WordPress用户提供按字母顺序分类的用户指标,这样的用户列表:PHP/SQL/WordPress的:第一组由字母

一个

  • 艾米
  • 亚当

  • 伯纳德
  • 比安卡

等。

我已经创建的正常工作对于这一点,除了一个问题一个自定义的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>问题:

</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和李嵌套。我该如何解决它?

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

回答

1

一个更好的解决办法是遍历按字母顺序排列,并为每个记录检查的所有用户,如果第一个字母从上次记录的不同。如果不同,你会回复这封新信。

+0

听起来很不错。它是如何工作的? (我知道如何做日期这样的事情,但在这种情况下我不知道该怎么做)。 – rayne 2010-04-13 15:07:42

0

你正在做的52所数据库调用。用户表是否太大而无法在一个查询中全部获取?另外,我相信在点票上的订单是不必要的。我不知道MySQL是否忽略它。

您的问题是对数查询每次get_results返回一个单元素数组。所以$ user_count> 0总是返回true。 (我大部分时间都不懂PHP逻辑,数组是否大于零?)。你需要做一些事情,比如$ user_count [0]来获得实际的数字。

+0

这不是说数组“不大于零”,而是数组不是虚无,数组也不是空值。就此而言,零不是空值。 – magi182 2014-10-31 02:35:30

相关问题