是否按分类术语对帖子列表进行排序?

时间:2015-11-25 作者:Nimara

我想知道如何编写代码,按照自定义分类法中的术语排列帖子列表?

Here is what I have so far:

我有一个页面,在一个页面上以自定义帖子类型列出所有帖子

  • 我允许CPT帖子按Alpha、ASC和DESC进行排序。
    • 最后,看起来是这样的:enter image description here

      The Goal:

      我想添加一些链接与“按标题排序”的链接,我已经有了。

      具体来说,我想按(alpha)导演、工作室和剧集排序,因为我知道这些是字符串或数字。

      我还想按首播季、按年份订购,但我可能需要改变这些术语的命名方式(可能只会以目前的方式列出2011年冬季、2012年冬季)。

      按流派分类是另一个我完全不打算解决的问题,因为有多个术语。

      我不太确定该怎么做,可能需要帮助。

      The Page\'s Current Code:

      <div class="content-container">
      <a href="?sort=titleup">Sort By Title A-Z</a>
      <a href="?sort=titledown">Sort By Title Z-A</a>
      <hr>
      
      <?php
      $type = \'animes\';
      $args=array(
      \'post_type\' => $type,
      \'post_status\' => \'publish\',
      \'posts_per_page\' => -1,
      \'caller_get_posts\'=> 1
      );
      
      if( isset( $_GET[\'sort\'] ) && "titleup" == $_GET[\'sort\'] ){
      $args[\'orderby\'] = \'title\';
      $args[\'order\'] = \'ASC\';
      }
      
      if( isset( $_GET[\'sort\'] ) && "titledown" == $_GET[\'sort\'] ){
      $args[\'orderby\'] = \'title\';
      $args[\'order\'] = \'DESC\';
      }
      
      $my_query = new WP_Query($args);
      if( $my_query->have_posts() ) {
      while ($my_query->have_posts()) : $my_query->the_post(); ?>
      <div class="anime-title"><a href="<?php the_permalink() ?>" title="<?php the_title_attribute(); ?> Page"><?php the_title(); ?></a></div>
      
      <br><span>Director:</span>
      <?php 
      $taxonomy = \'director\';
      // get the term IDs assigned to post.
      $post_terms = wp_get_object_terms( $post->ID, $taxonomy, array( \'fields\' => \'ids\' ) );
      // separator between links
      $separator = \', \';
      
      if ( !empty( $post_terms ) && !is_wp_error( $post_terms ) ) {
      
      $term_ids = implode( \',\' , $post_terms );
      $terms = wp_list_categories( \'title_li=&style=none&echo=0&taxonomy=\' . $taxonomy . \'&include=\' . $term_ids );
      $terms = rtrim( trim( str_replace( \'<br />\',  $separator, $terms ) ), $separator );
      
      // display post categories
      echo  $terms;
      }
      ?>
      
      <br><span>Studio:</span>
      <?php 
      $taxonomy = \'studio\';
      // get the term IDs assigned to post.
      $post_terms = wp_get_object_terms( $post->ID, $taxonomy, array( \'fields\' => \'ids\' ) );
      // separator between links
      $separator = \', \';
      
      if ( !empty( $post_terms ) && !is_wp_error( $post_terms ) ) {
      
      $term_ids = implode( \',\' , $post_terms );
      $terms = wp_list_categories( \'title_li=&style=none&echo=0&taxonomy=\' . $taxonomy . \'&include=\' . $term_ids );
      $terms = rtrim( trim( str_replace( \'<br />\',  $separator, $terms ) ), $separator );
      
      // display post categories
      echo  $terms;
      }
      ?>
      
      <br><span>Season Premiered:</span>
      <?php 
      $taxonomy = \'season\';
      // get the term IDs assigned to post.
      $post_terms = wp_get_object_terms( $post->ID, $taxonomy, array( \'fields\' => \'ids\' ) );
      // separator between links
      $separator = \', \';
      
      if ( !empty( $post_terms ) && !is_wp_error( $post_terms ) ) {
      
      $term_ids = implode( \',\' , $post_terms );
      $terms = wp_list_categories( \'title_li=&style=none&echo=0&taxonomy=\' . $taxonomy . \'&include=\' . $term_ids );
      $terms = rtrim( trim( str_replace( \'<br />\',  $separator, $terms ) ), $separator );
      
      // display post categories
      echo  $terms;
      }
      ?>
      
      <br><span>Episodes:</span>
      <?php 
      $taxonomy = \'episodes\';
      // get the term IDs assigned to post.
      $post_terms = wp_get_object_terms( $post->ID, $taxonomy, array( \'fields\' => \'ids\' ) );
      // separator between links
      $separator = \', \';
      
      if ( !empty( $post_terms ) && !is_wp_error( $post_terms ) ) {
      
      $term_ids = implode( \',\' , $post_terms );
      $terms = wp_list_categories( \'title_li=&style=none&echo=0&taxonomy=\' . $taxonomy . \'&include=\' . $term_ids );
      $terms = rtrim( trim( str_replace( \'<br />\',  $separator, $terms ) ), $separator );
      
      // display post categories
      echo  $terms;
      }
       ?>
      
      
      <br><span>Genres:</span>
      <?php 
      $taxonomy = \'genre\';
      // get the term IDs assigned to post.
      $post_terms = wp_get_object_terms( $post->ID, $taxonomy, array( \'fields\' => \'ids\' ) );
      // separator between links
      $separator = \', \';
      
      if ( !empty( $post_terms ) && !is_wp_error( $post_terms ) ) {
      
      $term_ids = implode( \',\' , $post_terms );
      $terms = wp_list_categories( \'title_li=&style=none&echo=0&taxonomy=\' . $taxonomy . \'&include=\' . $term_ids );
      $terms = rtrim( trim( str_replace( \'<br />\',  $separator, $terms ) ), $separator );
      
      // display post categories
      echo  $terms;
      }
      ?>
      <hr>
      
      <?php
      endwhile;
      }
      wp_reset_query();  // Restore global post data stomped by the_post().
      ?>
      
      Other Information:

      单击该节目的标题后,读者将进入另一个页面,该页面显示该节目的图像、再次列出的自定义分类法以及与该节目相关的所有其他帖子(通过标签连接为该节目的名称)。e、 如果有一篇评论或讨论贴上了“男孩和女孩”的标签,它会出现在这个页面上。

      单击分类术语后,读者将进入列出与该术语相关的所有显示的页面。e、 g,该工作室制作的所有节目,所有12集的节目,所有“动作”类型的节目。

      上述内容可能会对我如何设置它的总体结构产生疑问。我对web开发和wordpress非常陌生,所以我在所做研究的基础上尽了最大努力。

      我还有一些其他未回复的堆栈交换帖子,它们深入讨论了关于构建网站这一部分的细节和问题。我们也非常感谢您的帮助,或者如果您需要进一步澄清我的尝试。

      Custom Post Type and Taxonomies Structure

      Creating a Sortable Table by Taxonomy Terms

      非常感谢您的时间和迄今为止给我的帮助。

    2 个回复
    最合适的回答,由SO网友:Rarst 整理而成

    WordPress核心(由相关人员在多个场合表达)强烈反对按术语排序。它将术语视为排他性分组机制,没有隐含的排序功能。

    因此,在您的具体情况下,WP会理解有不同的导演,这些导演会有多组演出,但根本不会理解,对于指派的导演会如何影响演出顺序,会有一些预期。

    当然,在实际开发中,人们确实需要在不同的情况下按术语进行排序。实际上,这意味着需要一些非常定制的SQL来实现。

    我所知道的最有用的实现示例之一包括Sortable Taxonomy Columns 博客帖子。

    因此,要做到这一点,您必须编写/修改必要的SQL,然后将其合并到查询中。

    SO网友:tao

    虽然Rarst\'s answer 是正确的、有帮助的,并且确实为您提供了提高对主题理解的空间,这是通过custom_post_meta 是:

    $args = array(
        \'meta_key\' => \'name\',  //custom field name here
        \'orderby\' => \'meta_value\', 
        \'order\' => \'ASC\') // the sort order
        // the rest of your arguments here...
    );
    
    如果您需要自定义排序顺序,而不是ASCDESC, 你需要建立一个custom Query.

    更新:我的答案与这个问题无关。我只是看错了。很抱歉

    不过,我不会删除它,因为这些评论对那些还没有决定使用custom_post_metataxonomy 对于某个属性。正如Rarst所指出的,使用Scribu的查询(第3版,改进版),可以按照分类术语进行排序。但你应该避免这样做,因为这会影响你的查询速度。

    使用terms 分组和meta 排序。即使有很多条目,你的网站速度也会快得多。

    相关推荐

    Sort / Filter Queries

    我正在开发一个展示产品的网站,现在我正在开发查询部分。基本上,我希望有一个页面,作为普通查询显示产品列表,然后在页面顶部有几个按钮,可以选择按名称、价格排序,还有一个下拉列表,其中包含品牌和东西等分类法。我可以让一个查询显示我想要的信息,但我不能将所有我想要的东西组合在一个页面中,因为PHP不能跟踪按钮被点击的时间,然后使用if语句,而且我不是专家,我不能再进一步了。有没有一种简单的方法来做我想做的事?Wihtout java或ajax。。。我只想要一个加载了标准查询的页面(我这样做了),然后当有人单击按