0

.htaccessファイルを直接変更せずに、WordPress の mod 書き換えルールを変更しようとしています。この Web ページによると可能のようです: WordPress の .htaccess に mod_rewrite ルールを追加します。指示に従い、次のようにプラグインを作成しました。ファイル名を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')はクラス メソッドを渡すように見えますが、Web ページはクラスの作成について何も伝えていません。それは本当に単純なはずです。

ありがとう。

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 に答える