我使用以下代码为自定义帖子类型(事件)创建了一个自定义permalink结构:
$GLOBALS["wp"]->add_query_var("event_year");
$GLOBALS["wp"]->add_query_var("event_monthnum");
$GLOBALS["wp"]->add_query_var("event_day");
$GLOBALS["wp_rewrite"]->add_rewrite_tag("%event%", "([^/]+)", "event=");
$GLOBALS["wp_rewrite"]->add_rewrite_tag("%event_year%", "([0-9]{4})", "event_year=");
$GLOBALS["wp_rewrite"]->add_rewrite_tag("%event_monthnum%", "([0-9]{1,2})", "event_monthnum=");
$GLOBALS["wp_rewrite"]->add_rewrite_tag("%event_day%", "([0-9]{1,2})", "event_day=");
$GLOBALS["wp_rewrite"]->add_permastruct("event", "/event/%event_year%/%event_monthnum%/%event_day%/%event%", false);
在大多数情况下,这与预期的效果一样。然而,当我尝试在带有年、月和日期的URL上使用分页时,出现了一个问题。在这种情况下,假设“page”是%事件%的值。
我使用了Monkeyman重写分析器插件,注意到了所需的模式(event/([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/page/?([0-9]{1,})/?$
) 列出,但仅在尝试将页面参数用作事件名称的模式之后(event/([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/([^/]+)(/[0-9]+)?/?$
).
我还注意到$GLOBALS["wp_rewrite"]->rewrite_rules()
重写后,定义将使分页工作正常,但会将URL与事件名称断开(在这种情况下,不知何故,event\\u year、event\\u monthnum、event\\u day和event转换为1美元、2美元、3美元和4美元)。
使命感$GLOBALS["wp_rewrite"]->flush_rules()
确实按照我的要求完成了所有工作,但这不是一个好的解决方案。
是否有某种方法可以翻转模式,使查找页面的模式位于查找帖子名称的模式之前?
SO网友:swissspidy
调用$GLOBALS[“wp\\u rewrite”]->flush\\u rules()确实可以按我的要求完成所有工作,但这不是一个好的解决方案。
实际上,在修改重写规则后(即注册自定义帖子类型时),您需要刷新重写规则。
此外,您永远不应该依赖这些全局变量。WordPress几乎为所有内容提供了特定的功能。例如,使用flush_rewrite_rules()
而不是$GLOBALS["wp_rewrite"]->flush_rules()
. 它更经得起未来考验,更易于维护。
在适当的操作挂钩处调用这些函数非常重要,以确保加载所有需要的类和函数。当封装在插件中时,它可能看起来像这样(未测试!):
function events_87669_query_vars( $qvars ) {
$qvars[] = \'event_year\';
$qvars[] = \'event_monthnum\';
$qvars[] = \'event_day\';
return $qvars;
}
add_filter(\'query_vars\', \'events_87669_query_vars\' );
function events_87669_rewrite_rules() {
add_rewrite_tag("%event%", "([^/]+)", "event=");
add_rewrite_tag("%event_year%", "([0-9]{4})", "event_year=");
add_rewrite_tag("%event_monthnum%", "([0-9]{1,2})", "event_monthnum=");
add_rewrite_tag("%event_day%", "([0-9]{1,2})", "event_day=");
add_permastruct("event", "/event/%event_year%/%event_monthnum%/%event_day%/%event%", false);
}
add_action( \'init\', \'events_87669_rewrite_rules\' );
function events_87669_activation() {
// Ensure our rewrite rules exist on plugin activation
events_87669_rewrite_rules();
flush_rewrite_rules();
}
function events_87669_activation() {
flush_rewrite_rules();
}
register_activation_hook( __FILE__, \'events_87669_activation\' ) );
register_deactivation_hook( __FILE__, \'events_87669_deactivation\' ) );
这段代码与您的代码基本相同,只是它正确地刷新了插件激活/停用的重写规则。此外,我们还确保在激活时存在新添加的重写规则。如您所见,有一个用于添加自定义查询变量的特殊过滤器。
在WordPress Codex上可以找到一个很好的自定义查询示例:http://codex.wordpress.org/Custom_Queries如果您想了解有关挂钩和过滤器的更多信息:http://codex.wordpress.org/Plugin_API
如果有人知道更好的解决方案,请告诉我:)