我想创建一个(相当大的)Wordpress用户索引,用户按字母顺序分类,如下所示:
A
乙
等等。
我已经创建了一个自定义的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之前吐出</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和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>';
}
?>
答案 0 :(得分:1)
更好的解决方案是按字母顺序遍历所有用户,并检查每个记录是否第一个字母与最后一个记录的字母不同。如果不同,你会回复新信。
答案 1 :(得分:0)
您正在进行52次数据库调用。用户表是否太大而无法在一个查询中获取所有这些表?另外,我认为计数的顺序是不必要的。我不知道MySQL是否忽略它。
你的问题是get_results每次为count查询返回一个单独的元素数组。所以$ user_count&gt; 0总是返回true。 (我大部分时间都不了解PHP逻辑。数组是否大于零?)。您需要执行类似$ user_count [0]的操作来获取实际数字。