按“post__in”排序不起作用

时间:2018-01-29 13:07:00

标签: wordpress

创建帖子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

1 个答案:

答案 0 :(得分: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来阻止其他过滤器修改您的查询。另外,您应该在remove_all_actions('pre_get_posts');之前致电WP_Query。这可以防止任何其他过滤器修改您的查询。

对于一个非常相似的问题,归功于Pieter Goosen over at WP.SE