WordPress как на ладони
Очень Удобный и Быстрый Хостинг для сайтов на WordPress. Пользуюсь сам и вам рекомендую!

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

7 комментариев
    Войти