也许我不明白你的问题,在这种情况下sorry, 我的英语远非完美。
据我所知,您有一个显示信件列表的页面模板,当您单击信件时,同一页面会显示“post\\u title”以该信件开头的帖子列表。
现在,您希望在显示该列表时,可以使用2个字母而不是1个字母筛选帖子,其中第一个字母是之前选择的字母。
是这样吗?如果是这样,这应该可以:
<?php
/**
* Template Name: Capital Template
*/
get_header();
the_post();
$page_link = get_permalink();
$letter = isset($_GET[\'letter\']) ? $_GET[\'letter\'] : null;
// limit the \'letter\' param to 2 chars
if ( $letter && strlen($_GET[\'letter\'])>2 ) $letter = substr($letter, 0, 2);
?>
<?php
// PAGE FILTERS PART
$letters = array(\'A\',\'B\',\'C\',\'D\',\'E\',\'F\',\'G\',\'H\',\'I\',\'J\',\'K\',\'L\',\'M\',
\'N\', \'O\',\'P\',\'Q\',\'R\',\'S\',\'T\',\'U\',\'V\',\'W\',\'X\',\'W\',\'Z\');
if ( ! $letter ) {
// adjust the query args to fit your needs
$args = array(\'posts_per_page\' => 50, \'orderby\' => \'post_title\', \'order\' => \'ASC\');
$posts = get_posts($args);
} else {
global $wpdb;
// adjust the query to fit your needs
$posts = $wpdb->get_results( $wpdb->prepare(
"SELECT * FROM $wpdb->posts WHERE
post_type = \'post\' AND post_status = \'publish\' AND
post_title LIKE %s ORDER BY post_title ASC",
$letter . \'%\'
) );
}
echo \'<ul>\';
foreach ( $letters as $l) {
$param = $letter ? $letter.$l : $l;
printf(\'<li><a href="%s?letter=%s">%s</a></li>\',$page_link, $param, $param);
}
echo \'</ul>\';
if ($letter) {
printf(\'<p id="#filter-remover"><a href="%s?letter=%s">%s</a>\',
$page_link, $letter,
__(\'Back to capital letter "\' . $letter . \'" filter\')
);
printf(\', <a href="%s">%s</a><p>\',
$page_link,
__(\'or remove capital letter filter at all.\')
);
}
?>
<?php
// PAGE CONTENT PART
global $post;
if ( ! empty($posts) ) :
foreach ($posts as $post) {
setup_postdata($post);
?>
<?php /* YOUR LOOP CODE HERE */ ?>
<p><?php the_title(); ?></p>
<?php
}
else :
echo \'<p>\';
_e(\'Sorry, no posts match your criteria.\');
if ( $letter ) {
printf(\'<br /><a href="%s">%s</a>\',
$page_link,
__(\'Try to remove the capital letter filter.\')
);
}
echo \'</p>\';
endif;
wp_reset_postdata();
get_footer();
编辑:jquery技巧上面代码的一个错误是,即使没有帖子,过滤器也会显示所有大写字母:如果过滤器“A”没有帖子,那么“AB”、“AC”等也不会有帖子,为什么要显示它们?使用php,您可以循环帖子并只放置有机会获得一些结果的过滤器,但这意味着要循环2次。我认为有一个更好的解决方案:jQuery。
注意:只有在查询显示所有posts, 或者更好的是,所有你想过滤掉的帖子(即没有LIMIT
sql查询中的子句)
首先,在“过滤器”部分中,更改foreach循环:
echo \'<ul class="letter-filters">\';
foreach ( $letters as $l) {
$param = $letter ? $letter.$l : $l;
printf(\'<li><a href="%s?letter=%s" class="letter-filter">%s</a></li>\',
$page_link, $param, $param
);
}
echo \'</ul>\';
然后在循环代码部分中,使用如下内容:
<?php
echo \'<div id="posts-container" data-letter="\' . $letter. \'">\';
if ( ! empty($posts) ) :
foreach ($posts as $post) {
setup_postdata($post);
/* YOUR LOOP CODE */
$datacapital = $letter ? strtoupper( substr(get_the_title(), 0, strlen($letter)+1 ) ) : \'\';
?>
<div class="post" id="post-<?php the_ID()?>" data-capital="<?php echo $datacapital; ?>">
<p><?php the_title(); ?></p>
</div>
...
endif;
echo \'</div>\';
wp_reset_postdata();
最后,jQuery代码:
<script>
// please, do not use jquery like so,
// register and enqueue it like every WP developer should do :)
// this is for semplicity of answer
jQuery().ready(function($) {
if ( $(\'#posts-container\').data(\'letter\') != \'\' ) {
var oldcapital = null;
$(\'ul.letter-filters li\').hide();
$(\'.post\').each(function() {
var capital = $(this).data(\'capital\');
if ( ! oldcapital || (oldcapital != capital) ) {
oldcapital = capital;
$(\'a.letter-filter\').each(function() {
if ( $(this).text() == capital ) $(this).parent().show();
});
}
});
}
});
</script>
请注意,我不是一个js/jquery开发人员,也许有一种更优雅/性能更好的方法来做同样的事情。。。
当然,这不是页面的完整代码,只是相关部分。
希望有帮助。