获取按字母顺序排列的帖子列表,在字母上单击两个字母

时间:2013-07-29 作者:Johan

我在中有一个网站Wordpress 还有一个页面,上面有这样的字母列表:

A B C D E F G H I ...
这显示了所有以字母A为例的帖子。这很好,但我想让我的用户更容易使用,所以我想Ab 如果我点击A, 在此列表下方。另一个例子:我想Dc 所有以字母Dc开头的帖子,如果我点击D. 我知道,制作包含字母和函数的26页是可能的,但必须有一种更简单的方法来做到这一点。

此外,这么简单的事情我不想要26页。这将影响SEO.

有人能帮我解决这个问题吗?

1 个回复
最合适的回答,由SO网友:gmazzap 整理而成

也许我不明白你的问题,在这种情况下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 &quot;\' . $letter . \'&quot; 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开发人员,也许有一种更优雅/性能更好的方法来做同样的事情。。。

当然,这不是页面的完整代码,只是相关部分。

希望有帮助。

结束

相关推荐

在PHP中更改_POST_THMBILITH的PUT

我是PHP的新手。我已经把wordpress弄糟了,但并没有真正弄糟它背后的代码。我正在努力加快wordpress网站的加载速度,但我遇到了一些问题。PHP使用the_post_thumbnail 加载一些帖子图片的HTML代码。我有这个代码来延迟加载图像,这样页面可以先加载,然后再加载图像:jQuery(window).load(function() { jQuery(\'img[source]\').prepend(function(){ var source = jQuery