您当前的查询将按其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
示例帖子,另一篇,另一篇,作为“示例帖子”和“另一篇”,在同一天发布,但“示例帖子”有更多评论。