创建帖子 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)
如果您查看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对一个非常相似的问题的回答。
| 归档时间: |
|
| 查看次数: |
4233 次 |
| 最近记录: |