使用post__in排序WP_Query未得到预期顺序的问题
解决WP_Query post__in顺序与数组不一致的问题
我碰到过不少WPML和WP_Query排序冲突的情况,从你给出的SQL语句一眼就能找到问题所在:
问题诊断
你的WP_Query生成的SQL里,ORDER BY子句是:
ORDER BY wp_posts.menu_order, FIELD(wp_posts.ID, 2959, 919, 914, 1593, 1583, 1974, 1649, 993 ,675)
这里**menu_order的排序优先级高于post__in指定的FIELD顺序**,导致你的数组顺序被覆盖。这种情况大概率是WPML插件(从SQL里的wp_icl_translations关联表能看出你在用WPML)自动添加的排序规则导致的。
解决方案1:强制覆盖排序逻辑
通过posts_orderby过滤器,让目标查询仅按照post__in的数组顺序排序,完全忽略menu_order的影响:
// 定义你的查询参数 $args = array( 'post_type' => 'iw-project', 'post__in' => $array_cases, 'orderby' => 'post__in' ); // 添加过滤器修改排序语句 add_filter('posts_orderby', 'custom_post_in_sort_order', 10, 2); function custom_post_in_sort_order($orderby, $query) { global $wpdb; // 只对我们的自定义查询生效,避免影响其他查询 if ($query->get('post_type') === 'iw-project' && $query->get('orderby') === 'post__in') { $post_ids = implode(',', $query->get('post__in')); $orderby = "FIELD({$wpdb->posts}.ID, {$post_ids})"; } return $orderby; } // 执行查询 $query_cases = new WP_Query($args); // 执行完查询后移除过滤器,防止干扰后续逻辑 remove_filter('posts_orderby', 'custom_post_in_sort_order', 10);
解决方案2:针对WPML调整排序
如果你想保留WPML的其他功能,仅移除它添加的menu_order排序,可以使用WPML专属的wpml_posts_orderby过滤器:
add_filter('wpml_posts_orderby', 'override_wpml_sort_for_projects', 10, 3); function override_wpml_sort_for_projects($orderby, $query, $args) { // 仅针对iw-project类型的post__in查询生效 if ($query->get('post_type') === 'iw-project' && $query->get('orderby') === 'post__in') { global $wpdb; $post_ids = implode(',', $query->get('post__in')); return "FIELD({$wpdb->posts}.ID, {$post_ids})"; } return $orderby; }
验证方式
执行查询后,你可以打印生成的SQL语句确认排序规则是否正确:
echo $query_cases->request;
如果ORDER BY部分只剩下FIELD(wp_posts.ID, 你的数组ID顺序),那么查询结果就会严格按照$array_cases的原始顺序展示了。
内容的提问来源于stack exchange,提问作者drake035
相关产品推荐
相关产品推荐

