【发布时间】:2019-09-04 12:44:16
【问题描述】:
我正在尝试使用以下代码按日期对所有帖子进行排序:
$args = array(
'post_type' => array( 'post' ),
'orderby' => 'date',
// 'orderby' => 'post_date',
'order' => 'DESC',
'post_status' => 'publish',
'posts_per_page' => -1,
);
// wp_reset_query();
$query = new wp_query( $args );
while ( $query->have_posts() ) : $query->the_post();
var_dump($query->post->post_date);
endwhile;
根据上面的代码,这就是现在输出结果的方式。注意前四个结果是如何排序的,从第五个结果开始它再次使用。这怎么可能?
我转储了请求,这是 SQL 查询:SELECT wp_posts.* FROM wp_posts WHERE 1=1 AND wp_posts.post_type = 'post' AND ((wp_posts.post_status = 'publish')) ORDER BY wp_posts.post_date DESC
在数据库中运行上述查询时,我得到以下(正确排序的)结果:
起初我以为一定是functions.php中的一些干扰插件或代码。于是我彻底清空了functions.php文件和disabled all plugins,结果还是一样。
我不知道是什么原因造成的,谁能帮帮我?
【问题讨论】:
-
你能在 while 循环之前做一个
var_dump($query->posts);,然后检查帖子在那个时候的顺序是否仍然正确吗? -
同样的结果。这就是我一开始尝试的方法,但很快就注意到排序是如何关闭的。所以我决定只转储每个帖子的
post_date,使其更具可读性。 -
这很奇怪。 WordPress 有修改页面主要查询的钩子——但据我所知,这些钩子不会影响您使用
new wp_query明确地自己进行的任何查询。即使查询参数被外部的任何东西修改 - 这应该反映在你从转储整个查询对象获得的实际 SQL 代码中。 -
你有“置顶帖”吗?我相信默认情况下它们会预先添加到查询结果中。您可以尝试添加:ignore_sticky_posts' => true
-
@DubVader 你是个英雄,这确实是个问题。太感谢了! :)