Використовуючи 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

Дякую, але це не працює :(
Шон

Ага! Але все навпаки, працює meta_value meta_value_num! Спасибі! Ви хочете написати відповідь, щоб я міг її проголосувати?
Шон

1
розміщено як відповідь для людей, які не читають коментарів.
Бейнтернет

POA означає "ціна на запитання" en.wikipedia.org/wiki/Price_on_application
sudip

Відповіді:


23

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

'orderby' => 'meta_value_num',

до:

'orderby' => 'meta_value meta_value_num',

3
Це просто сортується в алфавітному порядку, оскільки другий параметр є неоперативним, сортування за тим же полем без ефекту. Щоб зробити це так, щоб цифри сортували числово, а алфавіти в алфавітному порядку вам доведеться використовувати фільтр, щоб налаштувати порядок, щоб використовувати якийсь корпус 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 Дякую! Ваше рішення є повноцінним рішенням цієї проблеми. І ось решта коду, де розміщений ваш запит. Я буду розміщувати це як відповідь для нових відвідувачів.
Гангеш

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' );
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.