WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru Авторские Темы для 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( 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_order() и WP_Query::parse_orderby().

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