【问题标题】:Ordering by "post__in" doesn't work通过“post__in”订购不起作用
【发布时间】:2018-01-29 13:06:59
【问题描述】:

创建帖子 ID 的平面数组后,我想通过自定义查询以与数组中相同的顺序显示这些帖子。 The doc 声明 'post__in' “保留在 'post__in' 数组中给出的帖子 ID 顺序”。然而在我的情况下它没有。为什么?

创建我的帖子 ID 数组:

if (have_rows('cases')):
  while (have_rows('cases')) : the_row();
    $array_cases[] = get_sub_field('case');
  endwhile;
endif;
print_r($array_cases);

结果:

Array(
[0] => 2959
[1] => 919
[2] => 914
...)

WP_Query():

$args = array(
    'post_type' => 'iw-project',
    'post__in' => $array_cases,
    'orderby' => 'post__in');
$query_cases = new WP_Query($args);
print_r($query_cases);

结果:

WP_Query Object(
...
[posts] => Array(
[0] => WP_Post Object (
    [ID] => 2959
    ...)
[1] => WP_Post Object (
    [ID] => 914
    ...)
[2] => WP_Post Object (
    [ID] => 1974
    ...)

结果查询中的顺序错误。第二个和第三个帖子应该是919和914,而不是914和1974。

以下是 Kodos Johnson 请求的 WP_Query 对象的原始 SQL:

SELECT SQL_CALC_FOUND_ROWS  wp_posts.ID FROM wp_posts  JOIN wp_icl_translations t
ON wp_posts.ID = t.element_id
AND t.element_type = CONCAT('post_', wp_posts.post_type)  WHERE 1=1  AND wp_posts.ID IN (2959,919,914,1593,1583,1974,1649,993,675) AND wp_posts.post_type = 'iw-project' AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'acf-disabled') AND ( ( t.language_code = 'en' AND wp_posts.post_type  IN ('post','page','iw-project','iw-contact','iw-slide','iw-client' )  ) OR wp_posts.post_type  NOT  IN ('post','page','iw-project','iw-contact','iw-slide','iw-client' )  )  ORDER BY wp_posts.menu_order, FIELD( wp_posts.ID, 2959,919,914,1593,1583,1974,1649,993,675 ) LIMIT 0, 8

【问题讨论】:

  • 你能确认 919 后在你的结果数组中吗?帖子 919 是否有帖子类型“iw-project”并且它没有被删除?我根本没有在您的结果中看到 919。因此,也许它根本无法与您的查询条件匹配。
  • 好问题。但是,是的,在第 7 位。它确实属于“iw-project”帖子类型。
  • 您能否尝试此处接受的答案发布的所有解决方案,并让我知道它是否有效? wordpress.stackexchange.com/questions/220014/…
  • 我刚刚尝试安装 wordpress 来重现您的问题,但我无法重现它。我的查询正确地保留了 post__in 数组中的帖子顺序(即使没有添加 order 参数)。你能尝试从你的 wp_query 对象中获取原始 sql 吗?您可以通过像这样打印出请求属性来做到这一点:print_r($query_cases->request)。那应该给你原始的SQL。编辑您进入问题的 SQL。
  • @KodosJohnson 谢谢,我编辑了我的问题并添加了原始 SQL

标签: wordpress


【解决方案1】:

如果您查看WP_Query 生成的 SQL 代码,您应该会看到处理订单的这段代码:

ORDER BY wp_posts.menu_order, FIELD( wp_posts.ID, 2959,919,914,1593,1583,1974,1649,993,675 )

这意味着它是通过 wp_posts.menu_order 进行排序的,然后它会根据数组中的帖子 ID (2959,919,914,...) 进行排序。看起来filter 覆盖了WP_Query 结果的默认顺序。这可能是由主题或插件引起的。

解决办法是通过传入参数'suppress_filters' => true来防止其他过滤器修改你的查询。此外,您应该在您的WP_Query 之前致电remove_all_actions('pre_get_posts');。这应该可以防止任何其他过滤器修改您的查询。

感谢 Pieter Goosen over at WP.SE 提出一个非常相似的问题。

【讨论】:

    猜你喜欢
    • 2016-01-16
    • 2014-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-06
    • 2021-10-25
    相关资源
    最近更新 更多