web-dev-qa-db-ja.com

Mu-pluginsプラグインで、カスタム投稿タイプのflush_rewrite_rulesを作成するための最良の方法は?

私は(とりわけ)カスタム投稿タイプをインスタンス化するプラグインを書いています。これはマルチサイトプラグインで、ディレクトリ 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エラーが発生しました。書き換えルールはデータベースに格納されているようですが、使用されていないようです。道に迷いました。

9
C C

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がそれらを再構築するrewrite_rulesを欠いているときはいつでも、これもflush_rulesメソッドがすることです。

WordPressの実行フローには、このような機能が利用できない点があります。 WordPressの中核でも、私はこの文を見つけました

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

唯一の問題はパフォーマンスです。すべてのリクエストでこれを実行しないでください。ビルドするのは難しいプロセスです。私が見ることができるようにあなたは最初の電話でのみそれらを洗い流したいと思っています、そしてこれは良いことです。

P.S:私はそのような自己宣伝ファンではありませんが、この昔に 記事 を書いたこともありますが、それでもまだこれを支持すると思います

2
Andrei

あなたのmu-pluginがオプションを持っているならば、私はそれらを更新した直後にフラッシュを置くでしょう:

update_option( 'my_options', $values );
// Flush rules after install
flush_rewrite_rules();