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( [ 'orderby' => 'post_title' ] ); // или можно так, title = post_title - это алиас (синоним): $query = new WP_Query( [ 'orderby' => 'title' ] );
В результате такого запроса, условие SQL, отвечающее за сортировку будет выглядеть так:
ORDER BY post_title DESC
Порядок сортировки для каждой колонки
Также в orderby можно указать две колонки для сортировки, через пробел. Тогда результат будет отсортирован по двум колонками поочередно:
$query = new WP_Query( [ 'orderby' => 'title author' ] );
SQL получится такой:
ORDER BY post_title, post_author DESC
Такой запрос вернет неожиданный результат. Так как в этом запросе порядок сортировки DESC
указан только для второй колонки, а у первой колонки он ASC
. Потому что в MySQL по умолчанию колонки сортируются по возрастанию - от меньшего к большему - ASC
(ascending - по возрастанию).
В WP 4.0 ошибка исправлена и порядок сортировки ставится для всех указанных колонок, т.е.:
$query = new WP_Query( [ 'orderby' => 'title author' ] );
вернет:
ORDER BY post_title DESC, post_author DESC
Также в WP 4.0 стало возможным указать порядок сортировки для каждой колонки в отдельности, для этого в параметр orderby
нужно передать массив с таким синтаксисом:
$query = new WP_Query( [ 'orderby' => [ 'title' => 'DESC', 'menu_order' => 'ASC' ] ] );
В результате SQL будет таким:
ORDER BY post_title DESC, menu_order ASC
Подробнее о том, как строится ORDER BY запрос, смотрите в методах WP_Query::parse_order() и WP_Query::parse_orderby().