WordPress 6.2.2:如何让WP_Query按指定post_type顺序排序
实现WP_Query按指定自定义文章类型顺序排序
针对WordPress 6.2.2版本中,需要让reviews类型内容排在最前,其次是articles,最后是topics的需求,可以通过posts_orderby过滤器结合MySQL的FIELD()函数实现自定义排序逻辑,具体步骤如下:
1. 修改WP_Query参数
在查询中添加一个自定义标记参数,用于后续过滤器识别目标查询:
$query_posts_for_board_game = new WP_Query( array( 'post_type' => ['reviews','articles', 'topics'], 'posts_per_page' => 5, 'meta_query' => array( // 保留你的元查询条件 ), 'custom_post_type_order' => true, // 自定义标记,用于过滤器识别 ) );
2. 添加posts_orderby过滤器
通过过滤器替换默认的排序规则,使用FIELD()函数指定自定义的文章类型排序顺序:
add_filter('posts_orderby', 'custom_post_type_order_by', 10, 2); function custom_post_type_order_by($orderby, $query) { // 仅对标记了custom_post_type_order的查询生效 if (isset($query->query['custom_post_type_order']) && $query->query['custom_post_type_order']) { // 按指定顺序排序:reviews → articles → topics $orderby = "FIELD(post_type, 'reviews', 'articles', 'topics') ASC"; } return $orderby; }
3. 移除过滤器(可选但推荐)
为了避免该排序规则影响其他WP_Query查询,在执行完目标查询后移除过滤器:
// 执行查询后清理过滤器 remove_filter('posts_orderby', 'custom_post_type_order_by', 10);
原理说明
MySQL的FIELD()函数会按照参数中指定的字符串顺序匹配post_type字段值,匹配到的内容会按指定顺序排列,ASC排序会让先指定的类型排在前面,完美实现你需要的reviews→articles→topics的排序逻辑。
内容的提问来源于stack exchange,提问作者commadelimited
相关产品推荐
相关产品推荐

