Wie schreibe ich Rewrite-Regeln zuverlässig auf Multisite?

20

Angenommen, Sie haben ein Plugin, mit dem Sie die Umschreiberegeln leeren müssen. Mit dem Aktivierungshaken und dem späten Hinzufügen von Flush machen Sie alles richtig, sodass alles reibungslos und kompatibel ist.

Und dann, eines schönen Tages, versucht jemand, es auf mehreren Sites auszuführen.

Anstelle eines einfachen Szenarios wie:

  1. WordPress-Site wird erstellt
  2. Plugin ist installiert und aktiviert

Sie haben jetzt Albtraumszenarien wie:

  1. Das Plugin ist installiert und das Netzwerk aktiviert
  2. Eine neue WordPress-Site (oder hundert) mit mehreren Sites wird erstellt

Theoretisch sollte es einfach funktionieren, oder? In der Praxis geht es auf spektakuläre Weise schief:

  • $wp_rewrite Zustand kann von der falschen Seite sein
  • switch_to_blog() verfolgt auch nicht den Umschreibungsstatus
  • Der "spätere" Teil könnte in einem ganz anderen Blog vorkommen
  • Alle anderen Plugins, mit denen Sie gut spielen sollten, sind möglicherweise auf verschiedenen Websites nicht konsistent aktiviert

In diesem Problem wird beispielsweise gezeigt, wie bei jedem Erstellen einer neuen Website Permalinks auf der Hauptwebsite ausgeblasen werden .

Wie würde Plugin gehen zuverlässig Spülung Rewrite - Regeln in mehreren Systemen :

  1. Wann wird eine neue Site für die Site erstellt?
  2. Wenn die vorhandene Site von inaktiv aus für die Site aktiviert wurde?
  3. Wann ist das Plugin für jede Site im Netzwerk aktiviert?
  4. Wenn das Plugin Netzwerk deaktiviert ist, für jede Site?
  5. Möglicherweise in anderen Szenarien, in denen der globale Kontext geändert wird?
Rarst
quelle

Antworten:

11

Hinweis: Dies ist eine unvollständige Antwort, die schrittweise erweitert wird


Die einzig verlässliche Möglichkeit, Überschreibungsregeln in Multisite-Umgebungen zu löschen, ohne die Permalink-Struktur des primären und / oder eines anderen Blog-Kontexts zu zerstören (abhängig davon, wie und wovon Sie wechseln), besteht darin, Überschreibungsregeln in einem bestimmten Kontext wie diesem zu löschen :

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

Das Obige stellt sicher, dass die richtige Permalink-Struktur für den angegebenen Kontext abgerufen und festgelegt wird, bevor die Umschreiberegeln erstellt und die Änderungen in die Datenbank übernommen werden.

Dies gilt nicht für einzelne Sites, bei denen der Kontext keine Rolle spielt, da nur ein Kontext vorhanden ist.

flush_rewrite_rules()Meiner Meinung nach ist die Prämisse fehlerhaft, dass sie den korrekten Kontext annimmt, aber nicht berücksichtigt, switch_to_blogwofür unsere Verwendung den Kontext vollständig ändert und uns in gefährlichem Gebiet zurücklässt, wenn wir versuchen, möglicherweise Regeln zu löschen.

So sehen die Interna von flush_rewrite_rules()aus:

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

Ich kann mir keinen Grund vorstellen, warum es nicht so aussehen sollte:

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

... vor allem wenn man bedenkt, dass der Konstruktor von WP_Rewritewas macht? Es macht das ...

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

Berühren Sie Ihren ersten Punkt der Besorgnis, um diese Linie zu fördern.

Wie würden Plugin um zuverlässig Spülung Rewrite - Regeln in gehen Multi - Site :

  • Wann wird eine neue Site für die Site erstellt?

Schauen wir uns an, was der WordPress-Kern während dieses Prozesses besonders aufruft:

  • zuerst wpmu_create_blog()
  • was dann ruft install_blog()was wiederum ruftpopulate_options()
  • populate_options()Setzt dann die Standard-Permalink-Struktur in der Optionstabelle
  • nachdem install_blog()lief, wird wp_install_defaults()dann angerufen
  • Anschließend werden wp_install_defaults()die Umschreiberegeln für die neu erstellte Site gelöscht, bevor schließlich über zum aktuellen Blog zurückgeschaltet wird restore_current_blog().

Wichtig zu beachten ist, dass wp_install_defaults()Flush-Regeln genau so sind, wie ich oben vorgeschlagen habe:

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

... weil nur so sichergestellt werden kann, dass die richtigen permalink_structureRegeln für den aktuellen Kontext erstellt werden.

Auch bei dem im Github-Problem aufgezeigten Problem trat der Grund, warum der Benutzer das folgende Verhalten auf:

Wenn eine neue Site erstellt wird, werden die Post-Level-Permalinks nur auf der Top-Level-Site unterbrochen - in den meisten Permalink-Konfigurationen, jedoch nicht in allen:

Diese beiden Formate funktionieren korrekt.

Standard - Funktioniert wie erwartet

Tag & Name - Funktioniert wie erwartet

... liegt daran, dass das primäre Blog bei der Erstellung /%year%/%monthnum%/%day%/%postname%/einer neuen Site /%year%/%monthnum%/%day%/%postname%/standardmäßig über eine Day & Name-Permalink-Struktur verfügt, weshalb sich kein nennenswertes Problem ergibt, wenn das Yoast-SEO-Plugin das Neuschreiben leert Regeln am shutdownHaken.

Adam
quelle
Hört sich richtig an. Ärgerlich bei der Installation einer neuen Site ist, dass Sie während des Vorgangs keine Hooks erstellen können, solange diese noch nicht abgeschlossen sind. Aus diesem Grund werden die Regeln zweimal gelöscht.
Anton Timmermans
Die Kopfgeldzeit ist abgelaufen, daher gibt es hier Punkte, um auf das Schwert zu fallen. :) Trotzdem gibt es noch viel herauszufinden. :(
Rarst
Ist es nicht möglich, den Kontext manuell so einzustellen $wp_rewrite, dass Sie die einzelnen Netzwerkstandorte durchlaufen und zurücksetzen können? Ich habe eine große Netzwerk-Site, die unter einigen Permalink-Problemen mit benutzerdefinierten Plugins leidet. Ein Plugin zu erstellen, das einen Cron hinzufügt, scheint übertrieben, da es sie immer zurücksetzen würde. Es wäre ideal, sie mit einer benutzerdefinierten URL zu versehen, aber ich weiß nicht, wie ich das für alle Websites tun soll.
Adam Patterson