有没有办法对多个元查询进行多个排序?

时间:2011-09-13 作者:mike23

我正在试验搜索、多准则和排序。假设我们有一个房地产网站,所有帖子都有2个自定义字段(pricesurface), 我们希望访问者能够通过输入:

最低价格,最高价格,最小表面,最大表面,这将完成以下工作:

function mwm_register_search_filters( $query ) {

    // Only on archive post listings    
    if( $query->is_archive ) {

        $filters_a = array();

        if( !empty( $_GET[\'price_min\'] ) ) $filters_a[] = array( \'key\' => \'price\', \'value\' => $_GET[\'price_min\'], \'compare\' => \'>=\', \'type\' => \'numeric\' );
        if( !empty( $_GET[\'price_max\'] ) ) $filters_a[] = array( \'key\' => \'price\', \'value\' => $_GET[\'price_max\'], \'compare\' => \'<=\', \'type\' => \'numeric\' );
        if( !empty( $_GET[\'surface_min\'] ) ) $filters_a[] = array( \'key\' => \'surface\', \'value\' => $_GET[\'surface_min\'], \'compare\' => \'>=\', \'type\' => \'numeric\' );
        if( !empty( $_GET[\'surface_max\'] ) ) $filters_a[] = array( \'key\' => \'surface\', \'value\' => $_GET[\'surface_max\'], \'compare\' => \'<=\', \'type\' => \'numeric\' );

        if( !empty( $filters_a ) ) $query->set( \'meta_query\' , $filters_a );

    }

    return $query;
}
add_filter( \'pre_get_posts\' , \'mwm_register_search_filters\' );
这很好,而且效果很好。但接下来是订购。。

AFAIK Wordpress只允许按一个meta\\u键/meta\\u值排序。这很好,但当您需要按多个标准排序时,这还不够好。是否有订购方式,例如:

首先按价格ASC订购,在同等价格范围内,按表面ASC订购

1 个回复
SO网友:Matthew Boynes

从WordPress 3.4.1开始,没有现成的方法可以按多个元数据排序。

既然我们不能干净利落地做这件事,我们就必须一起解决一些问题。我们可以加入posts_orderby 手动修改订单。这并不完全漂亮,但它会把工作做好的。下面是一个示例:

add_filter(\'posts_orderby\', \'wpse_28390_orderby\' );
function wpse_28390_orderby( $orderby ) {
    return str_replace(\'postmeta.meta_value\', \'postmeta.meta_value, mt1.meta_value ASC\', $orderby);
}
最重要的是,这假设“surface”是查询中的第二个meta\\u键(这就是mt1的来源;mt1是第二个meta键,mt2是第三个,依此类推),在您的情况下,这并不总是正确的。因此add_filter 通话应经过三次检查:

如果这是与此相关的页面surface 正在查询meta\\u键(如果存在$\\u GET参数),以及surface meta\\u键位于连接序列中,然后调整mt1 因此,这是janky,但同样有效。

结束

相关推荐

Orderby字段-可用选项列表?

我想按照页面属性的“顺序”字段对项目进行排序(参见pic)。我遇到过各种各样的“定制标签”解决方案,但没有一个列出了orderby可以使用的所有可用字段。我想使用编辑器中显示的“顺序”字段。我尝试用“order”替换模板中的orderby字段,但没有看到任何结果。我当前正在使用:post_type=projects&order=ASC&orderby=order&offset=1&posts_per_page=100