Erzwingen, dass Post-Slug automatisch vom Titel beim Speichern generiert wird

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

Aus diesem Grund erstellen die Inhalts-Editoren einen Post / eine Eigenschaft mit allen Details und verwenden dann ein Duplikat-Post-Plugin, um die anderen zu erstellen.

Jedes Mal, wenn sie einen Post / eine Eigenschaft duplizieren, ändern sie den Titel, um die Eigenschaftsnummer widerzuspiegeln, und ändern vielleicht einige Bits von Metadaten EG-Preis.

Was sie vergessen haben ist, den Slug auszulöschen und einen neuen aus dem Titel generieren zu lassen. Hier ist ein Beispiel-Slug von der ersten Eigenschaft, die eingegeben wurde:

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

aber dann, wenn sie die Schnecken duplizieren, werden:

 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, wären 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 nach dem Speichern erneut generiert wird, nachdem er den Eigentumstitel aktualisiert hat?

Der Slug für diesen CPT sollte immer automatisch generiert werden, es muss nie manuell gesetzt werden.

Solutions Collecting From Web of "Erzwingen, dass Post-Slug automatisch vom Titel beim Speichern generiert wird"

Der einfachste Workaround 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 ); 

Führen Sie den Slug auch von ” wp_unique_post_slug() bis ” wp_unique_post_slug() um sicherzustellen, dass er eindeutig ist. Es wird automatisch ‘-2’, ‘-3’ usw. angefügt, wenn es benötigt wird.

Anstatt Leerzeichen zu ersetzen, sollten Sie die build in function sanitize_title() die für Sie den Austausch übernimmt.

So was:

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

Außerdem sollten Sie einen einzigartigen Slug verwenden. Was Sie mit der function wp_unique_post_slug()

Eine Lösung könnte also lauten:

 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 ); 

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

Quelle LINK

 //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' ); } }