具有自定义帖子类型分页的帖子的A到Z列表

时间:2016-04-04 14:39:38

标签: wordpress pagination custom-post-type custom-wordpress-pages

感谢您采取行动

我正在寻找一些提供清晰,良好的做法,示例(或链接到现有的)如何创建一个A到Z的帖子列表,其中包含自定义帖子类型的分页基于以下场景的 Wordpress 的最新版本。

我在本网站上发现了两个问题,但都没有明确或明确地回答这个问题。

让我简单地解释一下场景和那些回应。我的解释基于一个关于Fruit的网站。在尝试使用给出的答案时,我希望我和其他学习者能够轻松地按照回复并将其集成到自己的代码中。

基本结构

  • 我创建了一个名为" Fruits "
  • 自定义帖子类型
  • 我在Fruits中创建了一系列帖子,每个帖子都带有帖子标题 特定水果的例如"香蕉"
  • 我创建了一个页面模板,其中包含以下div:<div id="MyAtoZArea" class="MyAtoZStyle"></div>

输出

  • 在div中我希望代码显示所有的列表 自定义帖子类型中的帖子&#34; Fruits&#34;。
  • 我想将输出包装在无序列表<ul>中,每个标题都是不同的列表项<li>
  • 我希望列表按字母顺序排列。
  • 随着Alphabet的每个字母发生变化,我希望它能插入。例如:

A
苹果
杏子
B
香蕉

  • 如果没有适用的帖子,我希望不会显示字母表中的字母。例如:

A
苹果
K
猕猴桃
S
Strawberrys

  • 最后我想展示最多20个帖子,使用分页显示接下来的20个等等。

你能帮忙吗?如果是,请在下面发布。

欢迎所有建设性的指导和意见。

2 个答案:

答案 0 :(得分:0)

我会像下面这样做。您应该在模板中发布以下代码:

<?php
//get the posts first
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args = array(
     'paged' => $paged,
     'posts_per_page' => 20,
     'post_type' => 'fruits',
     'post_status' => 'publish',
     'orderby' => 'title'
);
$fruits = new WP_Query( $args );
?>
<ul>
<?php
//loop through all the posts in the custom query
if( $fruits->have_posts() ) {
  $current_first_letter = '';

  while($fruits->have_posts() ) {
    $fruits->the_post();
    $title = the_title();
    if (is_string($title)) {
        $first_letter = $title[0]   
        //output a first letter list item with a custom class to be styled differently in your css if it is a new first letter     
        if ($first_letter != $current_first_letter) {
            echo '<li class="divider"'> . strtoupper($first_letter) . '</li>';
            $current_first_letter = $first_letter;
        }
    }
    ?>
    <li><?php the_title(); ?></li>
    <?php
  }
}
?>
</ul>

//pagination
<?php if ($fruits->max_num_pages > 1) { // check if the max number of pages is greater than 1  ?>
  <nav class="prev-next-posts">
    <div class="prev-posts-link">
      <?php echo get_next_posts_link( 'Older Entries', $fruits->max_num_pages ); // display older posts link ?>
    </div>
    <div class="next-posts-link">
      <?php echo get_previous_posts_link( 'Newer Entries' ); // display newer posts link ?>
    </div>
  </nav>
<?php } ?>

//restore original post data
<?php wp_reset_postdata(); ?>

您可以轻松更改代码,以便还显示没有帖子的字母标签

答案 1 :(得分:0)

请使用以下代码。你应该在你的帖子类型模板中使用以下代码:它真的对我有用...我也测试了这个代码....见截图1. http://prntscr.com/dxzi22(完整的A到Z)2。{{3 (带有分页的完整A到Z)...你需要做一些CSS ...

<?php
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args = array('paged' => $paged,'posts_per_page' => -1,'post_type' => 'services','post_status' => 'publish','orderby' => 'title','order' => 'asc');
$fruits = new WP_Query($args);
if($fruits->have_posts()){
  $current_first_letter = '';
  $t = array();
  $s = array();
  while($fruits->have_posts()){
    $fruits->the_post();
    $title = get_the_title();
    if(is_string($title)){
        $first_letter = strtoupper($title[0]); 
        if($first_letter != $current_first_letter){
            $t[] = $first_letter;
            $current_first_letter = $first_letter;
        }
    }
    $s[$first_letter][] = get_the_title();
  }
}

$t = array_unique($t);
$tc = count($t);
$sc = count($s);
for($i=0; $i<$tc; $i++){
    ?>
    <div>
        <h4><?php echo $t[$i]; ?></h4>
        <ul>
        <?php
        foreach($s as $key => $value){
            if($key == $t[$i]){
                $vc = count($value);
                for($j=0; $j<$vc; $j++){
        ?>
            <li><?php echo $value[$j]; ?></li>
        <?php
                }
            }
        }
        ?>
        </ul>
    </div>
    <?php
}
if($fruits->max_num_pages > 1){ ?>
  <nav class="prev-next-posts">
    <div class="prev-posts-link">
      <?php echo get_next_posts_link( 'Older Entries', $fruits->max_num_pages ); ?>
    </div>
    <div class="next-posts-link">
      <?php echo get_previous_posts_link( 'Newer Entries' ); ?>
    </div>
  </nav>
<?php } ?>
<?php wp_reset_postdata(); ?>