В стандартной установке WordPress публикации выводятся в хронологическом порядке — от самых новых к старым. Однако в реальных проектах часто возникает необходимость изменить этот порядок, например, вывести публикации по алфавиту, по пользовательскому метаполю или по произвольному критерию. В этой статье подробно рассмотрим, как это сделать с помощью стандартных возможностей WordPress и небольших доработок кода.
Изменение порядка публикаций по дате: ASC и DESC
По умолчанию WordPress выводит записи с сортировкой по дате публикации в порядке убывания (DESC), то есть самые свежие записи отображаются первыми. Чтобы изменить порядок на возрастание (ASC), можно использовать параметр order в запросах WP_Query.
Вот простой пример, как вывести записи в обратном порядке (от самой старой к новой):
$args = [
'post_type' => 'post',
'orderby' => 'date',
'order' => 'ASC',
'posts_per_page' => 10
];
$query = new WP_Query($args);
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
// Выводим заголовок
the_title('<h2>', '</h2>');
}
wp_reset_postdata();
}
Если вы хотите изменить порядок вывода в главном цикле (например, на главной странице блога), то можно использовать хук pre_get_posts и изменить параметры запроса, не создавая новый объект WP_Query.
function wptests_change_main_query_order(\WP_Query $query) {
if (is_admin() || !$query->is_main_query()) {
return;
}
if (is_home()) { // Главная страница блога
$query->set('orderby', 'date');
$query->set('order', 'ASC');
}
}
add_action('pre_get_posts', 'wptests_change_main_query_order');
Сортировка публикаций по пользовательским полям (meta_query)
Часто нужно вывести публикации, отсортированные по значениям произвольных полей (custom fields). Например, у вас есть поле event_date, в котором хранится дата события, и вы хотите вывести события в хронологическом порядке.
Для этого используется параметр meta_key и orderby со значением meta_value (или meta_value_num для чисел).
$args = [
'post_type' => 'event',
'meta_key' => 'event_date',
'orderby' => 'meta_value',
'order' => 'ASC',
'posts_per_page' => 10
];
$query = new WP_Query($args);
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
the_title('<h2>', '</h2>');
echo '<p>Дата события: ' . get_post_meta(get_the_ID(), 'event_date', true) . '</p>';
}
wp_reset_postdata();
}
Важно, чтобы формат данных в пользовательском поле был подходящим для сортировки. Для дат лучше использовать формат YYYYMMDD или UNIX timestamp.
Сортировка по нескольким пользовательским полям
Если нужно сортировать по нескольким метаполям, начиная с WordPress 4.2 поддерживается массив orderby. Пример:
$args = [
'post_type' => 'event',
'meta_query' => [
'relation' => 'AND',
'start_date_clause' => [
'key' => 'start_date',
'type' => 'DATE'
],
'end_date_clause' => [
'key' => 'end_date',
'type' => 'DATE'
]
],
'orderby' => [
'start_date_clause' => 'ASC',
'end_date_clause' => 'DESC'
],
'posts_per_page' => 10
];
$query = new WP_Query($args);
Это позволит сортировать сначала по дате начала события, а при равенстве — по дате окончания.
Сортировка по таксономиям и произвольным критериям
WordPress не поддерживает стандартную сортировку по таксономиям (например, по категориям или тегам) напрямую через WP_Query, но можно обойти это с помощью JOIN в SQL или использовать плагины.
Для простых случаев, когда нужно вывести публикации из определенной категории, сортировка остается по дате, но можно вручную реализовать сортировку по названию категории:
function wptests_sort_posts_by_category_name($query) {
if (is_admin() || !$query->is_main_query()) {
return;
}
if (is_home()) {
$query->set('orderby', 'title');
$query->set('order', 'ASC');
}
}
add_action('pre_get_posts', 'wptests_sort_posts_by_category_name');
Если же нужно сортировать по произвольным критериям, например, по пользовательскому рейтингу, можно использовать плагин Clearfy Pro, который расширяет возможности сортировки и оптимизации запросов.
Создание собственного параметра сортировки через фильтр posts_orderby
Если стандартных возможностей WP_Query не хватает, можно подключиться к фильтру posts_orderby для тонкой настройки SQL-запроса.
function wptests_custom_orderby( $orderby, \WP_Query $query ) {
if ( $query->is_main_query() && is_home() && $query->get('orderby_custom') ) {
global $wpdb;
// Пример сортировки по длине заголовка
return 'LENGTH(' . $wpdb->posts . '.post_title) ASC';
}
return $orderby;
}
add_filter('posts_orderby', 'wptests_custom_orderby', 10, 2);
Для активации примера нужно добавить параметр orderby_custom в запрос.
Практические рекомендации и советы
- Всегда тестируйте сортировку на больших объемах данных, чтобы не получить чрезмерно тяжелые запросы.
- Используйте индексы в базе данных для метаполей, которые часто участвуют в сортировках.
- Если нужно часто сортировать по сложным критериям, рассмотрите возможность создания отдельной таблицы или кэширования результатов.
- Для задач с сортировкой по нескольким параметрам изучите возможности WP_Query с массивом
orderbyиmeta_query. - Плагины вроде Clearfy Pro помогут упростить и улучшить производительность.
Пример: изменение порядка вывода на главной с помощью Clearfy Pro
В Clearfy Pro есть модуль, который позволяет легко менять порядок публикаций без кода. После установки и активации:
- Перейдите в раздел Clearfy Pro > Оптимизация.
- Включите модуль "Изменение параметров запроса".
- Настройте сортировку по нужным полям, например, по пользовательскому метаполю или дате.
Это хороший вариант для тех, кто не хочет писать код, но нуждается в гибкой сортировке.