7

次のサンプルプラグインは.htaccess、ユーザーがパーマリンク設定を変更したときにカスタムmod書き換えルールを追加します。

/* 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);
    }
}

これに関して私が見つけた2つの問題があります。

  1. デフォルトのパーマリンクに設定されている場合、ルールは追加されません。
  2. さらに重要なことに、ユーザーがパーマリンク設定を変更しない限り、ルールは追加されません。$wp_rewrite->flush_rules()(プラグインのアクティブ化で実行することで解決できます)

#2については、プログラムでルールを追加する良い方法があるかどうか疑問に思っています。

IIS(Windowsサーバーで一般的)はmod_rewriteをサポートしていません。

ソース:http ://codex.wordpress.org/Using_Permalinks#Permalinks_without_mod_rewrite

すべてのシステムがを使用しているわけではないようです.htaccess。したがって、ファイルを直接編集する.htaccessことは、分散プラグインにとって最良の選択ではない場合があります。知らない。おそらく、サーバーがApacheを使用しているかどうかを確認する必要があります。使用している場合は、.htacessが書き込み可能であり、既存のルールに追加ルールがないかどうかを確認する必要があります。最後に、ルールを追加できます。また、ユーザーがプラグインを非アクティブ化する場合、ルールを消去する必要があります。ですから、それはちょっと面倒です。

WordPressが組み込みのAPIなどで処理できるのであれば、WordPressにお任せしたいと思います。しかし、上記の例は私がこれまでに見つけたものでした。だから私はあなたの情報に感謝します。

アップデート

pfefferle示唆したように、私はを使用できます$wp_rewrite->flush_rules()。ただし、問題#1はまだ解決していません。デフォルトのパーマリンク設定が使用されている場合は、効果がありません。何か案は?

/* Plugin Name: Sample Mod Rewrite  */

$custom_mod_rewrite = new custom_mod_rewrite;
register_activation_hook( __FILE__, array($custom_mod_rewrite, 'flush_rewrite_rules'));
register_deactivation_hook( __FILE__, array($custom_mod_rewrite, 'flush_rewrite_rules'));
add_action('generate_rewrite_rules', array($custom_mod_rewrite, "generate_rewrite_rules"));

class custom_mod_rewrite {
    function __construct() {
        $this->wp_rewrite = & $GLOBALS["wp_rewrite"];
    }
    function flush_rewrite_rules() {
        $this->wp_rewrite->flush_rules();
    }
    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);
    }
}

また、プラグインを非アクティブ化しても、以前のルールに戻ることはありません。コーデックスの例に従い、プラグインを非アクティブ化するときにルールをフラッシュするように設定しました。したがって、追加されたルールを削除するためのコードが必要です。

補足として、コーデックスによると、

書き換えルールのフラッシュはコストのかかる操作です......プラグインのアクティベーションフックで、または書き換えルールを変更する必要があることがわかっている場合は、書き換えルールをフラッシュする必要があります

残りの問題:

  1. デフォルトのパーマリンクに設定されている場合、ルールは追加されません。
  2. プラグインを非アクティブ化しても、以前のルールに戻ることはありません。
4

3 に答える 3

3

残念ながら、現時点では効果的な解決策はないようです。

于 2012-10-19T22:34:45.397 に答える
2

いくつかの変更を追加した後、書き換えルールを「フラッシュ」する必要があります:http: //codex.wordpress.org/Function_Reference/flush_rewrite_rules

于 2012-10-11T10:01:53.710 に答える
1

ここで説明されているようなsymfonyのルーティングシステムを使用できます:http://pookey.co.uk/wordpress/archives/80-playing-with-symfony-routing-without-symfony

アイデアを実装するための簡単なプラグインを書くことができます。

編集:.htaccessを編集するプラグインがすでにあります。http://plugins.svn.wordpress.org/wp-htaccess-editor/trunk/例として使用してください。

注意:.htaccessを直接編集すると、Apacheユーザーがファイルへの書き込みアクセス権を持ち、これは危険な場合があります。しかし、私はあなたがすでにそれを知っていると思います。;)

于 2012-10-18T20:05:23.637 に答える