我正在尝试修改WordPress中的mod重写规则,而不直接修改 .htaccess 文件。根据这个网页似乎有可能:Adding mod_rewrite Rules to .htaccess in WordPress。我按照说明创建了一个插件,如下所示。我将文件名保存为 sample-mod-rewrite.php 。
/* Plugin Name: Sample Mod Rewrite */
add_action('generate_rewrite_rules', array(&$this, 'generate_rewrite_rules'));
add_filter('mod_rewrite_rules', array(&$this, 'mod_rewrite_rules'));
function generate_rewrite_rules() {
global $wp_rewrite;
$non_wp_rules = array(
'simple-redirect/?$plugin_name' => 'http://google.com',
'one-more-redirect/?$plugin_name' => 'http://yahoo.com'
);
$wp_rewrite->non_wp_rules = $non_wp_rules + $wp_rewrite->non_wp_rules;
}
function mod_rewrite_rules($rules) {
$rules = preg_replace('/^(RewriteRule ^.*+/?$)plugin_name (/)(.*) ([QSA,L])$/im', '1 3 [R=301,L]', $rules);
return $rules;
}
它应该如何运作?激活插件后,当我访问 http:// siteurl / simple-redirect /?sample-mod-rewrite 或 http:// siteurl / simple-redirect /?sample-mod- rewrite.php 浏览器只显示404错误,“找不到对象!”。我想我一定是做错了。
部分array(&$this, 'generate_rewrite_rules')
看起来像传递类方法,但网页没有说明创建类的任何信息。它应该非常简单。
感谢。
答案 0 :(得分:2)
由于您的插件不使用类,因此您应该使用:
add_action('generate_rewrite_rules', 'generate_rewrite_rules');
add_filter('mod_rewrite_rules', 'mod_rewrite_rules');
mod_rewrite_rules
中使用的正则表达式并不正确,但我不能给你一个更好的正则表达,因为我不知道你真正想要达到的目标。
不要忘记重新生成.htaccess
文件。
编辑:
要重新生成.htaccess
文件,您只需访问永久链接设置。
函数generate_rewrite_rules
将在.htaccess
中添加以下规则:
RewriteRule ^simple-redirect/?$plugin_name /wordpress/http://google.com [QSA,L]
RewriteRule ^one-more-redirect/?$plugin_name /wordpress/http://yahoo.com [QSA,L]
mod_rewrite_rules
函数的目标是纠正这些规则,您可以尝试:
$rules = preg_replace('#^(RewriteRule \^.*/\?\$)plugin_name .*(http://.*) \[QSA,L\]#mi', '$1 $2 [R=301,L]', $rules);
然后规则将是:
RewriteRule ^simple-redirect/?$ http://google.com [R=301,L]
RewriteRule ^one-more-redirect/?$ http://yahoo.com [R=301,L]
因此,访问siteurl/simple-redirect/
会重定向到google.com
...
答案 1 :(得分:-1)
我发布了完整的代码。我把它包在了一堂课。
/* Plugin Name: Sample Mod Rewrite */
add_action('generate_rewrite_rules', array(new custom_mod_rewrite, "generate_rewrite_rules"));
class custom_mod_rewrite {
function __construct() {
$this->wp_rewrite = & $GLOBALS["wp_rewrite"];
}
function generate_rewrite_rules() {
$non_wp_rules = array(
'simple-redirect/?$plugin_name' => 'http://google.com',
'one-more-redirect/?$plugin_name' => 'http://yahoo.com'
);
$this->wp_rewrite->non_wp_rules = $non_wp_rules + $this->wp_rewrite->non_wp_rules;
add_filter('mod_rewrite_rules', array(&$this, "mod_rewrite_rules"));
}
function mod_rewrite_rules($rules) {
return preg_replace('#^(RewriteRule \^.*/)\?\$plugin_name .*(http://.*) \[QSA,L\]#mi', '$1 $2 [R=301,L]', $rules);
}
}