WP 4.0: WP_Query: виправлення у параметрі orderby

У WordPress 4.0 виправлені недоліки пов’язані з сортуванням результатів запиту WP_Query , коли сортування йде по кількох колонках одночасно.

Сортування при отриманні результатів WP_Query задається параметром orderbyі orderякі відповідають за умову ‘ ORDER BY’ SQL запиту. За замовчуванням orderby = post_dateта order = DESC. DESC (descending – за спаданням) означає, що результати сортуються по колонці post_date у зворотному порядку (останні пости на початку).

У параметр orderby вказується рядок – назва колонки за якою сортувати:

$query = new WP_Query( array( 'orderby' => 'post_title' ) );

// або можна так, title = post_title – це аліас (синонім):
$query = new WP_Query( array( 'orderby' => 'title' ) );

В результаті такого запиту, умова SQL, що відповідає за сортування, виглядатиме так:

ORDER BY post_title DESC

Порядок сортування для кожної колонки

Також в orderby можна вказати дві колонки для сортування, через пропуск. Тоді результат буде відсортовано за двома колонками по черзі:

$query = new WP_Query( array( 'orderby' => 'title author' ) );

SQL вийде такий:

ORDER BY post_title, post_author DESC

Такий запит поверне несподіваний результат. Так як у цьому запиті порядок сортування DESC вказаний тільки для другої колонки, а перша колонка він ASC. Тому що MySQL за замовчуванням колонки сортуються за зростанням – від меншого до більшого – ASC (ascending – за зростанням).

У WP 4.0 помилка виправлена ​​і порядок сортування ставиться всім зазначених колонок, тобто:

$query = new WP_Query( array( 'orderby' => 'title author' ) );

поверне:

ORDER BY post_title DESC, post_author DESC

Також у WP 4.0 стало можливим вказати порядок сортування для кожної колонки окремо, для цього параметр orderby потрібно передати масив з таким синтаксисом:

$query = new WP_Query( array( 'orderby' => array( 'title' => 'DESC', 'menu_order' => 'ASC' ) ) ));

В результаті SQL буде таким:

ORDER BY post_title DESC, menu_order ASC

Докладніше про те, як будується ORDER BY запит, дивіться у методах WP_Query::parse_orderby() .

Залишити коментар

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *