date_query показывает повторяющиеся результаты

Я пытаюсь получить сообщения, которые были обновлены с сегодняшнего дня, вчера и 2 дня назад, но 2 дня назад показывает результат вчера. Что не так с моим кодом? Сегодня и вчера работает нормально. А также сообщение, что запрос, показывающий вчера и 2 дня назад, обновляется только один раз, и это было вчера. Мне нужна помощь, я немного путаю.

<span>Today's Update (<?php echo date('F j, Y'); ?>)</span> <?php $args = array ( 'post_type' => array( 'post' ), 'post_status' => array( 'publish' ), 'category__in' => array( 3,7 ), 'date_query' => array( array( 'column' => 'post_modified_gmt', 'after' => 'today', 'inclusive' => true ), ) ); $the_query = new WP_Query( $args ); if ( $the_query->have_posts() ) { echo '<ul>'; while ( $the_query->have_posts() ) { $the_query->the_post(); echo '<li><a href="'.get_permalink().'">' . get_the_title() . '</a></li>'; } echo '</ul>'; } else { echo "<ul><li>No Update</li></ul>"; } /* Restore original Post Data */ wp_reset_postdata(); ?> <span>Yesterday Update (<?php echo date('F j, Y',strtotime("-1 days")); ?>)</span> <?php $args2 = array ( 'post_type' => array( 'post' ), 'post_status' => array( 'publish' ), 'category__in' => array( 3,7 ), 'date_query' => array( array( 'column' => 'post_modified_gmt', 'after' => 'yesterday', 'inclusive' => true ), ) ); $the_query2 = new WP_Query( $args2 ); if ( $the_query2->have_posts() ) { echo '<ul>'; while ( $the_query2->have_posts() ) { $the_query2->the_post(); echo '<li><a href="'.get_permalink().'">' . get_the_title() . '</a></li>'; } echo '</ul>'; } else { echo "<ul><li>No Update</li></ul>"; } /* Restore original Post Data */ wp_reset_postdata(); ?> <span>2 Days ago Update (<?php echo date('F j, Y',strtotime("-2 days")); ?>)</span> <?php // 2 Days ago post modified. $args3 = array ( 'post_type' => array( 'post' ), 'post_status' => array( 'publish' ), 'category__in' => array( 3,7 ), 'date_query' => array( array( 'column' => 'post_modified_gmt', 'after' => '-2days', 'inclusive' => true ), ) ); $the_query3 = new WP_Query( $args3 ); if ( $the_query3->have_posts() ) { echo '<ul>'; while ( $the_query3->have_posts() ) { $the_query3->the_post(); echo '<li><a href="'.get_permalink().'">' . get_the_title() . '</a></li>'; } echo '</ul>'; } else { echo "<ul><li>No Update</li></ul>"; } /* Restore original Post Data */ wp_reset_postdata(); ?> 

Solutions Collecting From Web of "date_query показывает повторяющиеся результаты"

Как я уже сказал в комментариях, вы можете сделать это в одном запросе, используя относительные функциональные возможности времени и даты в PHP, который также доступен в date_query . Вам просто нужно передать что-то вроде 2 days ago параметру after в date_query чтобы получать сообщения с сегодняшнего дня, вчера и два дня назад. Не забудьте отсортировать ваши сообщения с помощью modified

Вы можете попробовать что-то вроде следующего: ( ПРИМЕЧАНИЕ: следующее непроверено и нуждается в PHP 5.4+)

 $args = [ 'orderby' => 'modified', 'category__in' => [3, 7], 'posts_per_page' => -1, 'date_query' => [ [ 'column' => 'post_modified_gmt', 'after' => '2 days ago', ] ], ]; $q = new WP_Query( $args ); 

Ваша задача – правильно отобразить заголовки. Нам понадобится вспомогательная функция для сравнения дат и возврата разницы. Весь код переходит в functions.php

 /** * function to return the difference as follow * Today will be Today's * Yesterday will be Yesterday's * Any other day will be x Days ago * * @param $start The start date in unix timestamp to compare * @param $end The end date in unix timestamp to compare * @return (string) $days */ function get_relative_date_diff( $start, $end ) { // Make sure we have date values, if not, return false if ( !$start || !$end ) return false; $diff = (int) abs( $start - $end ); $number_days = round( $diff / DAY_IN_SECONDS ); // Output the correct string according to $day switch ( $number_days ) { case '0': $days = "Today's"; break; case '1': $days = "Yesterday's"; break; default: $days = "$number_days Days ago"; } return $days; } 

Теперь, когда все это настроено, мы теперь можем изменить наш цикл соответственно. Мы будем использовать цикл выше

 if ( $q->have_posts() ) { // Set a variable to hold the current day number $day_variable = ''; // Get the current date $now_date = time(); echo '<ul>'; while ( $q->have_posts() ) { $q->the_post(); $post_date_day = get_the_modified_date( 'd' ); if ( !$day_variable // Check if $day_variable is empty || $day_variable != $post_date_day // Check if $day_variable is not the same as $post_date_day ) { // We are now going to output our header $diff = get_relative_date_diff( $now_date, get_the_modified_date( 'U' ) ); echo '<span>' . $diff . ' Update ' . get_the_date( 'F j, Y' ) . '</span>'; } // Set the $day_variable variable to the $post_date_day variable $day_variable = $post_date_day; echo '<li><a href="'.get_permalink().'">' . get_the_title() . '</a></li>'; } echo '</ul>'; wp_reset_postdata(); } 

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

РЕДАКТИРОВАТЬ

У моего кода было несколько недостатков

  • Мои аргументы запроса пропустили 'column' => 'post_modified_gmt', и 'posts_per_page' => -1

  • Когда я вычислил разницу во времени, я использовал фактическую дату публикации ( get_the_date ), а не дату, на которую была изменена get_the_modified_date( 'U' ) ). Это то, что вызвало появление забавных дней в заголовках

  • @birgire напомнил мне human_time_diff() . Я не использовал эту функцию, так как вам нужен другой вывод из результата human_time_diff() . Однако я переписал свою функцию с помощью некоторой логики, используемой в human_time_diff() .

ВЫВОД

Я не полностью тестировал код, но при первоначальном тестировании он, похоже, выполняет эту работу. Возможно, вам понадобится одна или несколько небольших корректировок для ваших нужд, поэтому не стесняйтесь изменять мой код по мере необходимости. Если что-то неясно, вы можете оставить комментарий