Forza la slug post da generare automaticamente dal titolo al salvataggio

Gestisco un sito di proprietà in cui molte proprietà sono vendute in condomini.

Per questo motivo ciò che gli editor di contenuti fanno è creare un post / proprietà con tutti i dettagli e quindi utilizzare un plug-in post duplicato per creare gli altri.

Ogni volta che duplicano un post / proprietà cambiano il titolo in modo da riflettere il numero di proprietà e forse cambiano alcuni bit del prezzo dei metadati EG.

Quello che si dimenticano di fare è spazzare via lo slug e lasciare che ne venga generato uno nuovo dal titolo. Ecco un esempio di slug della prima proprietà inserita:

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

ma poi quando duplicano le lumache diventano:

 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 

Ma quando cambiano i titoli le lumache dovrebbero essere meglio come:

 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 

Quindi la mia domanda:

Come posso forzare la rigenerazione dello slug su post-save, dopo aver aggiornato il titolo della proprietà?

Lo slug per questo CPT dovrebbe sempre essere generato automaticamente, non è mai necessario impostarlo manualmente.

Solutions Collecting From Web of "Forza la slug post da generare automaticamente dal titolo al salvataggio"

La soluzione più semplice potrebbe essere:

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

Inoltre, wp_unique_post_slug() lo slug da sanitize_title_with_dashes() attraverso wp_unique_post_slug() per assicurarti che sia unico. Se necessario, aggiungerà automaticamente “-2”, “-3” ecc.

Invece di sostituire gli spazi dovresti usare la funzione build in sanitize_title() che si prenderà cura della sostituzione per te.

Come questo:

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

Inoltre, dovresti usare una lumaca unica. Che puoi ottenere con la funzione wp_unique_post_slug()

Quindi, mettendo tutto insieme una soluzione potrebbe essere:

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

Qualcosa che ho segnato per un po ‘di tempo è il seguente (non ancora testato),

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