用于定制帖子和分页的基于日期的URL

时间:2013-02-20 作者:Paul

我使用以下代码为自定义帖子类型(事件)创建了一个自定义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() 确实按照我的要求完成了所有工作,但这不是一个好的解决方案。

是否有某种方法可以翻转模式,使查找页面的模式位于查找帖子名称的模式之前?

1 个回复
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

如果有人知道更好的解决方案,请告诉我:)

结束

相关推荐

Pagination gives 404 error

似乎WP团队从未解决过WP的这个bug。我有自定义的帖子类型,我的url结构是/%类别%/%postname%/如果我点击第二页,我会得到404错误。我尝试了在互联网上找到的所有东西,插件和代码。。我甚至将我的分页基url更改为非页面,所以wp不认为我在搜索名为page的帖子类型。但还是没什么。是的,我做了permalinks的重新保存过程,我试着恢复到deafault,然后返回,仍然没有什么。。。下载的wp\\U navi仍然相同。。我能做些什么来解决这个问题吗?