为了提高效率,我们可以做的第一件事是去掉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.