对不起,我不知道该怎么称呼它。
我在一个网站上工作,我正在建立一个医生名单,按照姓氏/头衔的字母顺序排列,而属于一封信的所有帖子都应该在下面分组,就像这样:
A
<约翰·阿巴克尔博士
B
<div class="letter_item">
<h2>A</h2>
<ul>
<li><a href="#link">Dr. John Arbuckle</a></li>
<li><a href="#link">Dr. Mack Ancie</a></li>
</ul>
</div>
到目前为止,由于我无法正确关闭它,列表是层叠的(请参见live example链接)。我使用的代码如下所示,因为它检查第一个字母并仅在使用不同字母时插入h2,所以它不能用于包装列表的代码。<div class="section_index grid_12 section_aerzte" id="aerzte">
<?php
$args = array(
\'orderby\' => \'title\',
\'order\' => \'ASC\',
\'post_type\' => \'arzt\',
\'caller_get_posts\' => 1,
\'posts_per_page\' => 20,
);
function mam_posts_orderby ($orderby) {
global $mam_global_orderby;
if ($mam_global_orderby) $orderby = $mam_global_orderby;
return $orderby;
}
add_filter(\'posts_orderby\',\'mam_posts_orderby\');
$mam_global_orderby = "
UPPER(CONCAT(REVERSE(SUBSTRING_INDEX(REVERSE($wpdb->posts.post_title),\' \',1)),$wpdb->posts.post_title))
";
query_posts($args);
if (have_posts()) {
$curr_letter = \'\';
while (have_posts()) {
the_post();
$fullposttile = "$post->post_title";
$words = explode(\' \', $fullposttile);
$lastWord = array_pop($words);
$this_letter = strtoupper(substr($lastWord,0,1));
if ($this_letter != $curr_letter) {
echo "<div class=\'letter_item\'><h2>$this_letter</h2><ul>";
$curr_letter = $this_letter;
}
?>
<li>
<a href="<?php the_permalink() ?>" rel="bookmark"><?php the_title(); ?></a>
</li>
<?php }
}
?>
/** Here it goes wrong, obviously **/
</ul>
</div>
</div>
如果有帮助,测试站点的实例如下http://www.physalis-web.com/aerztegemeinschaft/aerzte . 有没有(更好的)方法来正确包装?非常感谢您的帮助!
最合适的回答,由SO网友:Milo 整理而成
问题是,每次你开始写一封新信时,你都没有关闭前一封信的列表。
在您的支票内if ($this_letter != $curr_letter)
, 在echo
, 您必须添加</ul>
在所有情况下,除非$curr_letter
为空(第一个字母)。
if ($this_letter != $curr_letter) {
if(\'\' != $curr_letter){
echo \'</ul></div>\';
}
echo "<div class=\'letter_item\'><h2>$this_letter</h2><ul>";
$curr_letter = $this_letter;
}