如何按日期和评论从类别中对帖子进行排序?

时间:2016-03-30 作者:Michał Kalkowski

就像在主题中一样,我尝试按日期和注释计数从类别中排序帖子,但下面的代码不起作用:

<?php

//get post from current category
$category       = get_the_category();
$category_ID    = $category[0]->term_id;
$args = array(
    \'cat\'               => $category_ID,
    //limit posts to 3
    \'posts_per_page\'    => 3,
    \'ignore_sticky_posts\'   => true,
    //order post by date and comments
    \'orderby\' => array(
        \'date\'          => \'DESC\',
        \'comment_count\' => \'DESC\',
    ),

);
$the_query = new WP_Query($args);
?>
帖子只按日期排序

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

您当前的查询将按其post_date 属性,它是以下类型的SQL列datetime. 此类型存储日期,但也存储时间(小时、分钟和秒)。第二个排序选项,comment_count, 仅适用于具有相同时间戳的帖子,即在同一秒发布的帖子。

因此,问题的解决方案是按post日期排序,而不是按datetime排序。为此,您可以过滤orderby 查询中的部件WP_Query 使用过滤器posts_orderby. 使用此筛选器,可以替换SQLORDER 子句使用日期而不是日期时间。

下面的代码就是这样做的:它向过滤器添加了一个函数posts_orderby 取代了{$wpdb->posts}.post_date (例如。wp_posts.post_date) 通过CAST({$wpdb->posts}.post_date AS DATE), 将datetime字段强制转换为YYYY-MM-DD 总体安排执行查询后,它将删除过滤器,确保其他查询不受影响。

function wpse222104_query_orderby_day( $orderby, $query ) {
    global $wpdb;

    return str_replace( "{$wpdb->posts}.post_date", "CAST({$wpdb->posts}.post_date AS DATE)", $orderby );
}

// Add the filter to change the ORDER clause
add_filter( \'posts_orderby\', \'wpse222104_query_orderby_day\', 10, 2 );

// Run the query with the filters
$query = new WP_Query( $args );

// Remove the filter
remove_filter( \'posts_orderby\', \'wpse222104_query_orderby_day\' );
这假设相同$args 你已经拥有了:他们没有什么问题。

测试代码显示ORDER BY 子句已正确更改:原始子句为

wp_posts.post_date DESC, wp_posts.comment_count DESC
而新的是

CAST(wp_posts.post_date AS DATE) DESC, wp_posts.comment_count DESC
排序时现在将不考虑帖子发布的准确时间:只考虑发布的日期。例如,考虑以下帖子:

Title           Date                    Comment count
Example Post    2014-12-16 10:12:16     6
Another one     2014-12-16 21:50:07     4
Yet Another     2012-08-02 11:15:20     25
在这里,您的原始查询将按顺序返回帖子

另一个示例post,另一个示例post,而新代码将按顺序返回post

示例帖子,另一篇,另一篇,作为“示例帖子”和“另一篇”,在同一天发布,但“示例帖子”有更多评论。

SO网友:Max Yudin

看起来您正在使用pre-4。WordPress的x版本。旧版本不支持array()orderby 价值使用\'orderby\' => \'date comment_count\' 而是:

<?php
$category       = get_the_category();
$category_ID    = $category[0]->term_id;
$args = array(
    \'cat\'                 => $category_ID,
    \'posts_per_page\'      => 3,
    \'ignore_sticky_posts\' => true,
    \'orderby\'             => \'date comment_count\', // date is primary
    \'order\'               => \'DESC\' // not required because it\'s the default value
);
$the_query = new WP_Query($args);
?>

相关推荐

WP_QUERY ORDERBY不适用于META_KEY

我想在我的档案馆按“leasenum”订购这篇文章。php。我想过滤特定的“商城”。结果集正确,但顺序错误。只有在删除“meta\\u键”时,orderby才起作用meta\\u值\'。$args = array( \'post_type\' => \'shop\', \'meta_key\' => \'mall\', \'meta_value\' => $getvalue,