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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 15:21:03