Der beste Weg zu flush_rewrite_rules für einen benutzerdefinierten Beitragstyp in einem Mu-Plugins-Plugin?

9

Ich schreibe ein Plugin, das (unter anderem) einen benutzerdefinierten Beitragstyp instanziiert. Es ist ein Multisite-Plugin und befindet sich im Verzeichnis mu-plugins .

Was ist in dieser Situation die beste Vorgehensweise für den Umgang mit flush_rewrite_rules () ? Für ein "normales" Plugin würden Sie dies in einem Aktivierungs-Hook tun - was für ein Plugin, das unbedingt verwendet werden muss, nicht möglich ist, da diese Hooks nicht verfügbar sind.

Da dies nach der Registrierung des benutzerdefinierten Beitragstyps ein "einmaliges" Ereignis sein soll, wäre es sinnvoll, in meiner Klasse, die das CPT registriert, so etwas zu tun:

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' ) );

Die CPT-Registrierung erfolgt also bei jeder Init-Aktion. Wenn ich dieses Recht habe, erfolgt das Löschen der Umschreiberegeln nur einmal. Immer .

Bin ich auf dem richtigen Weg?

(bearbeiten): Ich habe es gerade versucht; Mein CPT gibt einen 404 nicht gefundenen Fehler aus, daher funktionieren die Umschreibregeln nicht :-(

(Bearbeiten # 2): Ich habe die Lösung für den Zugriff auf die globale Variable ausprobiert, wie in dieser Frage gezeigt: Wie werden Umschreibregeln auf mehreren Standorten zuverlässig gelöscht? - Ich werde mein Codebeispiel oben aktualisieren, um dies zu zeigen. Leider wird beim Laden eines CPT immer noch ein 404-Fehler angezeigt. Ich sehe, dass die Umschreiberegeln in der Datenbank gespeichert werden. Es scheint nur, dass sie nicht verwendet werden. Ich bin verloren.

CC
quelle
Es gibt wirklich keinen richtigen Weg, dies zu tun. Dies ist im Grunde das Beste zum Zeitpunkt des Schreibens dieses Kommentars.
Pieter Goosen
@PieterGoosen - danke, das habe ich früher gesehen und meine Frage aktualisiert, um die andere Lösung in Betracht zu ziehen. Funktioniert immer noch nicht. Ich frage mich, ob ich etwas kaputt gemacht habe, indem ich flush_rewrite_rules () ausgeführt habe, bevor ich die andere Antwort gesehen habe. Vielleicht muss ich meine Testseite löschen und neu einrichten, um das richtige Verfahren genau zu testen?
CC
Das könnte möglich sein. Wenn Sie Flush-Rewrite-Regeln auf einer Multisite falsch ausführen, können alle Rewrite-Regeln in Ihrem Netzwerk verletzt werden. Wenn ich wo du wäre, würde ich einfach neu anfangen. Hoffe nur, dass dies ein lokales Installationsende ist, keine Live-Site ;-)
Pieter Goosen
richtig ... ich werde das versuchen. Und nein, es ist eine Testseite und ich denke, ich kann die Datenbank jetzt löschen und die Netzwerkkonfiguration im Ruhezustand zurücksetzen! :-)
CC

Antworten:

2

Die flush_rewrite_rulesFunktion ist in einigen Kontexten zuverlässig, z. B. bei einem Thema oder einem Plugin, das auf Hooks basiert, aber ich bin mir nicht sicher, ob sie für a funktioniertmu-plugin

Meine Aussage basiert auf der Tatsache, dass WordPress auf diese Weise initialisiert wird:

  • Rufen Sie die wp-settings.phpDatei auf
  • Rufen Sie den do_action( 'muplugins_loaded' );Hook auf, hier wird Ihr Plugin initialisiert
  • Rufen Sie $GLOBALS['wp_rewrite'] = new WP_Rewrite();hier auf, die Methode flush_rulesist initialisiert und ab sofort verfügbar
  • do_action( 'setup_theme' );heißt und ich wette mein ganzes Geld, dass an diesem Haken der flush_rewrite_rulesWille funktioniert

Lösung?

Persönlich finde ich das Löschen der Option rewrite_rules zuverlässig.

delete_option('rewrite_rules');

oder

update_option('rewrite_rules', '' );

Wann immer WordPress fehlt rewrite_rules, baut es sie wieder auf, dies ist auch das, was die flush_rulesMethode tut.

Es gibt Punkte im Ausführungsablauf von WordPress, an denen solche Funktionen nicht verfügbar sind. Selbst im Kern von WordPress habe ich diese Aussage gefunden

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

Das einzige Problem wäre die Leistung. Tun Sie dies nicht bei jeder Anfrage, da es schwierig ist, sie wieder aufzubauen. Wie ich sehen kann, möchten Sie sie erst beim ersten Anruf spülen, und das ist gut so.

PS: Ich bin kein so selbstbewusster Fan, aber ich habe auch vor langer Zeit einen Artikel darüber geschrieben und ich denke, dass er immer noch dafür steht

Andrei
quelle
0

Wenn Ihr Mu-Plugin Optionen hat, würde ich den Flush direkt nach dem Update setzen:

update_option( 'my_options', $values );
// Flush rules after install
flush_rewrite_rules();
Leon Francis Shelhamer
quelle