使用Orderby和meta_value_num首先对数字进行排序,然后对字符串进行排序


16

我有一个产品列表,每个产品的价格都在自定义字段中以“ 2.50”或“ 5.00”之类的文本形式存储在价格字段中,并通过按价格对价格进行自定义查询的自定义查询在页面上显示这些产品:

    if(!$wp_query) {
        global $wp_query;
    }

    $args = array(
        'meta_key' => 'price',
        'orderby' => 'meta_value_num',
        'order' => 'ASC'
    );

    query_posts( array_merge( $args , $wp_query->query ) );

这对于价格来说很好用,但是有些价格是“ POA”,我想最后显示它们,但是上述订单以“ POA”在前的方式显示。

有什么方法可以改变这种情况,或者我可以使用快速技巧对阵列进行排序,然后将“ POA”价格放在最后吗?


尝试更改'orderby' => 'meta_value_num', 'orderby' => 'meta_value_num meta_value',
Bainternet 2012年

谢谢,但那不起作用:(
Shaun 2012年

啊哈!但是反之亦然,meta_value meta_value_num!谢谢!您要写下答案以便我投票吗?
肖恩

1
发布为不阅读评论的人的答案。
Bainternet 2012年

POA的意思是“要价” en.wikipedia.org/wiki/Price_on_application
sudip

Answers:


23

OrderBy参数可以使用多个参数,因此解决方案是更改:

'orderby' => 'meta_value_num',

至:

'orderby' => 'meta_value meta_value_num',

3
这只是按字母顺序排序,因为第二个参数是no-op,在同一字段上排序无效。为此,数字必须按数字排序,字母按字母顺序排序,您必须使用过滤器来自定义ORDER BY CASE WHEN wp_postmeta.meta_value RLIKE '^[0-9]' THEN '' ELSE wp_postmeta.meta_value END ASC, wp_postmeta.meta_value+0 ASC
订单

@bonger谢谢!您的解决方案是针对此问题的完整解决方案。这是放置查询的其余代码。我将其发布为新访客的答案。
Gangesh

2

我通过结合@bonger和/programming/18084199/wordpress-query-order-by-case-when的代码来找到此解决方案

而且效果很好。

功能

function filter_case($orderby = '') {
  $orderby .= "CASE WHEN wp_postmeta.meta_value RLIKE '^[0-9]' THEN '' ELSE wp_postmeta.meta_value END ASC, wp_postmeta.meta_value+0 ASC";
  return $orderby;
}

查询之前

add_filter( 'posts_orderby', 'filter_case' );

$wp_query = new WP_Query($args);

remove_filter( 'posts_orderby', 'filter_case' );
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.