Постоянная ссылка независимо от имени сообщения, хранящегося в базе данных

Я пытаюсь создать пользовательскую структуру постоянной ссылки для своих сообщений.

www.example.com / post / %post_id% / %posttitle% / 

В этой постоянной ссылке сначала появляется идентификатор сообщения, затем заголовок сообщения после него.


Вещи, которые я знаю до сих пор

postname обычно сохраняется в таблице post_name строке post_name и управляет URL-адресом сообщения. то есть: если post_name является my-post-name , по умолчанию URL-адрес будет следующим: www.example.com/post/my-post-name .

почтовые имена хранятся в базе данных таким образом, что каждое сообщение имеет уникальное почтовое имя. Если две должности имеют один и тот же заголовок (например, new-advanced-topic ), имя первой почты будет new-advanced-topic а второе имя будет new-advanced-topic-2 . И поэтому URL-адреса будут отличаться друг от друга.


Что я хочу

Но я не хочу, чтобы URL-адрес сообщения зависел от имени сообщения, хранящегося в базе данных.

Структура, которую я хочу, похожа на

 www.example.com / post / %post_id% / %posttitle% / 

Предположим, что в базе данных хранится 2 сообщения с этими значениями

 ╔════╦════════════════════╦═════════════════════╗ ║ ID ║ post_title ║ post_name ║ ╠════╬════════════════════╬═════════════════════╣ ║ 25 ║ new-advanced-topic ║ new-advanced-topic ║ ║ 26 ║ new-advanced-topic ║ new-advanced-topic2 ║ ╚════╩════════════════════╩═════════════════════╝ 
  • Я хочу, чтобы URL-адрес сообщения зависел только от идентификатора сообщения. Поэтому, если пользователь запросил www.example.com/post/25/pla-pla-pla , сообщение, которое будет отображаться, является адресом, для которого он равен 25.
  • Когда пользователь запрашивает ссылку www.example.com/post/{%post_id%}/pla-pla-pla , я хочу, чтобы WordPress перенаправлял его на www.example.com/post/{%post_id%}/{%post_title%} .

Поэтому, если пользователь запросил www.example.com/post/25/pla-pla-pla , WordPress перенаправит его на www.example.com/post/25/new-advanced-topic и отобразит сообщение с ID=25 .

И если пользователь запросил www.example.com/post/26/new-advanced-topic2 , WordPress перенаправит его на www.example.com/post/26/new-advanced-topic и отобразит сообщение с ID=26 .

И если пользователь запросил www.example.com/post/100/new-advanced-topic , ему должна появиться ошибка 404, поскольку в базе данных нет сообщения с ID=100 .

Я попытался написать новый rewrite_rule, чтобы сделать это, но я не мог нигде писать его регулярное выражение.

Как это сделать, используя правила wp_rewrite .

Solutions Collecting From Web of "Постоянная ссылка независимо от имени сообщения, хранящегося в базе данных"

Мы должны сделать это, сохраняя post_name уникальным. В противном случае это может вызвать множество проблем. Мы можем использовать post_title с sanitize_title . Таким образом, вы можете сохранить свой URL-адрес красивым и чистым, а ваше post_name останется уникальным.

Сначала нам нужно написать собственную структуру постоянной ссылки.

 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 ); 

Теперь наша пользовательская структура постоянной ссылки готова. Он станет www.example.com/post/{%post_id%}/{%post_title%} например: www.example.com/post/25/my-awesome-post-title . Нам нужно будет добавить правильное правило перезаписи, чтобы WP понял и вернул правильный пост.

 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; } 

С помощью вышеописанного кода вы сможете создать структуру постоянной ссылки на www.example.com/post/25/my-awesome-post-title и она отобразит правильную запись.

Одна из проблем с вышеуказанным кодом заключается в том, что вы не сможете редактировать post slug из редактора сообщений. Но ваш почтовый url теперь происходит из заголовка, который доступен для редактирования!

Я понимаю, что вы хотите использовать post ID вместо Post Title .

и у вас есть проблемы из-за того же названия.

Если это так, решение будет выглядеть следующим образом:

1 – изменить постоянную ссылку на пользовательскую структуру, как показано на следующем рисунке

введите описание изображения здесь

2- перейдите к phpmyadmin и измените свое сообщение, как показано на следующем рисунке

введите описание изображения здесь