1

感谢您的关注

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

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

为了让我解释这个场景和那些回应的人保持简单。我的解释基于一个关于水果的网站。在尝试使用给出的答案时,我希望这对我和其他学习者来说很容易遵循回复并将其集成到他们自己的代码中。

基本结构

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

输出

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

A
苹果

B
香蕉

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

A
苹果
K
猕猴桃
S
草莓

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

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

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

4

2 回答 2

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(); ?>

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

于 2016-04-04T15:54:27.097 回答
0

请使用下面的代码。您应该在您的帖子类型模板中使用以下代码:它真的对我有用......我也测试过这个代码......见截图 1. http://prntscr.com/dxzi22(完整的 A 到 Z)2 . http://prntscr.com/dxziih(全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(); ?>
于 2017-01-20T09:03:51.203 回答