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() .