Permalinks aktualisieren, wenn eine neue Kategorie zur Taxonomie des benutzerdefinierten Posttyps hinzugefügt wurde

Hinweis: Diese Frage erscheint auch auf https://stackoverflow.com/questions/44060613/update-permalinks-when-new-category-added-to-custom-post-type-taxonomy (wird aber nicht viel Liebe).

Ich habe eine Sammlung von benutzerdefinierten Post-Typen (CPT) für ein WordPress-Thema erstellt, an dem ich gerade arbeite (zusammen mit ihren eigenen Taxonomien und Tags). Für diese Frage werde ich mich nur auf den CPT der Projekte konzentrieren.

Wenn eine neue Projektkategorie hinzugefügt und dann im Navigationsmenü verknüpft wird, wird dem Benutzer ein 404-Fehler angezeigt, bis Permalinks gespeichert werden. Dadurch wird das Routen-Caching von WordPress gelöscht.

Ich dachte, der beste Weg, dies zu erreichen, wäre es, flush_rewrite_rules () zu verwenden;

Obwohl ich sage, dass ich es als Best Practice nicht leicht nehme, empfehle ich dringend, diese function nur zu verwenden, wenn ein Plugin aktiviert / deaktiviert wird. https://codex.wordpress.org/Function_Reference/flush_rewrite_rules#Usage

Ich möchte die Aktion aktivieren, die beim Erstellen einer neuen CPT-Kategorie ausgetriggers wird (entweder über den Post- oder den Admin-Bildschirm) und dann den Flush-Rewrite für diese Aktion ausführen, damit sich der WP-Administrator nicht darum kümmern muss Erzwingt WordPress Route Caching per Update auf Permalinks.

Ich habe diesen Hook auf Add New Category für eine mögliche Lösung angeschaut und versucht, diesen Code zu verwenden:

function custom_created_term( $term_id, $tt_id, $taxonomy ) { $project_cpt = 'CPT_PROJECT'; // Edit this to your needs $project_tax = 'TAX_PROJECT_CATS'; // Edit this to your needs if( DOING_AJAX && $project_tax === $taxonomy ) { // Try to get the post type from the post id in the referred page url // Example: /wp-admin/post.php?post=2122&action=edit&message=1 parse_str( parse_url( wp_get_referer(), PHP_URL_QUERY ) , $params ); if( isset( $params['post'] ) ) { $post_id = intval( $params['post'] ); if( $post_id > 0 && $project_cpt === get_post_type( $post_id ) ) { flush_rewrite_rules(true); } } } } 

Aber es funktioniert nicht wirklich für mich. Ich bin mir nicht sicher, ob ich hier das richtige Werkzeug benutze oder ob ich etwas falsch mache. Ich habe schon ein wenig nach der Lösung gesucht, aber ich habe hier keine gute Lösung für mein Problem gefunden (kann keinen Haken finden, um neue CPT-Kategorien zu erstellen).

Solutions Collecting From Web of "Permalinks aktualisieren, wenn eine neue Kategorie zur Taxonomie des benutzerdefinierten Posttyps hinzugefügt wurde"

So funktionieren benutzerdefinierte Taxonomien und Post-Typen nicht

Das ist was du tust:

  • Rufen Sie register_custom_taxonomy oder register_post_type am init Hook auf
  • Wenn Sie Ihre Aufrufe von register_custom_taxonomy oder register_post_type ändern oder neue in Ihrem Code hinzufügen, generieren Sie Permalinks neu, indem Sie die Permalinks-Einstellungsseite aufrufen und auf Speichern klicken
  • Sie sind fertig

Wenn ich also die obigen Schritte befolge und eine neue Taxonomie namens colour erstelle, brauche ich keine Permalinks zu leeren, um red oder blue Terme zu erzeugen. Wenn ich eine brandneue Taxonomie mit dem Namen shape erstellen würde, würde ich die Permalinks leeren, aber nur einmal, dies ist so, dass ich 404 nicht bekomme, wenn ich Shape-Terme am Frontend besuche. Das Gleiche gilt für benutzerdefinierte Post-Typen

flush_rewrite_rules Sie, dass es sich bei flush_rewrite_rules um eine sehr teure function handelt, die Sie nie aufrufen sollten. Ein Beispiel dafür, wann es aufgerufen werden könnte, ist ein Plug-in-Aktivierungs-Hook, nachdem es zum ersten Mal installiert wurde, oder ein WP-CLI-Befehl.

Wie man die 404s vermeidet

Verwenden Sie register_activation_hook , um die Umschreibregeln zu register_activation_hook . Dies wird aufgerufen, wenn Ihr Plugin aktiviert ist (und nur die Zeit, zu der es aktiviert ist, nicht jedes Laden der Seite).

https://codex.wordpress.org/Function_Reference/register_activation_hook

Es ist unnötig und schädlich, auf die Schaffung jedes Begriffs zu verzichten

Was passiert, wenn ich mein CPT / CT in einem Thema registriert habe?

Sie können den after_theme_switch Hook verwenden, um Regeln zu after_theme_switch , das Registrieren von Post-Typen und Taxonomien in einem Theme ist jedoch eine schlechte Übung. Es verursacht Probleme mit der Datenportabilität, z. B. wenn ein Benutzer Themen wechselt, verlieren sie ihre Daten.

Themen bestimmen, wie eine Site aussieht, und functionalität, insbesondere Daten, sollte in Plugins definiert werden.

Ok, ziemlich einfache Lösung, die ich mir ausgedacht habe. Fügen Sie diesen Code einfach in meine includes innerhalb von function.php ein:

 add_action('wp_update_nav_menu_item', function () { flush_rewrite_rules(true); }, 10, 2); 

Dies hängt nur an der Aktualisierungsfunktion des Navigationsmenüs fest, so dass es jedes Mal ausgetriggers wird, wenn das Menü vom Admin-Benutzer aktualisiert wird.

Ich weiß, dass das “Flush Rewrite” eine “teure” function ist, aber es wird nur aufgerufen, wenn das Navigationsmenü aktualisiert wird, was nicht allzu oft der Fall sein wird.