it-swarm.com.de

Die beste Möglichkeit, flush_rewrite_rules für benutzerdefinierte Post-Typen in einem Mu-Plugins-Plugin zu verwenden?

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 die beste Vorgehensweise für den Umgang mit flush_rewrite_rules () in dieser Situation? Für ein "normales" Plugin würden Sie dies in einem Aktivierungs-Hook tun - was für ein Muss-Plugin nicht möglich sein wird, da diese Hooks nicht verfügbar sind.

Da dies nach der Registrierung des benutzerdefinierten Beitragstyps ein "einmaliges" Ereignis sein soll, ist es sinnvoll, in meiner Klasse, in der die CPT registriert wird, Folgendes 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 findet also bei jeder 'Init'-Aktion statt. Wenn ich dieses Recht habe, werden die Rewrite-Regeln nur einmal gelöscht. Überhaupt .

Bin ich auf dem richtigen Weg?

(edit): Ich habe es gerade ausprobiert; Mein CPT gibt einen 404-Fehler aus, der nicht gefunden wurde. Daher funktionieren die Umschreiberegeln nicht :-(

(edit # 2): Ich habe die Lösung für den Zugriff auf die globale Variable ausprobiert, wie in dieser Frage gezeigt: Wie kann man Überschreibregeln auf mehreren Sites zuverlässig löschen? - Ich werde mein obiges Codebeispiel aktualisieren, um dies zu zeigen. Leider erhalte ich immer noch den Fehler 404, wenn ich versuche, einen CPT zu laden. Ich sehe, dass die Umschreiberegeln in der Datenbank gespeichert werden, es scheint nur, dass sie nicht verwendet werden. Ich bin verloren.

9
C C

Die flush_rewrite_rules Funktion ist in einigen Kontexten wie einem Theme oder einem Plugin, das auf Hooks basiert, zuverlässig, aber ich bin nicht sicher, ob sie für einen mu-plugin funktioniert.

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

  • rufen Sie die wp-settings.php-Datei auf
  • rufe den do_action( 'muplugins_loaded' ); hook auf, hier wird dein plugin initialisiert
  • $GLOBALS['wp_rewrite'] = new WP_Rewrite(); aufrufen hier ist die Methode flush_rules initialisiert und ab sofort verfügbar
  • do_action( 'setup_theme' ); wird aufgerufen und ich wette mein ganzes Geld, dass bei diesem Hook der flush_rewrite_rules 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', '' );

Immer wenn WordPress den rewrite_rules fehlt, baut es sie wieder auf. Dies ist auch die flush_rules-Methode.

Es gibt Punkte im WordPress-Ausführungsfluss, 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 wiederherzustellen. Wie ich sehen kann, möchten Sie sie nur beim ersten Anruf spülen, und das ist eine gute Sache.

P.S: Ich bin kein solcher Fan von Eigenwerbung, aber ich habe auch vor langer Zeit einen Artikel darüber geschrieben, und ich denke, er steht immer noch dafür

2
Andrei

Wenn dein mu-Plugin Optionen hat, würde ich das Flush gleich nach dem Update setzen:

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