如何按类别划分帖子?

时间:2018-08-08 作者:Mais_Cule

我有一个名为“投资”的CPT,我想按类别显示该CPT中的所有帖子。我是通过短代码来实现的。

e.g. [myshortcode type_of_post="investment" cat="12,30"]
我希望它显示如下帖子

Category 12

  • post1
  • post2
    • Category 30

      <我现在的问题是,它显示了所有的帖子,但我很难按类别将帖子分开。

      现在就是这样

      这是我的代码

        // define attributes
          extract( shortcode_atts( array (
              \'cat\'   => \'\',
              \'type_of_post\' => \'\',
              \'orderby\' => \'date\',
          ), $atts ) );
      
      独立岗位

      if($type_of_post){
          $args[\'post_type\'] = $type_of_post;
      }
      if($cat) {
          $args[\'category__in\'] = array_map(\'intval\',explode(\',\',$cat));
      }
      
      查询

          $query = new WP_Query( $args );
      
          if( $query->have_posts() ){
              echo "<div class=\'row col-div investment\'>";
              while( $query->have_posts() ){
                  $query->the_post();
                  $id = get_the_ID();
                  $page = get_post($id);
                  $image = get_the_post_thumbnail_url($id);
      
                 display_layout($page,$image); //calls the function below
              }
              echo \'</div>\';
      }
      
      显示立柱

      function display_layout($page,$image) {
          echo "<div class=\'col-sm-6  pair-cards\'>
                  <div class=\'sub-div\'>
                      <div class=\'card-img\'>
                      <a href=\'$page->post_name\'><img src=\'$image\' alt=\'$page->post_name\'  /></a>
                      </div>".
                          "<div class=\'entry-title\'><a href=\'$page->post_name\'>" .  $page->post_title  .  "</a></div>
                      <div class=\'card-desc\'>".
                          "<p>" . strip_tags($page->post_excerpt) ."</p>
                      </div>
                      <div class=\'read-more\'>
                          <a href=\'$page->post_name\'> Read More </a>
                      </div>
                  </div>
              </div>";
      }
      
      我希望我已经把我的问题解释清楚了。

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

在循环中,您将希望获得posts术语。然后,返回输出并将其分组到一个数组中,其中键是类别,而不是回显。然后在分组数组中循环并输出您的类别和相关帖子。类似于:

// to hold and sort your output
$categories = array();

// loop through posts
while( $query->have_posts() ){

    // get the posts terms
    $terms = wp_get_post_terms(..
    $firstTerm = $terms[0];

    // see if the first term is defined in our holder
    if (!isset($categories[$firstTerm->name])) {
        $categories[$firstTerm->name] = array();
    }

    // ..

    $categories[$firstTerm->name][] = display_layout($page,$image);
}
您的display_layout() 功能将return 您的html而不是echoing。

然后你会循环通过$categories 对于您的输出:

foreach ($categories as $catName => $catItems) {
    echo "<strong>{$catName}</strong>";
    foreach ($catItems as $catItem) {
        echo $catItem;
    }
}
这不是一个复制/粘贴答案,它只是一个在数组中存储和排序值的逻辑想法-请记住,您需要:

使用比“第一项”更好的逻辑,因为第一项不一定是1230 (除非你每个帖子只写了一个术语,但这仍然会留下很高的人为错误概率),你会想遍历所有术语,看看它是否包含$cat 值为数组键使用ID而不是字符串,$firstTerm->term_id 而不是$firstTerm->name, 查找传递名称值的不同方式

  • 将其打包到缓存中,这样每次页面加载都不会进行大量查询

  • 结束

    相关推荐

    Categories manage

    我正在尝试向CPT中添加特定类别,只有在添加新帖子时,您才能看到与这些帖子类型相关的类别。此外,我希望能够从后端添加类别,而不是从代码添加类别,因为我有很多类别将要更改。如果有一个插件可以做到这一点,那很好,但我也希望了解它是如何做到的。非常感谢