Slugs numériques : garde-fou et régénération après un enregistrement sans titre
Avec la structure de permaliens /%category%/%postname%/, la règle (.+?)/([^/]+)(?:/([0-9]+))?/?$ lit un dernier segment numérique comme un numéro de page : l'article répond 404 tout en restant listé partout. Deux chemins produisaient un tel slug : - un titre vide à la première publication — le cœur retombe alors sur l'ID du post et ne régénère plus jamais le slug ensuite, même titre corrigé ; c'est ce que provoquait post-title-required.php, qui laisse le post s'écrire en publish avant d'annuler son statut ; - un titre légitimement numérique (« 1917 »). - inc/post-slug-guard.php : filtre wp_unique_post_slug limité à post/page, suffixe les slugs purement numériques (1917 → 1917-2). Les nav_menu_item et attachments, dont les slugs numériques sont normaux, ne sont pas touchés. - pods-save-error-handler.php : l'annulation de statut vide aussi post_name quand le titre est vide, pour qu'il se régénère depuis le vrai titre. Les deux articles déjà touchés en prod restent à re-sluguer à la main. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011w7RzAHv4r1Yahnm2NwDDG
This commit is contained in:
@@ -62,11 +62,26 @@ add_filter( 'redirect_post_location', function ( $location ) {
|
||||
! in_array( $original, [ 'publish', 'future', 'pending' ], true )
|
||||
) {
|
||||
global $wpdb;
|
||||
|
||||
$data = [ 'post_status' => $original ?: 'draft' ];
|
||||
$formats = [ '%s' ];
|
||||
|
||||
// Le post vient d'être écrit en publish avec un titre vide : le cœur a
|
||||
// alors figé son slug sur l'ID du post (wp_insert_post →
|
||||
// sanitize_title( $post_title, $post_id )), et ne le régénère plus
|
||||
// jamais ensuite, même une fois le titre corrigé — d'où un permalien
|
||||
// numérique irroutable (cf. inc/post-slug-guard.php). On vide le slug
|
||||
// pour qu'il soit reconstruit depuis le vrai titre à la publication.
|
||||
if ( trim( (string) $post->post_title ) === '' ) {
|
||||
$data['post_name'] = '';
|
||||
$formats[] = '%s';
|
||||
}
|
||||
|
||||
$wpdb->update(
|
||||
$wpdb->posts,
|
||||
[ 'post_status' => $original ?: 'draft' ],
|
||||
$data,
|
||||
[ 'ID' => $post_id ],
|
||||
[ '%s' ],
|
||||
$formats,
|
||||
[ '%d' ]
|
||||
);
|
||||
clean_post_cache( $post_id );
|
||||
|
||||
Reference in New Issue
Block a user