在WordPress中将mod_rewrite规则添加到.htaccess

时间:2012-10-08 07:26:23

标签: php mod-rewrite wordpress-plugin wordpress

我正在尝试修改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')看起来像传递类方法,但网页没有说明创建类的任何信息。它应该非常简单。

感谢。

2 个答案:

答案 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);
    }
}