Umschreiben der Post-Schnecke vor dem Speichern der Post

8

Ich muss ein ACF-Feld innerhalb des Posts abrufen und den Slug (Permalink) des Posts ändern, bevor ich ihn in der Datenbank speichere. Was ist der Ansatz, um das zu erreichen? Ich muss den Slug bei jedem Erstellen / Bearbeiten von Post-Vorgängen ändern.

Vit Kos
quelle

Antworten:

16

Das Folgende ist eher als Proof of Concept zu verstehen als als eine Lösung zum Kopieren / Einfügen.
Davon abgesehen würden Sie so vorgehen:

Die Aktion wird immer dann ausgeführt, wenn ein Beitrag aktualisiert oder erstellt wird. Sie können eine Rückruffunktion mit anhängen .save_post add_action

Daher müsste Ihr Fall ungefähr so ​​aussehen:

// initial hook
add_action( 'save_post', 'wpse105926_save_post_callback' );

function wpse105926_save_post_callback( $post_id ) {

    // verify post is not a revision
    if ( ! wp_is_post_revision( $post_id ) ) {

        // unhook this function to prevent infinite looping
        remove_action( 'save_post', 'wpse105926_save_post_callback' );

        // update the post slug
        wp_update_post( array(
            'ID' => $post_id,
            'post_name' => 'some-new-slug' // do your thing here
        ));

        // re-hook this function
        add_action( 'save_post', 'wpse105926_save_post_callback' );

    }
}

Was oben etwas verwirrend sein könnte, ist das Auf- und Abhängen der Funktion von innen. Dies ist erforderlich, da wir aufrufen wp_update_post, um den Slug zu aktualisieren, wodurch die save_postAktion erneut ausgeführt wird.

Wenn WP den neuen Slug automatisch basierend auf dem Post-Titel generieren soll, übergeben Sie einfach eine leere Zeichenfolge:

wp_update_post( array(
    'ID' => $post_id,
    'post_name' => '' // slug will be generated by WP based on post title
));
Johannes Pille
quelle
Vielen Dank für das Konzept, es hat mir geholfen, den Prozess besser zu verstehen
Vit Kos
Die Frage bezieht sich auf ACF, speziell um das Feld (Wert) "abzurufen" und Ihr Konzept funktioniert in PHP und verfehlt genau das, was Sie als "Mach dein Ding hier" kommentiert haben. Können Sie auch einen Proof of Concept für den Abruf werfen? (Denken Sie daran, dass das Feld #postname erst vorhanden ist, wenn auf die Schaltfläche "Bearbeiten" (Permalink) geklickt wird. Gleiches gilt für das unsichtbare Feld # new-post-slug.)
Sergio
Könnte ich dies nicht auch tun, indem ich einen wp_insert_post_dataFilter verwende, der nach dem Desinfizieren direkt vor dem Speichern ausgeführt wird? Was ist der größte Vorteil dieser Methode.
Toni_lehtimaki
2

Ich brauchte das gleiche, außer dass es nur für die Post-Erstellung war.

Ich habe die Lösung hier implementiert (diese ist kopier- / einfügefertig 😉).

Entfernen Sie einfach die Zeile, in der überprüft wird, ob beide Daten gleich sind, und der Slug wird auch für Bearbeitungsvorgänge aktualisiert. Ich empfehle dies jedoch nicht, da dadurch die URL des Beitrags geändert wird und dies nicht gut für die Suchmaschinenoptimierung ist, unter anderem für defekte Links (404).

IvanRF
quelle