J'essaie de faire une structure personnalisée permalien pour mes messages.
www.example.com / post / %post_id% / %posttitle% /
Dans ce lien permanent, l'ID de l'article vient en premier, suivi du titre de l'article après.
postname
est généralement stocké dans la table wp_posts
dans la ligne post_name
et contrôle l'URL de la publication. C'est-à-dire que si le post_name
du message est my-post-name
, son URL par défaut sera www.example.com/post/my-post-name
.
les noms de publication sont stockés dans la base de données de manière à ce que chaque publication ait un nom unique. Si deux publications ont le même titre (par exemple, new-advanced-topic
), le nom de la première publication sera new-advanced-topic
et le nom de la seconde publication sera new-advanced-topic-2
. Et ainsi, les URL seront différentes les unes des autres.
Mais je ne veux pas que l'URL de la publication dépende du nom de celle-ci stocké dans la base de données.
La structure que je veux est semblable à
www.example.com / post / %post_id% / %posttitle% /
Supposons qu'il y a 2 articles stockés dans la base de données avec ces valeurs
╔════╦════════════════════╦═════════════════════╗
║ ID ║ post_title ║ post_name ║
╠════╬════════════════════╬═════════════════════╣
║ 25 ║ new-advanced-topic ║ new-advanced-topic ║
║ 26 ║ new-advanced-topic ║ new-advanced-topic2 ║
╚════╩════════════════════╩═════════════════════╝
www.example.com/post/25/pla-pla-pla
, le message à afficher est celui dont l'identifiant est 25.www.example.com/post/{%post_id%}/pla-pla-pla
, je souhaite que WordPress le redirige vers www.example.com/post/{%post_id%}/{%post_title%}
.Donc, si l'utilisateur a demandé www.example.com/post/25/pla-pla-pla
, WordPress le redirigera vers www.example.com/post/25/new-advanced-topic
et affichera le message avec ID=25
.
Et si l'utilisateur a demandé www.example.com/post/26/new-advanced-topic2
, WordPress le redirigera vers www.example.com/post/26/new-advanced-topic
et affichera le message avec ID=26
.
Et si l'utilisateur a demandé www.example.com/post/100/new-advanced-topic
, une erreur 404 devrait lui apparaître car il n'y a aucune publication stockée dans la base de données avec ID=100
.
J'ai essayé d'écrire une nouvelle règle rewrite_rule pour le faire, mais je ne pouvais trouver aucun moyen d'écrire sa regex.
Comment puis-je faire cela en utilisant les règles wp_rewrite
.
Nous devons faire cela en gardant post_name
unique. Sinon, cela pourrait causer de nombreux problèmes. Nous pouvons utiliser post_title
avec sanitize_title
. De cette façon, vous pouvez garder votre URL propre et nette, et votre post_name
restera également unique.
Nous allons d’abord avoir besoin d’écrire une structure permalien personnalisée.
function my_awesome_permalink( $url, $post, $leavename ) {
$url= trailingslashit( home_url('/post/'. $post->ID .'/'. sanitize_title($post->post_title) .'/' ) );
return $url;
}
add_filter( 'post_link', 'my_awesome_permalink', 10, 3 );
Notre structure permalien personnalisée est maintenant prête. Il deviendra www.example.com/post/{%post_id%}/{%post_title%}
exemple: www.example.com/post/25/my-awesome-post-title
. Nous devrons ajouter la règle de réécriture appropriée pour que WP comprenne et renvoie le message correct.
add_action('generate_rewrite_rules', 'custom_rewrite_rules');
function custom_rewrite_rules( $wp_rewrite ) {
$new_rules['^post/([0-9]+)/([^/]+)/?'] = 'index.php?p=$matches[1]';
$wp_rewrite->rules = $new_rules + $wp_rewrite->rules;
return $wp_rewrite;
}
Avec le code ci-dessus, vous pourrez faire en sorte que votre structure de publication permalink soit en www.example.com/post/25/my-awesome-post-title
et affichera la publication correcte.
Un problème avec le code ci-dessus est que vous ne pourrez pas éditer post slug depuis post editor. Mais votre URL de poste vient maintenant du titre de poste, qui est éditable!
Si j'ai bien compris, vous souhaitez utiliser post ID au lieu de Post Title .
et vous avez des problèmes à cause du même nom de titres.
Si tel est le cas, la solution sera la suivante:
1 - changer lien permanent à structure personnalisée comme dans la figure suivante
2- allez dans phpmyadmin et changez votre nom posts comme ci-dessous