Wordpress帖子按字母顺序排列每个字母

时间:2014-03-11 20:04:42

标签: php wordpress

我需要显示按post_title ACS排序的所有帖子,如下所示:

A
  animal
  angel
  apple
C
  cat
  cinema
  crime
F
  friday
  fire
K
  kill
  king
  .................

等等

因此,如果没有标题以G开头,则G不会像上面那样显示或显示为字母分隔符。 有人可以帮忙吗?

3 个答案:

答案 0 :(得分:2)

我运行查询以获取按帖子标题排序的所有帖子,就像通常使用get_posts一样。然后我会遍历这些并使用substr来获取每个帖子标题的第一个字母。把它做成大写。创建一个新数组。检查字母是否作为数组中的键存在(array_key_exists)。如果需要,添加密钥并将帖子放入其中。按照此过程为您提供易于管理的数组,按字母排序。有没有更简单的方法?可能,但这会奏效。

以下是实现它的代码:

<?php

$posts = get_posts(
    array(
        'post_type' => 'post',
        'post_status' => 'publish',
        'posts_per_page' => -1,
        'orderby' => 'title',
        'order' => 'ASC',
    )
);

$letter_keyed_posts = array();

if ( $posts ) {
    foreach ( $posts as $post ) {
        $first_letter = strtoupper( substr( $post->post_title, 0, 1 ) );

        if ( ! array_key_exists( $first_letter, $letter_keyed_posts ) ) {
            $letter_keyed_posts[ $first_letter ] = array();
        }

        $letter_keyed_posts[ $first_letter ][] = $post;
    }
}

使用$letter_keyed_posts以您需要的格式输出内容。

答案 1 :(得分:0)

虽然Nathan Dawson的代码看起来比下面的代码更准确,但我无法强迫他的代码在我的网站上运行。

我正在使用此代码,它已经可以使用并且适合我:

<?php
$args = array( 'cat' => YOUR_CATEGORY_ID, 'posts_per_page' => -1, 'order'=> 'ASC', 'orderby' => 'title' );
query_posts($args);
if (have_posts()) {
    $current_letter = '';
    while (have_posts()) {
        the_post();
        $title_letter = strtoupper(substr($post->post_title,0,1));
        if ($title_letter != $current_letter) {
            echo "<h3>$title_letter</h3>";
            $current_letter = $title_letter;
        }
?>
<div><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></div>
<?php
    }
}
?>

答案 2 :(得分:0)

这对我来说是完美的工作。

<?php 
$posts = get_posts(
    array(
        'post_type' => 'post',
        'post_status' => 'publish',
        'posts_per_page' => -1,
        'orderby' => 'title',
        'order' => 'ASC',
    )
);
$alphas = range('A', 'Z');
$letter_keyed_posts = array();
if ( $posts ) {
    foreach ( $posts as $post ) {
        $first_letter = strtoupper( substr( $post->post_title, 0, 1 ) );

        if ( ! array_key_exists( $first_letter, $letter_keyed_posts ) ) {

            $letter_keyed_posts[ $first_letter ] = array();
        }

         $letter_keyed_posts[ $first_letter ][] = $post;
    }

}
foreach ($letter_keyed_posts as $key => $value) {
    ?>
    <table class="table">
      <caption><h1 class="text-left">List of --> <?php echo $key; ?></h1></caption>
      <thead>
        <tr>
          <th scope="col">#</th>
          <th scope="col">Title</th>
        </tr>
      </thead>
      <tbody>
        <?php foreach ($value as $val) {
            ?>
            <tr>
              <th scope="row"><?php echo $val->ID; ?></th>
              <td><a href="<?php echo get_permalink( $val->ID ); ?>"><?php echo $val->post_title; ?></a></td>
            </tr>
            <?php
        } ?>
      </tbody>
    </table>
    <?php
}
?>

结果: Output

谢谢[内森·道森,阿米尔·哈姆扎]