简而言之:您需要修改单个事件帖子的查询以包含元数据,因此只会返回具有匹配名称、年份和月份的帖子。
我将向您展示我用于测试此功能的完整代码。我对您的代码做了一些更改,并简化了一些内容,所以请小心更新所有函数。
首先,permalinks中使用的重写标记。不需要修改globals来添加这些,这里有一个函数。
function wpd_event_rewrite_tags() {
add_rewrite_tag( \'%bf_events_year%\', \'([0-9]{4})\' );
add_rewrite_tag( \'%bf_events_month%\', \'([0-9]{2})\' );
}
add_action( \'init\', \'wpd_event_rewrite_tags\' );
接下来是注册post类型。在这里,我们可以设置永久链接结构,而无需手动添加规则。请注意事件slug中重写标记的使用。我已经将其简化为一个工作示例的基本内容。
function wpd_event_post_type() {
$args = array(
\'public\' => true,
\'label\' => \'Events\',
\'rewrite\' => array( \'slug\' => \'events/%bf_events_year%/%bf_events_month%\' ),
\'supports\' => array( \'title\', \'editor\', \'custom-fields\' )
);
register_post_type( \'bf_events\', $args );
}
add_action( \'init\', \'wpd_event_post_type\' );
您的
post_type_link
功能基本保持不变,只是更新了重写标记:
function wpd_event_permalink($permalink, $post, $leavename) {
if ( get_post_type( $post ) === "bf_events" ) {
$sd = get_post_meta( $post->ID, \'bf_events_startdate\', true);
$year = date(\'Y\', $sd + get_option( \'gmt_offset\' ) * 3600);
$month = date(\'m\', $sd + get_option( \'gmt_offset\' ) * 3600);
$rewritecode = array(
\'%bf_events_year%\',
\'%bf_events_month%\',
$leavename ? \'\' : \'%postname%\',
);
$rewritereplace = array(
$year,
$month,
$post->post_name
);
$permalink = str_replace($rewritecode, $rewritereplace, $permalink);
}
return $permalink;
}
add_filter( \'post_type_link\', \'wpd_event_permalink\', 10, 4 );
谜题的最后一块是魔法发生的地方。这里,我们将月份和年份查询变量添加到元查询中。添加它也会启动规范重定向,因此它会重定向到正确的年/月,而不是返回404。
function wpd_single_event_queries( $query ){
if( $query->is_singular()
&& $query->is_main_query()
&& isset( $query->query_vars[\'bf_events\'] ) ){
$meta_query = array(
array(
\'key\' => \'bf_events_year\',
\'value\' => $query->query_vars[\'bf_events_year\'],
\'compare\' => \'=\',
\'type\' => \'numeric\',
),
array(
\'key\' => \'bf_events_month\',
\'value\' => $query->query_vars[\'bf_events_month\'],
\'compare\' => \'=\',
\'type\' => \'numeric\',
),
);
$query->set( \'meta_query\', $meta_query );
}
}
add_action( \'pre_get_posts\', \'wpd_single_event_queries\' );