web-dev-qa-db-fra.com

Changer le slug après la création

J'utilise actuellement Post name pour la structure permalink. Je veux ajouter le texte d'un champ à la fin du permalien. Existe-t-il un crochet pour la création de lien permanent lorsqu'une Post est publiée?

Dans mon cas, j'utilise Advanced Custom Fields et chaque message a un titre et un sous-titre. Actuellement, le permalien est /title/ mais je voulais être /title-subtitle/.

Edit: similaire à cette question précédente , sauf que je ne veux le faire que pour la post-création et non pour les éditions ultérieures, car cela modifiera l'URL de la publication, ce qui est un désastre pour SEO.

3
IvanRF

Voici ce que j'ai fait pour implémenter ceci:

function slug_save_post_callback( $post_ID, $post, $update ) {
    // allow 'publish', 'draft', 'future'
    if ($post->post_type != 'post' || $post->post_status == 'auto-draft')
        return;

    // only change slug when the post is created (both dates are equal)
    if ($post->post_date_gmt != $post->post_modified_gmt)
        return;

    // use title, since $post->post_name might have unique numbers added
    $new_slug = sanitize_title( $post->post_title, $post_ID );
    $subtitle = sanitize_title( get_field( 'subtitle', $post_ID ), '' );
    if (empty( $subtitle ) || strpos( $new_slug, $subtitle ) !== false)
        return; // No subtitle or already in slug

    $new_slug .= '-' . $subtitle;
    if ($new_slug == $post->post_name)
        return; // already set

    // unhook this function to prevent infinite looping
    remove_action( 'save_post', 'slug_save_post_callback', 10, 3 );
    // update the post slug (WP handles unique post slug)
    wp_update_post( array(
        'ID' => $post_ID,
        'post_name' => $new_slug
    ));
    // re-hook this function
    add_action( 'save_post', 'slug_save_post_callback', 10, 3 );
}
add_action( 'save_post', 'slug_save_post_callback', 10, 3 );

Il génère et met à jour la slug. Le slug précédent généré par WP ne peut pas être réutilisé car il peut avoir des numéros uniques si le titre/le slug a déjà été utilisé dans un autre message. Donc, je désinfecte le titre. Ensuite, wp_update_post s'assure qu'il n'y a pas de doublons pour le nouveau slug avec wp_unique_post_slug.

La seule façon pour moi de ne faire cela que sur publier est de comparer la création et l'heure modifiée. Ils ne sont égaux que lorsque le poste est créé. Le paramètre $update est inutile, car est true pour la publication.

4
IvanRF