WordPress как на ладони
wordpress jino

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

WP 4.0: WP_Query: исправления в параметре orderby 11 комментариев
Вопросы 1 Все
  • Вячеслав cайт: www.trutravel.ru

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

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

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

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

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

    Ответить3.1 года назад #
    • Kama4716

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

      Ответить3.1 года назад #
  • А как мне сделать сортировку постов по значению переменной, которую рассчитывает функция по формуле?

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

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

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

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

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

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

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

    Ответитьгод назад #
  • Adam @

    Здравствуйте. Вот такой запрос у меня на одном сайте. И почему то последние новости не выводятся первыми. Что я не так делаю?

      <?php
    				 $week = date( 'W' );
    				 $year = date( 'Y' );
    				 $query = new WP_Query( array(
    				 'cat' => 10,
    				 'nopaging' => 1,
    				 'orderby' => date,
    				 'date_query' => array(
    				   array(
    					'week' => date( 'W' ),
    					'year' => date( 'Y' ),
    				   ),
    				  ),
    				 ) );
    				if( $query->have_posts() ){
    				while( $query->have_posts() ){ $query->the_post();
    				?>
    					 <li>
    					  <div class="article-item">
    							<div class="article-img">
    							   <a href="<?php the_permalink(); ?>"> <?php the_post_thumbnail( 'medium' ); ?></a>
    							</div>
    							<div class="article-desc">
    						<a href="<?php the_permalink(); ?>"><?php trim_title_chars(60, '...'); ?></a>
    							</div>            
    						</div>
    					</li>                         
    				<?php
    				}
    				wp_reset_postdata(); 
    				} 
    				else echo '<div class="empty-category-posts"/> Данная категория в стадии разработки. </div>';
    				?>
    • campusboy1951 cайт: www.youtube.com/c/wpplus

      Привет. Может, так:

      'orderby' => 'date'
      2
      • Adam cайт: altynhotel.kg @

        Привет, посты выводились с использованием слайдера flexisel, оказывается из-за этого были проблемы. Ну и так тоже работает 'orderby' => 'date' . good2

Здравствуйте, !

Ваш комментарий
Предпросмотр