【问题标题】:WordPress WP_Query results not properly sorted by date?WordPress WP_Query 结果未按日期正确排序?
【发布时间】: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;

根据上面的代码,这就是现在输出结果的方式。注意前四个结果是如何排序的,从第五个结果开始它再次使用。这怎么可能?

HTML output

我转储了请求,这是 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

在数据库中运行上述查询时,我得到以下(正确排序的)结果:

DB SQL query

起初我以为一定是functions.php中的一些干扰插件或代码。于是我彻底清空了functions.php文件和disabled all plugins,结果还是一样。

我不知道是什么原因造成的,谁能帮帮我?

【问题讨论】:

  • 你能在 while 循环之前做一个var_dump($query->posts);,然后检查帖子在那个时候的顺序是否仍然正确吗?
  • 同样的结果。这就是我一开始尝试的方法,但很快就注意到排序是如何关闭的。所以我决定只转储每个帖子的post_date,使其更具可读性。
  • 这很奇怪。 WordPress 有修改页面主要查询的钩子——但据我所知,这些钩子不会影响您使用new wp_query 明确地自己进行的任何查询。即使查询参数被外部的任何东西修改 - 这应该反映在你从转储整个查询对象获得的实际 SQL 代码中。
  • 你有“置顶帖”吗?我相信默认情况下它们会预先添加到查询结果中。您可以尝试添加:ignore_sticky_posts' => true
  • @DubVader 你是个英雄,这确实是个问题。太感谢了! :)

标签: php sql wordpress


【解决方案1】:

感谢@DubVader,问题是“置顶帖”。

通过将'ignore_sticky_posts' => true 添加到查询参数来解决问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 2016-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多