按“post__in”排序不会产生正确的顺序

dra*_*035 4 wordpress

创建帖子 ID 的平面数组后,我想通过自定义查询以与数组中相同的顺序显示这些帖子。该文档指出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);
Run Code Online (Sandbox Code Playgroud)

结果:

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

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);
Run Code Online (Sandbox Code Playgroud)

结果:

Array
(
  [0] => 2959
  [1] => 919
  [2] => 914
  ...
)
Run Code Online (Sandbox Code Playgroud)

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

下面是 WP_Query 对象的原始 SQL:

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

Kod*_*son 7

如果您查看WP_Query您提供的生成的 SQL 代码,您应该注意到这个处理订单的代码片段:

ORDER BY wp_posts.menu_order, FIELD(wp_posts.ID, 2959,919,914,1593,1583,1974,1649,993,675)
Run Code Online (Sandbox Code Playgroud)

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

解决方案是通过传入参数来防止其他过滤器修改您的查询'suppress_filters' => true。另外,您应该remove_all_actions('pre_get_posts');WP_Query. 这应该可以防止任何其他过滤器修改您的查询。

该解决方案的一些功劳归功于WP.SE对一个非常相似的问题的回答。