Der beste Weg, um flush_rewrite_rules für benutzerdefinierte Post-Typ, in einem mu-plugins-Plugin?

Ich schreibe ein Plugin, das (unter anderem) einen benutzerdefinierten Post-Typ instanziiert. Es ist ein Multisite-Plugin und lebt im Verzeichnis mu-plugins .

Was ist die beste Vorgehensweise beim Umgang mit flush_rewrite_rules () in dieser Situation? Für ein “normales” Plugin würden Sie dies in einem Aktivierungs-Hook machen – was für ein Must-Use-Plugin nicht möglich sein wird, da diese Hooks nicht verfügbar sind.

Da dies nach der Registrierung des benutzerdefinierten Post-Typs ein “einmaliges” Ereignis sein soll, wäre es sinnvoll, so etwas in meiner class zu tun, die das CPT registriert:

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 findet also bei jeder ‘init’-Aktion statt – aber wenn ich das richtig verstanden habe, passiert das Umschreiben der Regeln nur einmal. Immer .

Bin ich auf dem richtigen Weg?

(bearbeiten): Ich habe es gerade versucht; Mein CPT gibt einen Fehler 404 nicht gefunden, so dass die Rewrites-Regeln nicht funktionieren 🙁

(Edit # 2): Ich habe versucht, die Lösung für den Zugriff auf die globale Variable wie in dieser Frage gezeigt: Wie zuverlässig überschreiben Regeln auf Multisite? – Ich werde mein Codebeispiel oben aktualisieren, um dies zu zeigen. Leider bekomme ich immer noch 404 Fehler beim Versuch, einen CPT zu laden. Ich sehe, dass die Rewrite-Regeln in der database gespeichert werden, es scheint nur, dass sie nicht verwendet werden. Ich bin verloren.

Solutions Collecting From Web of "Der beste Weg, um flush_rewrite_rules für benutzerdefinierte Post-Typ, in einem mu-plugins-Plugin?"

Die function flush_rewrite_rules ist in manchen Kontexten zuverlässig wie ein Theme oder ein Plugin, das auf Hooks basiert, aber ich bin nicht sicher, ob es für ein mu-plugin

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

  • Rufen Sie die Datei wp-settings.php
  • rufe die do_action( 'muplugins_loaded' ); hook, hier wird dein Plugin initialisiert
  • call $GLOBALS['wp_rewrite'] = new WP_Rewrite(); Hier wird die Methode flush_rules initialisiert und steht ab sofort zur Verfügung
  • do_action( 'setup_theme' ); heißt und ich wette mein ganzes Geld, dass an diesem Haken die flush_rewrite_rules funktionieren

Lösung?

Persönlich finde ich die Löschung der rewrite_rules Option zuverlässig.

 delete_option('rewrite_rules'); 

oder

 update_option('rewrite_rules', '' ); 

Wann immer WordPress die rewrite_rules fehlen wird, wird es sie zurück bauen, das ist auch, was die flush_rules Methode tut.

Es gibt Punkte im WordPress-Ausführungsfluss, wo functionen wie diese nicht verfügbar sind. selbst im core von WordPress fand ich diese Aussage

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

Das einzige Problem wäre die performance, tun Sie dies nicht bei jeder Anfrage, weil es ein schwieriger process ist, sie wieder aufzubauen. Wie ich sehen kann, möchten Sie sie nur beim ersten Anruf löschen und das ist eine gute Sache.

PS: Ich bin nicht so ein Self-Promofan, aber ich habe auch schon vor langer Zeit einen Artikel darüber geschrieben, und ich denke, dass er immer noch dafür einsteht

Wenn Ihr mu-plugin Optionen hat, würde ich die flush gleich nach der Aktualisierung setzen:

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