添加_重写_规则不适用于页面变量

时间:2017-02-25 作者:Stephen

我有一个页面叫做mypage 和一个名为mycustomvar, 我正在尝试重写以下url:

http://example.com/index.php?name=mypage&mycustomvar=someword

http://example.com/mypage/someword
使用

add_rewrite_rule( \'^mypage/([^/]+)/?\', \'index.php?name=mypage&mycustomvar=$matches[1]\', \'top\' );
但我得到的只是:

http://example.com/mypage/?mycustomvar=someword
显示在url中。我还尝试将两者都添加到

add_rewrite_tag( \'%mycustomvar%\', \'([^/]+)\' );
以及确保mycustomvar 通过添加到我的自定义查询变量query_vars 滤器

(我已经尝试了各种组合,有无页面名称,以及使用pagepagename 代替name, 都没有运气)

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

好的,让我们首先对适当的查询变量进行一些明确的说明。

提到Post and Page parametersWP_Query 法典第页。

名称(字符串)-使用post slug。

pagename(字符串)-使用页段塞。

我们可以通过WP_Query:

$args = array(
    \'name\' => \'mypage\'
);
$mypage = new WP_Query( $args );

echo \'<pre>\';
print_r( $mypage );
echo \'</pre>\';
这将产生:

SELECT wp_posts.*
FROM wp_posts
WHERE 1=1
AND wp_posts.post_name = \'mypage\'
AND wp_posts.post_type = \'post\'
ORDER BY wp_posts.post_date DESC
它正在寻找mypagepost 岗位类型。如果我们将此更改为pagename, 它看起来像page 岗位类型。

它对主查询起作用的原因name 是由于redirect_guess_404_permalink 函数,该函数在原始请求为404时生效。它运行另一个查询来查找最近的匹配项,如果找到了什么,则重定向到那里。这也会导致从URL中删除任何额外的参数。

分层帖子类型需要注意的一点是,如果您的页面是另一个页面的子页面,则必须设置pagename 使用parent/child 路径,因为不同的父母可以有相同鼻涕虫的孩子。

对于您的问题,将查询变量更改为pagename 使用v4中的原始代码。7.2和216主题:

function wpd_mypage_rewrite() {
    add_rewrite_tag(
        \'%mycustomvar%\',
        \'([^/]+)\'
    );
    add_rewrite_rule(
        \'^mypage/([^/]+)/?\',
        \'index.php?pagename=mypage&mycustomvar=$matches[1]\',
        \'top\'
    );
}
add_action( \'init\', \'wpd_mypage_rewrite\' );
注意,我使用add_rewrite_tag 在这里您可以使用query_vars filter. 原因add_rewrite_tag 其工作原理是通过相同的过滤器在内部添加查询变量。

别忘了flush rewrite rules 添加/更改规则后。您也可以通过访问设置来执行此操作>;永久链接页面。

那么你可以echo get_query_var( \'mycustomvar\' ); 并输出值。

SO网友:Stephen

呃,我(也许)刚刚弄明白了。我不需要变量有名称,只需要一个位置。

因此,将我的重写规则更改为以下规则有效:

add_rewrite_rule( \'^mypage/([^/]+)/?\', \'index.php?pagename=mypage&$matches[1]\', \'top\' );
现在,我的页面将正确加载URL:

http://example.com/mypage/someword
尽管如此,我现在除了url位置之外没有其他方法来读取我的变量someword 用它做点什么,但我想这已经足够好了,除非有人能给我指出一种更好的方法,让我可以通过它的名称查询var。。。。

相关推荐