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.
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.