跳到编辑8看我如何解决这个问题
假设我有一个Wordpress博客:www.animals.com
。我的主题目录中有一个PHP文件:www.animals.com/wp-content/themes/mytheme/db.php
。此外,我有一个该页面的自定义模板,因此我在Wordpress管理面板中创建了一个新页面,以显示db.php
:www.animals.com/database
。
因此,如果我想阅读有关狮子的内容,我只需转到:www.animals.com/database/?animal=lion
(因为这是我决定编写PHP的方式,将$ _GET ['animal']的值插入到查询中,使用PDO等。)。
现在,我想以www.animals.com/database/?animal=lion
的身份访问www.animals.com/lion
。
我应该使用.htaccess还是Wordpress Rewrite?我应该将我的.htaccess放在Wordpress文件夹的根目录中(使用wp-config.php和那些文件)还是放在我的主题目录中?
默认情况下,来自root的那个有RewriteBase /
和来自Wordpress的东西。我应该写什么来实现我想要的?我应该把它放在现有代码之前还是之后?
编辑:这是我的 public_html .htaccess,这是我真正想做的事情:
我有一个网站:www.domain.com
,当您输入此http://www.domain.com/dios/?dios=agni
时,它会向您显示有关神Agni的信息。我想输入www.domain.com/dioses/agni
来访问有关神Agni的信息。 PHP文件位于www.domain.com/wp-content/themes/smitespain/dios.php
这不起作用x_x
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^dioses/(\w*)$ dios/?dios=$1 [NC,L]
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
EDIT2 :我正在使用多站点(检查EDIT4),同样,/ database / / dios /和/ dioses / 不我创建的实际文件夹,这是我在Wordpress中创建的页面的名称。问题是,现在它在标签标题中显示了神的名字:S表示变量$ _GET ['dios']已设置,但它不加载文件(dios.php)= /
EDIT3 :我需要专门访问domain.com/dios/?dios=agni,因为那是让PHP文件(dios.php)从wordpress加载get_header()的URL ,所以我无法直接访问该文件
EDIT4 :我决定删除多站点内容
EDIT5 :这些是我的Wordpress页面:
domain.com/dioses/
的{{1}}
(www.domain.com/wp-content/themes/smitespain/dioses.php)
domain.com/dios/?dios=thor
EDIT6 :我正在阅读wordpress codex中的内容。并意识到,如果我想转到(www.domain.com/wp-content/themes/smitespain/dios.php)
,我可以访问domain.com/dioses
或{ {1}}
所以,我在domain.com/index.php?pagename=dioses
和下一条规则之间添加了此内容:domain.com/?pagename=dioses
和Rewritebase /
将我重定向到RewriteRule example/test ?pagename=dioses
,但它也更改了地址栏中的网址:(
问题是,如果我尝试这个:domain.com/example/test
它会将我发送到'dios'页面,而不是'?dios = thor'
EDIT7 :我开始使用wordpress重写,我将其添加到我的主题函数中.php:
domain.com/dioses
再次..加载页面dios,没有?dios = agni
EDIT8 :最后,我设法让它工作=)
我需要知道的第一件事是,新RewriteRule example/test ?pagename=dios&dios=thor
将不再可用于function my_rewrite_rules() {
add_rewrite_rule(
'blah',
'index.php?pagename=dios&dios=agni',
'top'
);
}
add_action( 'init', 'my_rewrite_rules' );
,而是需要调用?dios=XXXX
,所以我将其添加到我的主题的functions.php
$_GET['dios']
我确保$wp_query->query_vars['dios']
实际设置为
然后我只添加常规规则
答案 0 :(得分:3)
还有另一种解决方法,无需触及WordPress。
添加到.htaccess
RewriteRule ^lion /indexw.php?pagename=db&dios=$1 [L,E=URI:/detail/]
创建文件indexw.php:
<?php $_SERVER["REQUEST_URI"] = $_SERVER["REDIRECT_URI"]; include("index.php");
它是如何工作的? mod_rewrite按照E = URI:value参数中的指定设置REDIRECT_URI。 indexw.php只是用正确的值覆盖REQUEST_URI(感谢Ravi Thapliyal对此有所了解)
答案 1 :(得分:1)
WordPress将根目录的全局重定向放在未识别的所有内容上,即不是现有文件或其/index.php
的文件夹。另一方面,您现在想要将它们重定向到?animal=unidentified
。因此,除非修复动物关键字列表,否则任何提议的解决方案都可能会破坏您的WordPress。
如果你喜欢10多只动物,你可以将它们添加到你的.htaccess(在root /)
RewriteEngine on
RewriteBase /
RewriteRule ^(lion|leopard|tiger|dog|cat)/?$ database/?animal=$1 [NC,L]
# WordPress rules come here
对于40多只动物,我建议你为你的动物设一个目录(不需要存在)。
RewriteRule ^a/(.+?)/?$ database/?animal=$1 [NC,L]
这会将任何/a/critter
重定向到database/?animal=critter
,您不必再手动将它们添加到.htaccess中。您也可以将两个规则共存,这样如果您尚未修改/panther
的.htaccess,但仍可以/a/panther
访问它。
修改强>
好的,我调查了它,如果没有编写PHP脚本来拦截此请求并将其转发到index.php
,则无法实现。以下是mutisite的工作原理:因为,你的重写没有一个匹配到index.php
; WordPress的PHP代码的入口点。在深处,代码检查REQUEST_URI标头以查看它是否与您的多个站点(/dios
)匹配,如果匹配,则将请求转发到配置的页面(dios.php
)。
当我们为/dioses/agni
执行.htaccess重定向时,我们可以点击index.php
(通过删除[L]),但REQUEST_URI标头仍然保持不变(/ dioses / agni)并且它没有配置mulisite。因此,重定向失败。
答案 2 :(得分:1)
RewriteEngine On
RewriteCond %{QUERY_STRING} ^$
RewriteRule ^www\.animals\.com/lion$ /www.animals.com/database/?animal=lion [R=301,NE,NC,L]
只需使用此代码即可。我希望它会奏效。
答案 3 :(得分:0)
通过调用add_filter('rewrite_rules_array', function() {})
或调用add_rewrite_rule()
都无法进行URL重写。显然那是因为打开前端网站页面时从未触发过过滤器'rewrite_rules_array'
,所以没有生成重写。
解决方案是转到管理区域,然后打开页面设置->永久链接。每当我想更改重写时,都需要这样做。
我不知道香草味的Wordpress是否可以那样工作,这可能是由已安装的插件/主题引起的。