Erzwingen Sie, dass der Post-Slug beim Speichern automatisch aus dem Titel generiert wird

8

Ich betreibe eine Immobilienseite, auf der viele Immobilien in Wohnblöcken verkauft werden.

Aus diesem Grund erstellen die Inhaltseditoren einen Beitrag / eine Eigenschaft mit allen Details und verwenden dann ein doppeltes Beitrags-Plugin, um die anderen zu erstellen.

Jedes Mal, wenn sie einen Beitrag / eine Eigenschaft duplizieren, ändern sie den Titel, um die Eigenschaftsnummer wiederzugeben, und ändern möglicherweise einige Bits des Metadaten-EG-Preises.

Was sie vergessen, ist, die Schnecke auszurotten und aus dem Titel eine neue zu generieren. Hier ist ein Beispiel für einen Slug aus der ersten eingegebenen Eigenschaft:

merle-court-plot-50-182-carlton-vale-nw6-5hh

aber dann, wenn sie duplizieren, werden die Schnecken:

merle-court-plot-50-182-carlton-vale-nw6-5hh-2
merle-court-plot-50-182-carlton-vale-nw6-5hh-2-2
merle-court-plot-50-182-carlton-vale-nw6-5hh-2-2-2
merle-court-plot-50-182-carlton-vale-nw6-5hh-2-2-2-2
etc

Aber wenn sie die Titel ändern, sind die Schnecken besser wie:

merle-court-plot-51-182-carlton-vale-nw6-5hh
merle-court-plot-52-182-carlton-vale-nw6-5hh
merle-court-plot-53-182-carlton-vale-nw6-5hh
merle-court-plot-54-182-carlton-vale-nw6-5hh
etc

Also meine Frage:

Wie erzwinge ich, dass der Slug beim Speichern nach dem Speichern neu generiert wird, nachdem der Eigenschaftstitel aktualisiert wurde?

Der Slug für dieses CPT sollte immer automatisch generiert werden. Es ist nie erforderlich, ihn manuell festzulegen.

Scott
quelle

Antworten:

16

Die einfachste Problemumgehung könnte sein:

function myplugin_update_slug( $data, $postarr ) {
    if ( ! in_array( $data['post_status'], array( 'draft', 'pending', 'auto-draft' ) ) ) {
        $data['post_name'] = sanitize_title( $data['post_title'] );
    }

    return $data;
}
add_filter( 'wp_insert_post_data', 'myplugin_update_slug', 99, 2 );
Eugene Manuilov
quelle
Wird auch wp_insert_post_datanach dem Update gefeuert? Der Beitrag wurde bereits durch den Vervielfältigungsprozess erstellt. Der Slug muss geändert werden, sobald der Beitrag mit dem richtigen Titel aktualisiert wurde.
Scott
NVM Ich fand die Antwort auf diesen Kommentar:A filter hook called by the wp_insert_post function prior to inserting into or updating the database.
Scott
Ja tut es. Immer wenn Sie einen Beitrag erstellen oder aktualisieren, wird dieser Filter ausgelöst.
Eugene Manuilov
1
Ich habe der if-Anweisung eine Überprüfung beigefügt, um sicherzustellen, dass ich auch auf meinem post_type bin.
Scott
8

Führen Sie den Slug außerdem sanitize_title_with_dashes()durch, wp_unique_post_slug()um sicherzustellen, dass er einzigartig ist. Es wird automatisch '-2', '-3' usw. angehängt, wenn es benötigt wird.

Pete Nelson
quelle
6

Anstatt Leerzeichen zu ersetzen, sollten Sie die eingebaute Funktion verwenden, sanitize_title()die das Ersetzen für Sie übernimmt.

So was:

sanitize_title( $post_title, $post->ID );

Außerdem sollten Sie eine einzigartige Schnecke verwenden. Was Sie mit der Funktion bekommen könnenwp_unique_post_slug()

Alles zusammen könnte eine Lösung sein:

function myplugin_update_slug( $data, $postarr ) {
    if ( ! in_array( $data['post_status'], array( 'draft', 'pending', 'auto-draft' ) ) ) {
        $data['post_name'] = wp_unique_post_slug( sanitize_title( $data['post_title'] ), $postarr['ID'], $data['post_status'], $data['post_type'], $data['post_parent'] );
    }

    return $data;
}
add_filter( 'wp_insert_post_data', 'myplugin_update_slug', 99, 2 );
jintux
quelle
Danke dafür! Ihre Änderung der akzeptierten Antwort ist sehr wichtig. Es sollte jedoch wahrscheinlich als Bearbeitung hinzugefügt werden.
Eddiemoya
3

Etwas, das ich für eine Weile gebucht hatte, ist das Folgende (noch nicht getestet):

Quelllink

//add our action
add_action( 'save_post', 'my_save_post', 11, 2 );

function my_save_post($post_id, $post){

   //if it is just a revision don't worry about it
   if (wp_is_post_revision($post_id))
      return false;

   //if the post is an auto-draft we don't want to do anything either
   if($post->post_status != 'auto-draft' ){

       // unhook this function so it doesn't loop infinitely
       remove_action('save_post', 'my_save_post' );

      //this is where it happens -- update the post and change the post_name/slug to the post_title
      wp_update_post(array('ID' => $post_id, 'post_name' => str_replace(' ', '-', $_POST['post_title'])));

      //re-hook this function
      add_action('save_post', 'my_save_post' );
   }
}
Adam
quelle
In diesem Code wird der erneute Hook sicherlich nicht benötigt, und selbst wenn dies der Fall wäre, müssten die Priorität und die Argumente auf 11 und 2 gesetzt werden. Auch statt str_replace()wäre sanitize_title_with_dashes()besser geeignet?
Scott
Wenn wp_update_postSie wp_insert_postfunction aufrufen , rufen Sie function auf, wodurch eine save_postAktion ausgelöst wird . Sie erhalten eine Endlosschleife.
Eugene Manuilov
@ EugeneManuilov - aber im Code wird der Haken entfernt, um nicht unendlich zu schleifen ...
Scott
@ Brady ah ... ja ich verstehe. Mein Fehler.
Eugene Manuilov
1
@EugeneManuilov Wenn Sie diese Antwort abgelehnt haben, kehren Sie bitte Ihre Stimme um. Die Reputationspunkte sind nicht von meiner Bedeutung, aber die Tatsache, dass dies eine plausible Antwort bleibt, ist und als solche bietet diese Antwort potenziellen Lesern einen schlechten Dienst, indem sie sie falsch informiert, dass diese Funktion unendlich schleifen wird, wenn dies nicht der Fall ist. Auch dieses Snippet bietet Kommentare, die denjenigen, denen das Verständnis fehlt, eine bessere Chance geben, zu sehen, was in jeder Phase der Funktion passiert. Sie können dieses Wissen und Verständnis auch auf Ihr Snippet anwenden.
Adam