Как отсортировать записи из категории по дате и количеству комментариев?

30 мар. 2016 г., 12:59:46
Просмотры: 18.8K
Голосов: 0

Как указано в теме, я пытаюсь отсортировать записи из категории по дате и 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);
?>

Записи сортируются только по дате

1
Комментарии

Можете уточнить, указав количество комментариев и дату публикации для всех трех постов с их порядком?

Sumit Sumit
30 мар. 2016 г. 13:14:25
Все ответы на вопрос 2
3

Ваш текущий запрос сортирует записи по свойству 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

Исходный запрос вернул бы записи в таком порядке:

  1. Другая запись
  2. Пример записи
  3. Ещё одна запись

Новый же код вернёт записи в порядке:

  1. Пример записи
  2. Другая запись
  3. Ещё одна запись

поскольку "Пример записи" и "Другая запись" опубликованы в один день, но у первой больше комментариев.

30 мар. 2016 г. 13:22:16
Комментарии

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

Michał Kalkowski Michał Kalkowski
30 мар. 2016 г. 13:56:49

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

engelen engelen
30 мар. 2016 г. 16:33:31

Не совсем то, что я ожидал, но ваш ответ мне очень помог. В моей ситуации мне нужно получить самые свежие записи, и эти записи должны быть отсортированы по количеству комментариев (самые комментируемые записи вверху). С уважением

Michał Kalkowski Michał Kalkowski
30 мар. 2016 г. 22:35:14
0

Похоже, вы используете версию 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);
?>
30 мар. 2016 г. 13:28:28