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