DATE_QUERY正在显示重复结果

时间:2015-09-26 作者:ImNotAwesome

我正在尝试获取从今天、昨天和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();
?>

1 个回复
SO网友:Pieter Goosen

正如我在评论中所说,您可以在一个查询中使用relative time and date functionality in PHP 也可在date_query. 您只需要通过以下内容2 days agoafter 中的参数date_query 从今天、昨天和两天前获得帖子。只需记住按排序modified

您可以尝试以下操作:(NOTE: 以下内容未经测试,需要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 );
您面临的挑战是正确显示日期标题。我们需要使用helper函数来比较日期并返回差异。所有代码都进入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().

结论:我还没有对代码进行全面测试,但在最初的测试中,它似乎完成了工作。您可能需要对您的需要进行一个或多个小的调整,所以可以根据需要修改我的代码。如果有什么不清楚的地方,请随时发表评论

相关推荐

使用新的WP-Query()从循环中过滤后期格式;

嗨,我目前正在为我的博客构建一个主题。下面的代码指向最新的帖子(特色帖子)。因为这将有一个不同的风格比所有其他职位。然而我想过滤掉帖子格式:链接使用我在循环中定义的WP查询,因为它给我带来了更多的灵活性。我该怎么做呢? <?php $featured = new WP_Query(); $featured->query(\'showposts=1\'); ?> <?php while ($featured->have_post