muプラグインプラグインで、カスタム投稿タイプのflush_rewrite_rulesを使用する最良の方法は?


9

(とりわけ)カスタム投稿タイプをインスタンス化するプラグインを書いています。これはマルチサイトプラグインであり、mu-pluginsディレクトリにあります

この状況でflush_rewrite_rules()を処理するためのベストプラクティスは何ですか?「通常の」プラグインの場合、これはアクティベーションフックで行います。これらのフックは使用できないため、必須のプラグインでは不可能です。

これはカスタム投稿タイプを登録した後の「1回限りの」イベントであるため、CPTを登録するクラスで次のようなことを行うのは理にかなっています。

private function check_flush_my_CPT() {
    global $wp_rewrite;
    if ( !get_option('my_plugin_firstrun') ) {
        $wp_rewrite->init();
        $wp_rewrite->flush_rules(true);
        update_option('my_plugin_firstrun', 'yes');
    }
}

public function register_my_CPT() {
   // do all the CPT setup steps for the $args array...  

   register_post_type('my_CPT', $args);
   $this->check_flush_my_CPT();
}

add_action( 'init', array(&$this, 'register_my_CPT' ) );

したがって、CPT登録はすべての「init」アクションで発生しますが、この権限がある場合、書き換えルールのフラッシュは1回だけ発生します。 これまで

私は正しい軌道に乗っていますか?

(編集):試してみたところです。私のCPTは404 not foundエラーを出しているので、書き換えルールは機能していません:-(

(編集#2):私はこの質問に示すように、グローバル変数にアクセスするための解決策を試しました: マルチサイトで書き換えルールを確実にフラッシュする方法は?-上記のコード例を更新してこれを示します。残念ながら、CPTを読み込もうとすると、404エラーが発生します。書き換えルールがデータベースに保存されているようですが、使用されていないようです。道に迷いました。



これを行う適切な方法はありません。これはこのコメントを書いている時点では基本的に最高です。
Pieter Goosen 2015年

@PieterGoosen-ありがとう、私は以前にそれを見たので、他の解決策を検討するために質問を更新しました。まだ動かない。他の答えを見る前にflush_rewrite_rules()を実行して何かを壊したのだろうか?正しい手順を正確にテストするために、テストサイトを削除して再構築する必要があるのでしょうか。
CC

それは可能かもしれません。マルチサイトでフラッシュ書き換えルールを誤って実行すると、ネットワーク内のすべての書き換えルールが壊れる可能性があります。もしあなたがどこにいるのなら、私は新鮮に始めます。これがライブサイトではなくローカルインストールの終了であることを願っています;-)
Pieter Goosen

そう...私がやってみます いいえ、それはテストサイトであり、DBを一掃して、ネットワーク設定をスリープ状態に再設定できると思います。:-)
CC

回答:


2

flush_rewrite_rules機能は、テーマやフックに基づくプラグインなどの一部のコンテキストで信頼できますが、それが動作するかどうかはわかりませんmu-plugin

私の声明は、WordPressがこのように初期化されているという事実に基づいています。

  • を呼び出す wp-settings.phpファイルを
  • を呼び出す do_action( 'muplugins_loaded' );フックをます。ここでプラグインが初期化されます
  • $GLOBALS['wp_rewrite'] = new WP_Rewrite();ここでメソッドを呼び出しますflush_rules今から初期化して提供されています
  • do_action( 'setup_theme' );と呼ばれ、このフックでflush_rewrite_rulesうまくいくことをすべてのお金を賭けます

解決?

個人的には、rewrite_rulesオプションの削除は信頼できると思います。

delete_option('rewrite_rules');

または

update_option('rewrite_rules', '' );

WordPressに不足が生じると、WordPressはrewrite_rulesそれらを再構築しますが、これもflush_rulesメソッドが行うことです。

WordPressの実行フローには、このような機能が利用できない箇所があります。WordPressの中核でもこのステートメントを見つけました

// Rewrite rules can't be flushed during switch to blog.
delete_option( 'rewrite_rules' );

唯一の問題はパフォーマンスです。それを構築するのは難しいプロセスなので、すべてのリクエストでこれを実行しないでください。私が見ることができるように、あなたは最初の呼び出しでのみそれらをフラッシュしたいので、これは良いことです。

PS:私はそれほどセルフプロモーションのファンではありませんが、このことについての記事も書いています。


0

muプラグインにオプションがある場合、それらを更新した直後にフラッシュを配置します。

update_option( 'my_options', $values );
// Flush rules after install
flush_rewrite_rules();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.