我正在试验搜索、多准则和排序。假设我们有一个房地产网站,所有帖子都有2个自定义字段(price
和surface
), 我们希望访问者能够通过输入:
最低价格,最高价格,最小表面,最大表面,这将完成以下工作:
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订购
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,但同样有效。