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

如何通过pre_get_posts调整Directorist插件自定义文章类型查询排序

解决Directorist自定义文章类型按会员计划排序的问题

问题分析

你之前的代码导致404是因为没有限制修改查询的场景,直接对所有WP_Query实例修改post_type和排序参数,干扰了其他页面的正常查询逻辑。同时默认的meta_value排序无法精准匹配你需要的Gold→Silver→Bronze→Business的固定顺序,需要针对性调整。

修正后的代码

将以下代码替换你之前的排序函数,添加到主题的functions.php中:

function custom_directorist_sort_by_plan( $query ) {
    // 仅修改主查询,且是Directorist自定义文章类型的存档页面
    if ( ! is_admin() && $query->is_main_query() && is_post_type_archive( ATBDP_POST_TYPE ) ) {
        // 设置排序规则:按_fm_plans元值排序,同时指定固定顺序
        $query->set( 'meta_key', '_fm_plans' );
        // 使用meta_value_num确保按数字ID排序,而非字符串
        $query->set( 'orderby', 'meta_value_num' );
        // ASC顺序对应13713(Gold)→13714(Silver)→13715(Bronze)→13716(Business)
        $query->set( 'order', 'ASC' );
        // 确保没有该元值的列表项排在最后
        $query->set( 'meta_query', array(
            'relation' => 'OR',
            array(
                'key'     => '_fm_plans',
                'compare' => 'EXISTS',
            ),
            array(
                'key'     => '_fm_plans',
                'compare' => 'NOT EXISTS',
            ),
        ) );
    }
    return $query;
}
add_action( 'pre_get_posts', 'custom_directorist_sort_by_plan' );

如果ATBDP_POST_TYPE常量未正确加载,可直接替换为字符串'at_biz_dir':

is_post_type_archive( 'at_biz_dir' )

关键优化点

  • 限制查询修改范围:通过!is_admin()避免影响后台查询,$query->is_main_query()确保只修改前台主查询,is_post_type_archive()仅针对Directorist的存档页面,彻底解决404问题。
  • 精准排序逻辑:使用meta_value_num保证按数字ID排序,避免字符串排序的异常(比如"13713"和"1371"的字符串排序问题)。
  • 处理无元值的情况:通过meta_query将没有_fm_plans元值的列表项自动排在所有付费计划之后。

验证效果

  1. 保存functions.php后,刷新Directorist的商家列表页面。
  2. 确认Gold会员的商家排在最前,依次是Silver、Bronze、Business,无计划的商家在最后。

内容的提问来源于stack exchange,提问作者MrChoop

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 02:52:30