web-dev-qa-db-de.com

Aktualisieren Sie Permalinks, wenn der benutzerdefinierten Post-Typ-Taxonomie eine neue Kategorie hinzugefügt wird

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

Haben eine Sammlung von benutzerdefinierten Beitragstypen (CPT) für ein WordPress-Thema erstellt, an dem ich arbeite (zusammen mit ihren eigenen Taxonomien und Tags). Für den Zweck dieser Frage werde ich mich nur auf das CPT "Projekte" konzentrieren.

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

Ich dachte, der beste Weg, dies zu erreichen, wäre die Verwendung von flush_rewrite_rules ();

Wenn ich das sage, empfehle ich jedoch dringend, diese Funktion nur beim Aktivieren/Deaktivieren eines Plugins zu verwenden. https://codex.wordpress.org/Function_Reference/flush_rewrite_rules#Usage

Ich möchte mich in die Aktion einklinken, die ausgelöst wird, wenn eine neue CPT-Kategorie erstellt wird (entweder über den Post- oder den Admin-Bildschirm), und dann den Flush-Rewrite für diese Aktion ausführen, damit der WP admin nicht ' Sie müssen sich nicht darum kümmern, das Caching von Wordpress-Routen über die Aktualisierung von Permalinks zu erzwingen.

Ich habe in diesem Hook auf Add New Category nach einer möglichen Lösung gesucht 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 Tool verwende oder ob ich etwas falsch mache. Ich habe einiges nach der Lösung gesucht, aber ich habe hier keine gute Lösung für mein Problem gefunden (ich kann den Haken zum Erstellen neuer CPT-Kategorien nicht finden).

1
Ryan Coolwebs

So funktionieren benutzerdefinierte Taxonomien und Post-Typen nicht

Das machen Sie:

  • Rufen Sie am Hook initregister_custom_taxonomy oder register_post_type auf.
  • Wenn Sie Ihre Anrufe in register_custom_taxonomy oder register_post_type ändern oder neue in Ihren Code einfügen, generieren Sie Permalinks neu, indem Sie die Seite mit den Einstellungen für Permalinks aufrufen und auf Speichern klicken
  • Sie sind fertig

Wenn ich also den obigen Schritten folge und eine neue Taxonomie mit dem Namen colour erstelle, muss ich keine Permalinks leeren, um red oder blue zu erstellen. Wenn ich eine brandneue Taxonomie namens shape erstellen würde, würde ich die Permalinks leeren, aber nur einmal, damit ich keine 404 erhalte, wenn ich Formbegriffe im Frontend besuche. Gleiches gilt für benutzerdefinierte Beitragstypen

Denken Sie daran, dass flush_rewrite_rules eine sehr teure Funktion ist und Sie sie niemals aufrufen müssen. Ein Beispiel dafür, wann es aufgerufen werden könnte, ist ein Aktivierungs-Hook für Plugins nach der Erstinstallation oder ein WP CLI-Befehl.

Wie vermeide ich die 404

Verwenden Sie register_activation_hook, um die Umschreiberegeln zu löschen. Dies wird aufgerufen, wenn Ihr Plugin aktiviert ist (und nur die Zeit, zu der es aktiviert ist, nicht jede Seite wird geladen).

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

Es ist sowohl unnötig als auch schädlich, die Erstellung jedes Begriffs zu überfluten

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

Sie können den Haken after_theme_switch verwenden, um Überschreibungsregeln zu löschen. Das Registrieren von Beitragstypen und Taxonomien in einem Thema ist jedoch eine schlechte Praxis. Dies führt zu Problemen mit der Datenübertragbarkeit, z. Wenn ein Benutzer Themen ändert, verliert er seine Daten.

Themen bestimmen, wie eine Site aussieht, und Funktionen, insbesondere Daten, sollten in Plugins definiert werden.

1
Tom J Nowell

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

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

Dies hängt einfach mit der Aktualisierungsfunktion des Navigationsmenüs zusammen und wird jedes Mal ausgelöst, wenn das Menü vom Administrator aktualisiert wird.

Ich weiß, dass Flush Rewrite eine "teure" Funktion ist, aber sie wird nur aufgerufen, wenn das Navigationsmenü aktualisiert wird, was nicht allzu oft der Fall sein wird.

0
Ryan Coolwebs