我可以对您的代码说什么:
对于一个页面来说,26个循环确实很多,该页面的加载速度很低,除非您设置了一些缓存。请不要使用query_posts
当调用一次时,它的性能非常糟糕,26次是性能地狱。如果您将分类设置为仅显示此页面,则可以not 需要那种分类法吗?我的建议是:
使用仅执行一个查询WP_Query
例子
$args = array(
\'post_type\' => \'waaier\',
\'posts_per_page\' => -1
);
$query = new WP_Query($args);
此查询将返回waaier类型的所有帖子。
之后,您可以开始循环,将所有帖子保存在助手数组中,以字母顺序排列,只需取帖子的第一个字母:
$by_letter = array();
while( $query->have_posts() ) { $query->the_post();
global $post;
$letter = substr($post->post_name, 0, 1);
if ( ! isset($by_letter[$letter]) ) $by_letter[$letter] = array();
$by_letter[$letter][] = $post;
}
wp_reset_postdata();
完成此循环后,您将获得数组
$by_letter
填充按字母排序的帖子,所以您可以循环此数组以显示帖子:
if ( ! empty( $by_letter ) ) {
ksort($by_letter); // order the array
// fill the array with letters have no posts
$by_letter = fill_by_letter_array( $by_letter );
display_letters_anchors( array_keys( $by_letter ) );
foreach( $by_letter as $letter => $posts ) {
?>
<div id="waaier_<?php echo $letter; ?>" class="waaier_<?php echo $letter; ?>_object">
<?php
if ( ! empty($posts) ) {
foreach ( $posts as $post ) {
setup_postdata($post);
// just an example of post output
echo \'<p><a href="\' . get_permalink() . \'">\' . get_the_title() . \'</a></p>\';
}
} else {
echo \'<p>\' . __(\'Sorry, de letter a bevat nog geen inhoud.\') . \'</p>\';
}
?>
</div>
<?php
}
wp_reset_postdata();
}
在这段代码中,我使用了2个函数
display_letters_anchors
和
fill_by_letter_array
, 首先显示指向每个字母div的链接,然后填充没有贴子的字母的数组。
功能(可插入functions.php
) 应该是这样的:
function display_letters_anchors( $letters ) {
if ( empty($letters) ) return;
echo \'<ul class="waaier_letters_list">\';
foreach ( $letters as $letter ) {
echo \'<li><a href="#waaier_\' . $letter . \'">\';
echo strtoupper($letter) . \'</a></li>\';
}
echo \'</ul>\';
}
function fill_by_letter_array( $by_letter ) {
$keys = range(\'a\', \'z\');
$values = array_fill(0, count($keys), array());
$empty = array_combine($keys, $values);
return wp_parse_args( $by_letter, $empty);
}
这更有效:只需一个查询而不是26个查询,并且您不需要为邮件设置正确的分类法,所有操作都是自动完成的。