WordPress:FacetWP查询orderby数组设置初始加载不生效
问题
我尝试使用数组形式的自定义排序选项,在FacetWP设置→列表的查询标签(开发者模式)中编辑了查询,为文档归档查询的orderby参数定义了一个数组,原本期望该设置在页面初始加载时生效,但发现仅在通过Facet筛选时才生效。
我的查询代码如下:
<?php return [ "post_type" => "document", "post_status" => "publish", "posts_per_page" => 12, 'meta_key' => 'annee', 'orderby' => [ 'meta_value' => 'DESC', 'post_date' => 'DESC', ], ];
前端页面首次加载时,排序设置未生效,控制台调试输出显示:
FWP.settings.debug.query_args.orderby "meta_value"
但点击任意Facet(重新加载数据)后,设置即可正常生效,此时控制台调试输出为:
FWP.settings.debug.query_args.orderby Object { meta_value: "DESC", post_date: "DESC" }
请问为何初始加载时设置不生效?该如何修复?
原因与修复方案
原因
FacetWP在初始页面加载时,会优先读取WordPress原生归档页面的查询参数,而非直接采用开发者模式中定义的数组式orderby配置。原生查询会自动将数组格式的orderby转换为单一字符串(仅保留第一个排序规则),导致初始加载时排序逻辑不完整。而触发Facet筛选的AJAX请求时,FacetWP会直接使用你定义的完整数组查询,因此排序能正常生效。
修复步骤
通过过滤器强制初始加载使用自定义排序
在主题的functions.php文件中添加以下代码,让FacetWP在初始加载时强制应用数组排序规则:add_filter( 'facetwp_query_args', function( $args, $class ) { if ( 'document' === $args['post_type'] ) { // 匹配你的自定义文章类型 $args['meta_key'] = 'annee'; $args['orderby'] = [ 'meta_value' => 'DESC', 'post_date' => 'DESC', ]; } return $args; }, 10, 2 );覆盖原生归档查询的排序规则
如果上述方法无效,可通过pre_get_posts钩子直接修改WordPress主查询,确保初始加载时的排序逻辑正确:add_action( 'pre_get_posts', function( $query ) { if ( is_post_type_archive( 'document' ) && $query->is_main_query() ) { $query->set( 'meta_key', 'annee' ); $query->set( 'orderby', [ 'meta_value' => 'DESC', 'post_date' => 'DESC', ] ); } } );验证修复效果
保存代码后清空网站缓存,刷新页面并查看控制台输出,确认FWP.settings.debug.query_args.orderby显示为包含两个排序规则的对象,而非单一字符串。
内容的提问来源于stack exchange,提问作者Robin Darlington
相关产品推荐
相关产品推荐

