マルチサイトで書き換えルールを確実にフラッシュする方法は?


20

書き換えルールをフラッシュする必要があるプラグインがあるとします。アクティベーションフックとフラッシュレイトを追加することですべて適切に行うため、すべてがスムーズで互換性があります。

そして、ある晴れた日、誰かがそれをマルチサイトで実行しようとします。

次のような単純なシナリオの代わりに:

  1. WordPressサイトが作成されます
  2. プラグインがインストールされ、アクティブ化されています

次のような悪夢のシナリオがあります。

  1. プラグインがインストールされ、ネットワークがアクティブになりました
  2. マルチサイトの新しいWordPressサイト(または100)が作成されます

理論的には、うまくいくはずですよね?実際には、それは見事な方法で間違っています:

  • $wp_rewrite 状態は間違ったサイトからのものである可能性があります
  • switch_to_blog() 書き換え状態も追跡しません
  • 「後の」部分は別のブログで完全に発生する可能性があります
  • 他のすべてプラグインは、さまざまなサイトで一貫して有効になっていない可能性があります。

たとえば、この問題は、新しいサイトが作成されるたびに、メインサイトのパーマリンクが正しく表示されないことを示しています。

したがって、プラグインは、マルチサイトで書き換えルール確実にフラッシュする方法を説明します。

  1. 新しいサイトが作成されると、そのサイトは?
  2. 既存のサイトが非アクティブからアクティブになった場合、そのサイトはどうですか?
  3. すべてのサイトでプラグインがネットワークで有効化されるとき
  4. すべてのサイトでプラグインがネットワークで無効になっている場合
  5. おそらく他のシナリオで、グローバルコンテキストの書き換えが変更される可能性がありますか?

回答:


11

注:これは不完全な回答であり、段階的に拡張されます


プライマリおよび/または他のブログコンテキストのパーマリンク構造を破壊することなく、マルチサイトで書き換えルールをフラッシュする唯一の信頼できる方法(切り替え方法と切り替え方法によって異なります)は、特定のコンテキストで書き換えルールをフラッシュすることです:

global $wp_rewrite;
$wp_rewrite->init(); //important...
$wp_rewrite->flush_rules();

上記により、書き換えルールを構築し、データベースに変更をコミットする前に、特定のコンテキストの正しいパーマリンク構造が取得および設定されます。

コンテキストは1つしかないため、これはコンテキストが重要でない単一サイトには適用されません。

flush_rewrite_rules()私の意見では、正しいコンテキストを想定しているという前提で欠陥がありますが、switch_to_blogルールをフラッシュしようとすると、コンテキストを完全に変更し、危険な領域に私たちを残すことを考慮していません。

これは内部のflush_rewrite_rules()外観です:

function flush_rewrite_rules( $hard = true ) {
    global $wp_rewrite;
    $wp_rewrite->flush_rules( $hard );
}

このように見えるべきではない理由を考えることはできません。

function flush_rewrite_rules( $hard = true ) {
    global $wp_rewrite;
    $wp_rewrite->init(); //hello....
    $wp_rewrite->flush_rules( $hard );
}

...特にあなたがのコンストラクタWP_Rewriteが何をするかを考えるとき?これは...

public function __construct() {
    $this->init();
}

最初の懸念事項に触れてこの行をさらに進めて、

したがって、プラグインは、マルチサイトで書き換えルールを確実にフラッシュする方法について説明します。

  • 新しいサイトが作成されると、そのサイトは?

このプロセスでWordPressコアが特に呼び出すものを見てみましょう。

  • 最初 wpmu_create_blog()
  • それは次に呼び出しinstall_blog()、順番に呼び出しますpopulate_options()
  • 次にpopulate_options()、オプション表にデフォルトのパーマリンク構造を設定します
  • 実行した後install_blog()wp_install_defaults()呼び出されます
  • その後wp_install_defaults()、最終的にを介して現在のブログに戻る前に、新しく作成されたサイトの書き換えルールをフラッシュしrestore_current_blog()ます。

重要なのは、wp_install_defaults()上記で提案したとおりにルールをフラッシュすることです。

$wp_rewrite->init();
$wp_rewrite->flush_rules();

...これがpermalink_structure現在のコンテキストに合わせて正しいルールを構築するための唯一の方法だからです。

また、Githubの問題で明らかになった問題で、ユーザーが次の動作を経験した理由:

新しいサイトが作成されると、トップレベルのサイトでのみポストレベルのパーマリンクが破損します-ほとんどのパーマリンク構成ではすべてではありません:

これら2つの形式は正しく機能します。

デフォルト-期待どおりに動作します

曜日と名前-期待どおりに動作します

...プライマリブログにDay&Nameパーマリンク構造/%year%/%monthnum%/%day%/%postname%/がある場合、新しいサイトが作成されると、/%year%/%monthnum%/%day%/%postname%/デフォルトのDay&Nameパーマリンク構造にもなるため、Yoast SEOプラグインが書き換えをフラッシュするときに顕著な問題は発生しません。shutdownフックのルール。


正しく聞こえます。新しいサイトをインストールすることで厄介なことは、既に完了している場合にのみ、プロセス中にフックできないことです。そのため、ルールは2回フラッシュされます。
アントンティマーマンズ

バウンティタイムが尽きるので、ここで剣に落ちるためのポイント。:)しかし、まだ理解することはたくさんあります。:(
Rarst

$wp_rewrite各ネットワークサイトをループしてリセットできるように、コンテキストを手動で設定することはできませんか?カスタムプラグインでパーマリンクの問題が発生している大規模なネットワークサイトがあります。cronを追加するプラグインを作成すると、常にリセットされるため、過剰に思えます。カスタムURLでループするのが理想的ですが、すべてのサイトでそれを行う方法がわかりません。
アダムパターソン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.