web-dev-qa-db-fra.com

Forcer le post-slug à être généré automatiquement à partir du titre lors de la sauvegarde

Je gère un site immobilier où de nombreuses propriétés sont vendues dans des immeubles.

Pour cette raison, les éditeurs de contenu créent une publication/propriété avec tous les détails, puis utilisent un plug-in de publication en double pour créer les autres.

Chaque fois qu'ils dupliquent un article/une propriété, ils modifient le titre pour refléter le numéro de la propriété et modifient éventuellement quelques bits du prix E.G.

Ce qu'ils oublient de faire, c'est d'effacer la limace et d'en générer une nouvelle à partir du titre. Voici un exemple de slug de la première propriété entrée:

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

mais alors quand ils dupliquent les slugs deviennent:

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

Mais quand ils changeront de titre, les slugs seront mieux comme:

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

Donc ma question:

Comment puis-je forcer le slug à être re-généré après l'enregistrement, après avoir mis à jour le titre de la propriété?

Le slug de ce CPT doit toujours être généré automatiquement, il n’est jamais nécessaire de le définir manuellement.

7
Brady

La solution de contournement la plus simple pourrait être:

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 );
16
Eugene Manuilov

En outre, exécutez le slug de sanitize_title_with_dashes() à wp_unique_post_slug() pour vous assurer qu’il est unique. Il ajoutera automatiquement '-2', '-3' etc. si nécessaire.

8
Pete Nelson

Au lieu de remplacer des espaces, vous devriez utiliser la fonction de construction sanitize_title() qui se chargera de la remplacer.

Comme ça:

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

En outre, vous devriez utiliser une limace unique. Ce que vous pouvez obtenir avec la fonction wp_unique_post_slug()

Donc, en mettant tout cela ensemble, une solution pourrait être:

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

Quelque chose que j'ai réservé depuis un moment est le suivant (encore non testé),

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