web-dev-qa-db-ja.com

add_rewrite_rule、プラグインの有効化とプラグインの無効化

initフックでadd_rewrite_ruleを呼び出す例をたくさん見ています。

function add_my_custom_rewrite()
{
   add_rewrite_rule(...
}

add_action('init', 'add_my_custom_rewrite');

そしてあなたのプラグインアクティベーションフックでは、

register_activation_hook( __FILE__, 'my_plugin_activation');

function my_plugin_activation()
{
   add_my_custom_rewrite();
   flush_rewrite_rules(false);
}

だから、あなたのプラグインがアクティブになったとき、あなたは書き換えがdbにフラッシュされるでしょう、動作しているようです、しかし、主な問題があります

まだプラグインを無効にしたときに書き換えを削除するという問題は解決されていません。無効化の前にinitが既に呼び出されているのでflush_rewrite_rulesを無効化フックに配置することはできません。

register_deactivation_hook( __FILE__, 'my_plugin_deactivation');

function my_plugin_deactivation()
{
   flush_rewrite_rules(false); // will not work, since init (hence add_my_custom_rewrite) was already called at this point
}

Add_rewrite_rule、プラグインの有効化、およびプラグインの無効化の間の競合を解決するためのより良い方法はありますか?

3
Howard

flush_rewrite_rules()を呼び出すことの問題はあなたのプラグインのフックがまだアクティブである間ルールが即座に再生成されることです。

私が通常するのは、成功への最も簡単な方法なので、有効化/無効化のrewrite_rulesオプションを削除することです。ルールは現在のページロードではなく次のページロードで再生成されます。

register_deactivation_hook( __FILE__, 'my_plugin_deactivation');
function my_plugin_deactivation() {
   delete_option( 'rewrite_rules' );
}

より理想的な解決策はフラッシュする前にスタックからあなたのルールを削除することですが、それはするのがちょっと面倒です( https://core.trac.wordpress.org/ticket/29118 )。

2
Matthew Boynes