Как отсортировать записи из категории по дате и количеству комментариев?
Как указано в теме, я пытаюсь отсортировать записи из категории по дате и 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
Исходный запрос вернул бы записи в таком порядке:
- Другая запись
- Пример записи
- Ещё одна запись
Новый же код вернёт записи в порядке:
- Пример записи
- Другая запись
- Ещё одна запись
поскольку "Пример записи" и "Другая запись" опубликованы в один день, но у первой больше комментариев.
Хорошо, спасибо. Значит, это нельзя сделать через закрытие заказа, потому что мне также нужны самые новые записи, отсортированные по количеству комментариев.
Michał Kalkowski
Сначала записи сортируются по дате, и если две или более записи имеют одинаковую дату публикации, они сортируются по количеству комментариев. Это отвечает на ваш вопрос?
engelen
Похоже, вы используете версию 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);
?>