WordPress自定义文章类型归档页如何按两个meta key实现排序?
问题根因
- 仅支持单字段排序:原有代码仅配置了单个meta字段的排序规则,WordPress原生需要通过命名化的meta查询子句实现多meta字段排序。
- 未设置meta的文章丢失:代码中设置
meta_key参数后,WordPress默认会过滤掉没有对应自定义字段的文章,导致未设置两个meta值的文章不显示。
修复后的实现代码
替换原有pre_get_posts钩子代码即可:
function mytheme_category_top_offerta( $query ) { if( ( is_tax('tipi') || is_tax('colori') || is_tax('materiali') || is_tax('stili') || is_post_type_archive('prodotti') ) && !is_admin() && $query->is_main_query() ) { // 声明排序用到的meta字段,不做过滤,保留所有文章 $meta_query = array( 'relation' => 'OR', // 处理offerta字段存在/不存在的情况 'offerta_clause' => array( 'key' => 'prodotti_offerta', 'compare' => 'EXISTS', ), array( 'key' => 'prodotti_offerta', 'compare' => 'NOT EXISTS', 'value' => 'no' ), // 处理top字段存在/不存在的情况 'top_clause' => array( 'key' => 'prodotti_top', 'compare' => 'EXISTS', ), array( 'key' => 'prodotti_top', 'compare' => 'NOT EXISTS', 'value' => 'no' ) ); $query->set( 'meta_query', $meta_query ); // 排序规则:先按offerta倒序,再按top倒序,同优先级按发布时间倒序 $query->set( 'orderby', array( 'offerta_clause' => 'DESC', 'top_clause' => 'DESC', 'date' => 'DESC' ) ); } } add_action( 'pre_get_posts', 'mytheme_category_top_offerta' );
实现效果
- 所有prodotti类型的文章都会正常展示,不会出现遗漏
- 排序优先级:
prodotti_offerta = si的文章最前,其次是prodotti_top = si的文章,其余两个字段为no或未设置的文章排在最后 - 同优先级的文章默认按发布时间倒序排列,可根据需求调整
orderby数组内的规则。
内容的提问来源于stack exchange,提问作者Marco Panichi
相关产品推荐
相关产品推荐

