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

Как и в теме, я пытаюсь заказать сообщения из категории по дате и comment_count, но код ниже не работает:

<?php //get post from current category $category = get_the_category(); $category_ID = $category[0]->term_id; $args = array( 'cat' => $category_ID, //limit posts to 3 'posts_per_page' => 3, 'ignore_sticky_posts' => true, //order post by date and comments 'orderby' => array( 'date' => 'DESC', 'comment_count' => 'DESC', ), ); $the_query = new WP_Query($args); ?> 

Сообщения заказываются только по дате

Запрос, который у вас есть, будет заказывать сообщения по свойству post_date , который является столбцом SQL типа datetime . Этот тип хранит дату, но также время (часы, минуты и секунды). Второй параметр сортировки comment_count применяется только к сообщениям с одинаковой меткой времени, то есть, которые были отправлены в тот же самый второй момент времени.

Таким образом, решение вашей проблемы заключается в сортировке по дате публикации вместо datetime . Для этого вы можете фильтровать часть запроса WP_Query в 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 ); } // Add the filter to change the ORDER clause add_filter( 'posts_orderby', 'wpse222104_query_orderby_day', 10, 2 ); // Run the query with the filters $query = new WP_Query( $args ); // Remove the filter 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 

пример

Точное время публикации публикации теперь не будет учитываться при сортировке: только дата, в которую она была отправлена, будет. Например, рассмотрите следующие сообщения:

 Title Date Comment count Example Post 2014-12-16 10:12:16 6 Another one 2014-12-16 21:50:07 4 Yet Another 2012-08-02 11:15:20 25 

Здесь ваш исходный запрос будет возвращать сообщения в порядке

  1. Еще один
  2. Пример сообщения
  3. Еще один

В то время как новый код будет возвращать сообщения в порядке

  1. Пример сообщения
  2. Еще один
  3. Еще один

как «Пример post» и «Another one» были отправлены в тот же день, но «Example post» имеет больше комментариев.

Похоже, вы используете версию 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', // date is primary 'order' => 'DESC' // not required because it's the default value ); $the_query = new WP_Query($args); ?>