Как отсортировать записи из категории по дате и количеству комментариев?
Как указано в теме, я пытаюсь отсортировать записи из категории по дате и comment_count, но приведённый ниже код не работает:
<?php
// получаем записи из текущей категории
$category = get_the_category();
$category_ID = $category[0]->term_id;
$args = array(
'cat' => $category_ID,
// ограничиваем количество записей до 3
'posts_per_page' => 3,
'ignore_sticky_posts' => true,
// сортировка по дате и комментариям
'orderby' => array(
'date' => 'DESC',
'comment_count' => 'DESC',
),
);
$the_query = new WP_Query($args);
?>
Записи сортируются только по дате
Ваш текущий запрос сортирует записи по свойству post_date
, которое является SQL-столбцом типа datetime
. Этот тип хранит не только дату, но и время (часы, минуты и секунды). Вторая опция сортировки, comment_count
, применяется только к записям с одинаковой временной меткой, то есть опубликованным в одну и ту же секунду.
Решение вашей проблемы — сортировать по дате публикации, а не по дате и времени. Для этого можно отфильтровать часть запроса orderby
в WP_Query
, используя фильтр posts_orderby
. С этим фильтром вы можете заменить SQL-условия ORDER
, чтобы использовать только день, а не полную дату и время.
Следующий код делает это: он добавляет функцию к фильтру posts_orderby
, которая заменяет {$wpdb->posts}.post_date
(например, wp_posts.post_date
) на CAST({$wpdb->posts}.post_date AS DATE)
, преобразуя поле datetime в формат YYYY-MM-DD
. После выполнения запроса фильтр удаляется, чтобы не влиять на другие запросы.
function wpse222104_query_orderby_day( $orderby, $query ) {
global $wpdb;
return str_replace( "{$wpdb->posts}.post_date", "CAST({$wpdb->posts}.post_date AS DATE)", $orderby );
}
// Добавляем фильтр для изменения условия ORDER
add_filter( 'posts_orderby', 'wpse222104_query_orderby_day', 10, 2 );
// Выполняем запрос с применёнными фильтрами
$query = new WP_Query( $args );
// Удаляем фильтр
remove_filter( 'posts_orderby', 'wpse222104_query_orderby_day' );
Предполагается, что $args
у вас уже заданы: с ними всё в порядке.
Проверка кода
Тестирование показывает, что условие ORDER BY
изменено корректно: изначально оно выглядело как
wp_posts.post_date DESC, wp_posts.comment_count DESC
а теперь стало
CAST(wp_posts.post_date AS DATE) DESC, wp_posts.comment_count DESC
Пример
Теперь точное время публикации записи не учитывается при сортировке: учитывается только дата. Например, рассмотрим следующие записи:
Название Дата Количество комментариев
Пример записи 2014-12-16 10:12:16 6
Другая запись 2014-12-16 21:50:07 4
Ещё одна запись 2012-08-02 11:15:20 25
Исходный запрос вернул бы записи в таком порядке:
- Другая запись
- Пример записи
- Ещё одна запись
Новый же код вернёт записи в порядке:
- Пример записи
- Другая запись
- Ещё одна запись
поскольку "Пример записи" и "Другая запись" опубликованы в один день, но у первой больше комментариев.

Хорошо, спасибо. Значит, это нельзя сделать через закрытие заказа, потому что мне также нужны самые новые записи, отсортированные по количеству комментариев.

Сначала записи сортируются по дате, и если две или более записи имеют одинаковую дату публикации, они сортируются по количеству комментариев. Это отвечает на ваш вопрос?

Похоже, вы используете версию WordPress до 4.x. В старых версиях не поддерживается значение array()
для параметра orderby
. Вместо этого используйте 'orderby' => 'date comment_count'
:
<?php
$category = get_the_category();
$category_ID = $category[0]->term_id;
$args = array(
'cat' => $category_ID,
'posts_per_page' => 3,
'ignore_sticky_posts' => true,
'orderby' => 'date comment_count', // дата является основным критерием
'order' => 'DESC' // необязательный параметр, так как это значение по умолчанию
);
$the_query = new WP_Query($args);
?>
