帮助将自定义帖子类型的存档拆分为“过去”和“即将到来”

时间:2013-11-05 作者:Eric

我在一个wordpress网站上工作,该网站记录了一系列event 帖子(自定义帖子类型),我想拆分我的archive-event.php 页面分为两部分-“即将发生的事件”和“过去的事件”,基于今天的日期。

使用meta_query, 根据今天的日期,我只能成功地显示尚未发生的事件。将我的查询更改为显示过去的事件而不是未来的事件应该并不困难。

我不明白的是如何同时启用这两个查询。有没有办法创建第二个archive-post-type.php 我的自定义帖子类型页?或者,是否有方法创建新的页面模板(例如。past-events.php) 并以某种方式连接将其添加到站点的模板层次结构中?

根据上下文,我试图修改的页面如下:http://artsrestore.la/events/

你可以看到archive-event.php 此处的代码:https://gist.github.com/egardner/7324310

非常感谢Eric

另外,我对wordpress和PHP一般都很陌生,所以非常感谢您对代码的解释!

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

为了提高效率,我们可以做的第一件事是去掉post-type归档模板中的查询。该页面已经在主查询中加载了您的事件,然后您正在模板中运行一个新查询,因此这是对查询的浪费。

我们要做的是使用pre_get_posts 在运行主查询之前添加元查询的操作。然后我们可以使用while( have_posts() ) 循环,而不是自定义查询循环。这里有一个额外的部分来处理直到下一步才有意义的过去事件,所以请继续阅读:

function event_post_order( $query ){
    // if this is not an admin screen,
    // and is the event post type archive
    // and is the main query
    if( ! is_admin()
        && $query->is_post_type_archive( \'event\' )
        && $query->is_main_query() ){

        // if this is a past events view
        // set compare to before today,
        // otherwise set to today or later
        $compare = isset( $query->query_vars[\'is_past\'] ) ? \'<\' : \'>=\';

        // add the meta query and use the $compare var
        $today = date( \'Y-m-d\' );
        $meta_query = array( array( 
            \'key\' => \'sort_date\',
            \'value\' => $today,
            \'compare\' => $compare,
            \'type\' => \'DATE\'
        ) );
        $query->set( \'meta_query\', $meta_query );
    }
}
add_action( \'pre_get_posts\', \'event_post_order\' );
现在,为了让过去的事件正常工作,我们将添加几个重写规则来处理events/past, 加上分页。你的archive-event.php 模板将用于即将到来的和过去的,所以不需要新模板。

这也是我们添加is_past 重写标记,以便我们可以在上一步中检查它是否是过去事件视图:

function event_archive_rewrites(){
    add_rewrite_tag( \'%is_past%\',\'([^&]+)\' );
    add_rewrite_rule(
        \'events/past/page/([0-9]+)/?$\',
        \'index.php?post_type=event&paged=$matches[1]&is_past=true\',
        \'top\'
    );
    add_rewrite_rule(
        \'events/past/?$\',
        \'index.php?post_type=event&is_past=true\',
        \'top\'
    );
}
add_action( \'init\', \'event_archive_rewrites\' );
就是这样。访问您的Settings > Permalinks 将此代码添加到主题后的管理页functions.php 文件来刷新重写规则,或者您可以put it in a plugin.

结束

相关推荐