0

我正在尝试在不直接修改.htaccess文件的情况下修改 WordPress 中的 mod 重写规则。根据这个网页似乎是可能的: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-rewritehttp://siteurl/simple-redirect/?sample-mod-rewrite.php浏览器只显示 404 错误, “找不到对象!” 我想我一定做错了什么。

该部分array(&$this, 'generate_rewrite_rules')看起来像传递一个类方法,但网页没有说明任何有关创建类的信息。这应该很简单。

谢谢。

4

2 回答 2

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...

于 2012-10-08T07:47:36.343 回答
-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);
    }
}
于 2012-10-10T16:22:27.443 回答