WordPress:查询按父标题排序

时间:2017-03-25 22:08:06

标签: php wordpress

我正在使用我主题中的一些自定义WordPress查询。它们都很好用,除了通过帖子标题对它们进行排序之外,我需要按照父母的帖子标题按字母顺序对它们进行排序。

似乎没有'orderby'的默认参数来完成此任务,但我知道必须有一种方法可以完成它。

我的查询返回的所有帖子都是子帖子,所以他们都有父母。

仅供参考,这是一个显示我的格式的示例查询。也许我有CPT'书籍',每本书都有第1章,第2章等的帖子。如果我想列出每本书的所有“第1章”帖子,按书名按字母顺序排序:

// List Chapter 1 for all Books

function query_ch1() {
  global $post;
  $args = array(
    'post_type'      => 'book',
    'name'           => 'chapter-1',
    'posts_per_page' => '-1',
    'order'          => 'ASC',
    'orderby'        => 'title'
  );
  $query_ch1 = new WP_Query( $args );
  if ( $query_ch1->have_posts() ) {
    while ( $query_ch1->have_posts() ) {
        $query_ch1->the_post();
        echo '<div class="col-xs-12">';
        echo '<a href="'.get_permalink().'" title="'.get_the_title().'">';
        echo get_the_title();
        echo '</a>';
        echo '</div>';
    }
    wp_reset_postdata();
  }
}

然而,这当然会列出所有第1章的帖子,而不是父母的帖子。

非常感谢任何帮助,提前谢谢!

2 个答案:

答案 0 :(得分:1)

这是你可以尝试的:

  • 使用get_posts($args)
  • 等查询所有帖子
  • 开始构建数组:$parents = [];
  • 循环播放所有帖子,并使用$parentTitle = get_the_title($post->post_parent)
  • 之类的内容获取其标题
  • 将帖子添加到$parents中的父密钥。类似于:$parents[$parentTitle][] = $post;
  • 现在我认为您应该能够ksort($parents);根据密钥对$parents数组进行排序。

现在,您可以遍历$parents,然后遍历其posts

foreach ($parents as $posts) {

    foreach ($posts as $post)
        // Do stuff
    }

}

答案 1 :(得分:0)

我不确定这是否是理想的做法(就效率等而言),但经过大量的实验后,我最终得到了预期的效果。

使用原始帖子中的示例,它将是:

// List Chapter 1 for all Books

function query_ch1() {
  global $post;
  $args = array(
    'post_type'      => 'book',
    'post_parent'    => '0',
    'posts_per_page' => '-1',
    'order'          => 'ASC',
    'orderby'        => 'title'
  );
  $query_ch1 = new WP_Query( $args );
  if ( $query_ch1->have_posts() ) {
    while ( $query_ch1->have_posts() ) {
      $query_ch1->the_post();
      $children = get_children( array( 'post_parent' => $post->ID, 'name' => 'chapter-1' ) );
      foreach ( $children as $post ) {
        echo '<div class="col-xs-12">';
        echo '<a href="'.get_permalink().'" title="'.get_the_title().'">';
        echo get_the_title();
        echo '</a>';
        echo '</div>';
      }
    }
    wp_reset_postdata();
  }
}

所以在阅读了Melvin Koopmans的建议之后,我改变了我的查询以拉出顶级页面而不是孩子,以便他们被正确排序,然后嵌套get_children()和foreach($ children as $ post)来做东西。