使用ORDERBY和META_VALUE_NUM先对数字排序,然后对字符串排序

时间:2012-03-13 作者:Shaun

我有一个产品列表,每个产品的价格都以文本形式存储在自定义字段中,如“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”价格放在最后?

2 个回复
最合适的回答,由SO网友:Bainternet 整理而成

这个OrderBy 参数可以接受多个参数,因此解决方案是更改:

\'orderby\' => \'meta_value_num\',
收件人:

\'orderby\' => \'meta_value meta_value_num\',

SO网友:Yatix

我通过结合@bonger和https://stackoverflow.com/questions/18084199/wordpress-query-order-by-case-when

而且效果很好。

Function

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;
}

Before Query

add_filter( \'posts_orderby\', \'filter_case\' );

$wp_query = new WP_Query($args);

remove_filter( \'posts_orderby\', \'filter_case\' );

结束

相关推荐

wp_query order by title

我有以价格开头的帖子标题,例如:199900美元-123街。我正在使用下面的代码,我无法通过标题升序来正常工作。请提供任何建议。<?php $paged = (get_query_var(\'paged\')) ? get_query_var(\'paged\') : 1; $args = array( \'cat\' =>21, \'posts_per_page\' => 999999, \'paged\' => $paged,&#x