Использование Orderby и meta_value_num для сортировки сначала чисел, затем строк

13 мар. 2012 г., 13:42:14
Просмотры: 56.5K
Голосов: 18

У меня есть список товаров, каждый с ценой в произвольном поле, сохраненной как текст, например "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" в конце?

5
Комментарии

Попробуйте изменить 'orderby' => 'meta_value_num', на 'orderby' => 'meta_value_num meta_value',

Bainternet Bainternet
13 мар. 2012 г. 13:51:41

Спасибо, но это не работает :(

Shaun Shaun
13 мар. 2012 г. 15:23:24

Ага! А вот наоборот работает, meta_value meta_value_num ! Спасибо! Хотите оформить это как ответ, чтобы я мог проголосовать за него?

Shaun Shaun
13 мар. 2012 г. 15:24:14

опубликовано как ответ для тех, кто не читает комментарии.

Bainternet Bainternet
13 мар. 2012 г. 15:26:57

POA означает "цена по запросу" https://en.wikipedia.org/wiki/Price_on_application

sudip sudip
7 мар. 2018 г. 10:46:15
Все ответы на вопрос 2
2
28

Аргумент OrderBy может принимать более одного параметра, поэтому решением было изменить:

'orderby' => 'meta_value_num',

на:

'orderby' => 'meta_value meta_value_num',
13 мар. 2012 г. 15:26:31
Комментарии

Это просто сортирует в алфавитном порядке, так как второй параметр не выполняет никаких действий, сортируя по тому же полю без эффекта. Чтобы числа сортировались численно, а буквы — алфавитно, вам нужно использовать фильтр для настройки orderby с использованием какого-либо SQL-условия, например: 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 bonger
5 нояб. 2014 г. 11:04:38

@bonger Спасибо! Ваше решение полностью решает эту проблему. А вот остальная часть кода, где размещен ваш запрос. Я собираюсь опубликовать это как ответ для новых посетителей.

gmatta gmatta
19 авг. 2016 г. 15:43:32
0

Я нашел это решение, объединив код от @bonger и https://stackoverflow.com/questions/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' );
19 авг. 2016 г. 15:47:08