web-dev-qa-db-fra.com

lien permanent indépendant du nom de l'article stocké dans la base de données

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.


Ce que je sais jusqu'à présent

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.


Ce que je veux

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 ║
╚════╩════════════════════╩═════════════════════╝
  • Je souhaite que l'URL du message ne dépende que de l'ID du message. Donc, si l'utilisateur a demandé www.example.com/post/25/pla-pla-pla, le message à afficher est celui dont l'identifiant est 25.
  • Lorsqu'un utilisateur demande le lien 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.

4
Yazan W Yusuf

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!

1
тнє Sufi

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

 enter image description here 

2- allez dans phpmyadmin et changez votre nom posts comme ci-dessous

 enter image description here 

0
heshamhussain