优先级最低的ADD_REWRITE_RULE不处理WordPress页面

时间:2016-03-14 作者:Ionică Bizău

我有一个名为test.php 输出page querystring参数。

我想使用add_rewrite_rule 为我的php文件提供服务,而已经存在或将要创建的WordPress页面应该具有优先级:例如,如果我捕获bar, bazfoo-* 在我的正则表达式中,然后添加一个名为baz (生活在/baz url)和另一个名为/foo-bar, 两者都应该从数据库(WordPress)提供,而不是通过我的php文件。

这是我的自定义重写functions.php:

function custom_rewrite() {
  add_rewrite_rule( \'^(bar|baz|foo-.*)\', \'test.php?page=$1\', \'top\');
}
add_action(\'init\', \'custom_rewrite\');
这个很好用:它能抓住bar, baz, foo-* URL。但是当我创建一个名为bar 它仍然使用我的test.php 为内容服务。

我试着用bottom 而不是top 作为add_rewrite_rule 打电话,但没有任何改变。

每次编辑后functions.php 我确保单击永久链接设置中的保存更改按钮。

我怎样才能解决这个问题?

我想要这样的东西:

Client ---- [does the WP page exist?] --- YES -> Serve it from DB
                        \\----- NO -- [is the url matched by my regex?]
                                         |            |
                                        YES           NO
                                         |            |
                                         v            |
                                      test.php        404
显然,如果有其他规则,请先检查它们,然后显示404。

1 个回复
最合适的回答,由SO网友:Milo 整理而成

当您将规则指向除index.php, 它被解释为外部的并写入。htaccess文件。解析外部规则后,请求被定向到WordPress,后者在php中解析内部规则。这是内部版本:

function custom_rewrite() {
  add_rewrite_rule(
    \'^(bar|baz|foo-.*)\',
    \'index.php?my_var=$matches[1]\',
    \'top\'
  );
}
add_action( \'init\', \'custom_rewrite\' );
您还需要注册规则中使用的自定义查询变量。请注意page 已被WordPress使用

function wpd_query_vars( $qvars ) {
  $qvars[] = \'my_var\';
  return $qvars;
}
add_filter( \'query_vars\', \'wpd_query_vars\' , 10, 1 );
仅此一项并不能起多大作用,您必须检查是否存在与您的规则匹配的页面,如果不存在,则加载您的文件parse_request 行动

function wpd_parse_request( $request ) {
    // if the rule was matched, the query var will be set
    if( isset( $request->query_vars[\'my_var\'] ) ){
        // check if a page exists, reset query vars to load that page if it does
        if( get_page_by_path( $request->query_vars[\'my_var\'] ) ){
            $request->query_vars[\'pagename\'] = $request->query_vars[\'my_var\'];
            unset( $request->query_vars[\'my_var\'] );
        // else load the file
        } else {
            include \'test.php\';
            die();
        }
    }
    return $request;
}
add_action( \'parse_request\', \'wpd_parse_request\' );