如何通过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元值的列表项自动排在所有付费计划之后。
验证效果
- 保存
functions.php后,刷新Directorist的商家列表页面。 - 确认Gold会员的商家排在最前,依次是Silver、Bronze、Business,无计划的商家在最后。
内容的提问来源于stack exchange,提问作者MrChoop
相关产品推荐
相关产品推荐

