【问题标题】:Wordpress Rewrite RulesWordpress 重写规则
【发布时间】:2012-11-21 02:02:40
【问题描述】:

更新

我已经浏览了 rewrite API 上的 codex 文档,现在我的 functions.php 中有以下内容:

function my_rewrite_rules() {
    add_rewrite_rule('(a|b|c|d)/?$', 'index.php?pagename=$matches[1]-overview&myVar=var', 'top');
}
add_action('init', 'my_rewrite_rules');

是的,调整后我要去永久链接页面刷新规则。行为是相同的,404s 以上的规则,即使页面确实存在,我可以通过直接在地址栏中输入来访问它。但是,如果我像这样对其中一个正则表达式匹配进行硬编码:

function my_rewrite_rules() {
    add_rewrite_rule('(a|b|c|d)/?$', 'index.php?pagename=a-overview&myVar=var', 'top');
}
add_action('init', 'my_rewrite_rules');

然后一切正常,查询变量设置正确。想法?


原始问题

我已经尝试让 Wordpress 重写规则工作很长时间了,但对于为什么以下代码(在 functions.php 中)不起作用,我感到非常困惑:

function my_rewrite_rules($rules) {
    $my_rules = array('(a|b|c|d)/?$' => 'index.php?pagename=$matches[1]-overview&my_var=somevar');

    return array_merge($my_rules, $rules);
}
add_filter('page_rewrite_rules', 'my_rewrite_rules');

我禁用了规范重定向,并且仅重写 40​​4。如果启用了重定向,它确实会转到正确的页面,但我的查询变量被剥离。如果我删除 '$matches[1]' 并将其替换为 a、b、c 或 d,则在禁用规范重定向的情况下一切正常。我意识到有一些解决方法,但我只想了解为什么以下方法不起作用?谢谢!

【问题讨论】:

  • 很遗憾你的问题对我没有任何意义..
  • 我认为您应该使用Rewrite_API$wp_rewrite 对象,而不是尝试直接访问或设置属性。

标签: regex wordpress url permalinks


【解决方案1】:

在 Wordpress 的 url_to_post() 函数中,显然在 pagename 查询变量之后直接具有 $matches 变量被视为一种特殊情况。这是来自code的sn-p:

if ( $wp_rewrite->use_verbose_page_rules && preg_match( '/pagename=\$matches\[([0-9]+)\]/', $query, $varmatch ) ) {
    // this is a verbose page match, lets check to be sure about it
    if ( ! get_page_by_path( $matches[ $varmatch[1] ] ) )
        continue;
}

如果我没看错的话,Wordpress 似乎(错误地)假设 $matches 变量应该与页面路径匹配。因此,在您的示例中,如果您没有名称为 abcd 的页面,您的重写规则将被完全跳过(将调用 continue )。

我通过阅读 Wordpress 代码推断出这一点,但我没有测试过我的理论(我实际上从未使用过 Wordpress)。您可以通过创建一个名称为 abcd 的页面并再次运行您的代码来测试我的理论。如果我是正确的,这应该使您的规则起作用。我建议不要在您的页面名称后面使用-overview,从而解决问题。

【讨论】:

    猜你喜欢
    • 2023-03-27
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多