You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:53:50