WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru Хостинг, VPS/VDS и отдельные сервера только на SSD дисках. 7 дней бесплатного тестирования.

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 комментов
  • Вячеслав cайт: www.trutravel.ru

    Наконец-то!!!

    Ответить4.2 года назад #
  • petrozavodsky773 cайт: alkoweb.ru

    да в кой-то веки значимую фитчу выкатили

    Ответить4.1 года назад #
  • Наталья Грамоткина cайт: vash-fenshyu.ru

    Здравствуйте, у меня такой вопрос: после обновления вордпресс на версию 4.0, у меня в записях не ставятся метки, при нажатии на "Выбрать из часто используемых меток" реакции никакой, только в строке где указана ссылка на страницу добавляется вот такой хвост #titlediv. То же происходит и при попытке изменить постоянную ссылку, только добавляется хвост #post_name. Еще пропал редактор внешнего вида. Может быть Вы знаете как сделать так чтобы все вновь стало работать? Буду признательна за помощь.Спасибо.

    Ответить4.1 года назад #
    • Kama7079

      Очевидно, что у вас перестал работать скрипт. Видимо конфлик скриптов какой-то. Попробуйте поотключать плагины, возможно какой-то плагин так себя ведет. unknw

      Ответить4.1 года назад #
  • Ребята, помогите пожалуйста.

    Есть функция, которая рассчитывает переменную в functions.php.
    Мне теперь надо по этой переменной упорядочить посты по возрастанию, например.

    Я делаю цикл с аргументами

    $args = array( 
    'post_type' => 'ddd',
    'post_id' => $post->ID,
    'order' => 'DESC',                                                       
    'orderby' => $xxx
    );

    моя переменная $xxx.

    Проблема в том, что я потом в цикле вызываю функцию с ней, чтобы ее вывести, она выводится, но в аргументе она не срабатывает, т.к. ее как бы нет еще.

    Пробовал сохранить ее как метаданные в functions.php, но не получается, что-то делаю не то. Сохранять надо, как я понимаю, когда получено значение, т.е. до цикла.

    Ответить1.9 год назад #
Здравствуйте, !     Войти . Зарегистрироваться