覆盖WordPress的URL重写不起作用

时间:2015-11-04 作者:CapitanFindus

我想做的很简单,但不起作用,我不知道这是Wordpress重写还是我做错了。

我拥有的是以下url:

http://www.example.com/newsletter/?ut=token
我想要.htaccess 按以下方式编写:

http://www.example.com/newsletter/confirm/token
同样的道理:

http://www.example.com/newsletter/?uc=token
应重写为:

http://www.example.com/newsletter/delete/token
这是我的真实.htaccess:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteRule ^newsletter/confirm/(.+)/?$ index.php?page_id=4058&ut=$1 [L,NC]
RewriteRule ^newsletter/delete/(.+)/?$ index.php?page_id=4058&del=$1 [L,NC]

RewriteRule ^index\\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
4058是新闻稿页面的id。我也尝试过:

RewriteRule ^newsletter/confirm/(.+)/?$ newsletter/?ut=$1 [L,NC]
RewriteRule ^newsletter/delete/(.+)/?$ newsletter/?del=$1 [L,NC]
但它仍然不起作用。使用第一种方法,它转到没有查询字符串的新闻稿页面(因此它给出一个空页面);对于第二个,它给出404未找到。

我也尝试过使用Wordpress的内置功能add_rewrite_rule 没有成功,这就是我所尝试的:

function customRewriteRules(){
    add_rewrite_rule(\'^newsletter/confirm/(.+)/?\', \'index.php?page_id=4058&ut=$matches[1]\', \'top\');
    add_rewrite_rule(\'^newsletter/delete/(.+)/?\', \'index.php?page_id=4058&del=$matches[1]\', \'top\');
}
add_action(\'init\', \'customRewriteRules\');
这可能与Wordpress的基本重写条件的重写优先级有关吗?还是我只是做得不好?

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

WordPress在PHP中有自己的重写系统,因此您可以通过两种方式进行重写

如果您想从htaccess重写这些url,我只会让它重写

http://www.example.com/newsletter/confirm/tokenhttp://www.example.com/newsletter/?ut=token

而不是试图重写http://www.example.com/newsletter/confirm/tokenhttp://www.example.com/index.php?page_id=4058&ut=token

并让WordPress处理页面id重写。

因此htaccess规则是:

RewriteRule ^newsletter/confirm/(.+)/?$ /newsletter/?ut=$1 [L,NC]
或者,您可以在WordPress重写系统中定义重写规则:

add_rewrite_rule(\'^newsletter/confirm/(.+)/?$\', \'index.php?page_id=4058&ut=$matches[1]\', \'top\');
无论如何,要访问这个新的查询变量,您还必须在WordPress中声明它:

add_filter(\'query_vars\',\'my_add_ut_query_var\');

function my_add_ut_query_var($vars) {
    array_push($vars, \'designer\');
    return $vars;
}
现在,您可以从页面模板访问它:

$token = get_query_var(\'ut\')
当然,在添加新规则时,不要忘记刷新规则:)

(也要小心,你的ucut 参数)

相关推荐

如何在我的根域上组合WordPress htaccess+在子文件夹上组合php

我为一个看似重复的问题道歉,但我所看到的几十个问题中,没有一个是同样的问题。我有以下目录结构:/.htaccess /index.php /subfolder/.htaccess /subfolder/index.php 我希望所有页面请求都由/index.php, 除非请求启动/subfolder 在这种情况下,应由/subfolder/index.php.e、 g。/abc 将重写为/subfolder/abce、 g。/subfolder/def 将重写为/subf