跳过帖子,但保留每页的帖子

时间:2015-04-08 作者:la1ch3

我正在我的一个模板上运行一个普通的循环,它显示了一个带有日期的即将发生的事件的列表。我希望过去的事件保持活跃,但不出现在我的帖子列表中。

按照目前的情况,我为事件选择一个日期(自定义字段),通过PHP日期函数将其与当前日期进行比较,如果通过了,则“继续”,因此我们跳过循环。这很好,但我每页的帖子都会受到影响。我没有使用WP_Query 循环,这是一个存档模板。

代码如下所示:

if( have_posts() ) : while( have_posts() ) : the_post();

    // Post specific fields
    $date = get_post_meta( get_the_ID(), \'Date\', true );
    $time = get_post_meta( get_the_ID(), \'Time\', true );
    $cat = wp_get_object_terms(get_the_ID(), \'event-type\');

    $todaysDate = date(\'n\\/d\\/Y\');

    if( $date < $todaysDate ){
            continue;
    }
有什么想法可以用另一种方式来实现吗?

2 个回复
最合适的回答,由SO网友:Milo 整理而成

使用pre_get_posts 要将元查询添加到主查询,请执行以下操作:

function wpd_date_meta_query( $query ) {
    if( $query->is_post_type_archive( \'your_post_type\' ) && $query->is_main_query() ){
        $meta_query = array(
            array(
                \'key\' => \'Date\',
                \'value\' => date(\'Ymd\'),
                \'compare\' => \'>=\',
                \'type\' => \'NUMERIC\'
            )
        );
        $query->set( \'meta_query\', $meta_query );
        $query->set( \'meta_key\', \'Date\' );
        $query->set( \'orderby\', \'meta_value_num\' );
        $query->set( \'order\', \'ASC\' );
    }
}
add_action( \'pre_get_posts\', \'wpd_date_meta_query\' );
还请注意,虽然当前日期格式可能会显示为正常工作,但使用除yyyy-mm-dd, 因为它只是一个8位数的数字比较。只要更改年份,您就会看到当前格式是如何失败的。

SO网友:la1ch3

所以我自己解决了这个问题。这不是最优雅的解决方案,但它确实有效。我想这会对某人有所帮助。

我首先使用register_post_status() 在函数中。php。然后我使用pre_get_posts() 也在函数中。php中,我过滤了存档页面上的主查询,只显示状态为“publish”的帖子。

最后,在我的实际归档页面上,事情变得有点棘手。我首先使用一个新的WP\\u查询创建了一个二级循环,并将我的post\\u类型作为参数,然后从每个post中获取指定的日期。我比较了活动日期和今天的日期(phpdate() 函数),如果事件超过了今天的日期(已经发生),那么我们将为该帖子分配一个新的帖子状态“已通过”(我之前创建的帖子状态)。这是通过wp_transition_post_status() 作用最后,我运行正常循环,并显示所有正确的帖子。目前有点令人费解,但这是一种保持最新事件列表的好方法。

结束