【问题标题】:Ordering Wordpress posts based on parent category根据父类别排序 Wordpress 帖子
【发布时间】:2012-09-01 13:03:44
【问题描述】:

更新:我尝试使用以下代码:

<?php if (is_category(events)) { 
$posts = query_posts($query_string . '&orderby=event_date&order=desc'); 
} else {
    $posts = query_posts($query_string . '&orderby=title&order=asc'); 
    }
?>

有什么理由不工作吗?按字母顺序组织帖子似乎可以正常工作,但在“事件”中的日期顺序仍然没有运气。

--

在搜索了各种现有问题后,我无法完全找到我正在尝试做的事情的解决方案。

目前我网站上的所有帖子都按字母顺序排列,这很好,除了我添加的一个新类别。对于这个类别,我想按我在自定义字段中输入的值对所有帖子进行排序。该字段称为“event_date” - 所以我想基本上按日期排序帖子,而不是帖子创建的日期,即用户手动输入此字段的日期。

我设法通过使用:

<?php if (is_category($events)) { $posts = query_posts($query_string . '&orderby=$event_date&order=asc'); } ?>

但是,这会覆盖所有其他页面的字母顺序。

对于我使用的字母顺序:

<?php if (is_category()) { $posts = query_posts( $query_string . '&orderby=title&order=asc' ); } ?>

基本上我想要一个声明,告诉页面以 aphabetical 顺序对所有帖子进行排序,除非类别是“事件”,我想按自定义事件日期对它们进行排序。

您可能会说我非常喜欢前端,而不是后端,所以很多这对我来说都是新的,所以任何帮助或建议都非常感谢。

【问题讨论】:

    标签: php wordpress post categories


    【解决方案1】:

    要按自定义字段值排序帖子,您需要将自定义元字段添加到查询本身。 orderby=meta_value 除了meta_key=metafieldid 将允许以这种方式订购。

    如果get_query_var( "cat" )(或类似的查询变量)返回所需的帖子类别,我将使用pre_get_posts hook 并修改查询对象。

    add_action( "pre_get_posts", "custom_event_post_order" );
    
    function custom_event_post_order( $query )
    {
        $queried_category = $query -> get_query_var( "cat" );
    
        /*
         * If the query in question is the template's main query and
         * the category ID matches. You can remove the "is_main_query()"
         * check if you need to have every single query overridden on
         * a page (e.g. secondary queries, internal queries, etc.).
         */
        if ( $query -> is_main_query() && $queried_category == 123 )
        {
            $query -> set( "meta_key", "event_date" ); // Your custom field ID.
            $query -> set( "orderby", "meta_value" ); // Or "meta_value_num".
            $query -> set( "order", "ASC" ); // Or "DESC".
        }
    } 
    

    请记住,这种方法会覆盖所有使用相关类别的查询。您可以构建自定义 WP_Query 对象,这些对象使用自己的参数来构建循环。

    您还应该标准化将自定义字段数据保存到数据库的方式。对于日期,我更喜欢使用易于移动和操作的 UNIX 时间戳格式时间。这样在查询时不会发生意外,并且某些数据以其他方式格式化。

    免责声明:我没有时间测试上面的代码,但总体思路应该可以正常工作。

    编辑:当然上面的代码应该插入到functions.php或类似的通用函数文件中。

    【讨论】:

      【解决方案2】:

      希望我理解您的问题,请使用WP_Query 并在orderby 内按列在您的订单之间添加一个空格:

      $args = array(
          'posts_per_page' => 100,
          'orderby' => 'title',
          'order' => 'ASC',
      );
      
      if(is_category($events)){
          $args['orderby'] .= " meta_value_num";
          $args['meta_key'] = 'event_date';
      }
      
      $posts = (array) new WP_Query( $args );
      

      【讨论】:

      • 我不需要在某处使用 if 语句来告诉事件类别以与其他类别不同的​​方式显示页面吗?
      • 是的,你会的。更新答案
      • 非常感谢您对此提供的帮助,但我仍然无法使用 WP-Query。有什么理由可以使以下内容正确吗?它按字母顺序显示所有类别,但不按日期顺序显示事件?
      • event_date 是帖子的元数据还是添加到帖子表中的额外列?
      • event_date 是用户在创建活动帖子时必须指定的自定义字段之一。这就是我要排序帖子的值,因此最接近日期的事件首先出现。
      【解决方案3】:
      <?php
      $recent = new WP_Query(“cat=ID&showposts=x”);
      while($recent->have_posts()) : $recent->the_post();
      ?>
      

      【讨论】:

        【解决方案4】:

        怎么样:

        <?php $posts = query_posts($query_string . (is_category($events)?'&orderby='.$event_date:'&orderby=title') . '&order=asc');  ?>
        

        【讨论】:

        • 我尝试过使用它,但没有按应有的方式显示。不过感谢您的回复。
        猜你喜欢
        • 2018-05-18
        • 1970-01-01
        • 1970-01-01
        • 2012-01-21
        • 1970-01-01
        • 2013-10-29
        • 1970-01-01
        • 1970-01-01
        • 2014-07-31
        相关资源
        最近更新 更多