web-dev-qa-db-ja.com

データベースに保存されている投稿の名前に依存しないパーマリンク

私は私の投稿用にカスタムパーマリンク構造を作っています。

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

このパーマリンクでは、投稿のIDが最初に来て、その後に投稿のタイトルが続きます。


今まで知っていること

postnameは通常wp_posts行のpost_nameテーブルに格納され、投稿のURLを制御します。つまり、投稿のpost_namemy-post-nameの場合、デフォルトのURLはwww.example.com/post/my-post-nameになります。

投稿名は、すべての投稿が一意の投稿名を持つようにデータベースに格納されます。 2つの投稿のタイトルが同じ場合(たとえばnew-advanced-topic)、最初の投稿の名前はnew-advanced-topicになり、2番目の投稿の名前は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は投稿のIDにのみ依存するようにします。したがって、ユーザーがwww.example.com/post/25/pla-pla-plaを要求した場合、表示される投稿は、idが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を要求した場合、ID=100を含む投稿がデータベースに保存されていないため、404エラーが表示されるはずです。

これを行うために新しいrewrite_ruleを書き込もうとしましたが、正規表現を書くための方法を見つけることができません。

wp_rewriteルールを使用してこれを行うにはどうすればよいですか。

4
Yazan W Yusuf

post_nameを一意にしておく必要があります。さもなければ、それは多くの問題を引き起こすかもしれません。 post_titlesanitize_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へのパーマリンク構造にすることができ、正しい投稿を表示することができます。

上記のコードに伴う1つの問題は、投稿エディタから投稿スラグを編集できないことです。しかし、あなたの投稿URLは編集可能な投稿タイトルから来ています。

1
тнє Sufi

Post Titleの代わりにpost IDを使用したいことを私は理解しています。

同じタイトル名のために問題があります。

そうであれば、解決策は次のようになります。

1 - 次の図のようにパーマリンクカスタム構造体に変更します。

enter image description here 

2- phpmyadminに移動し、次の図のように投稿名を変更します

enter image description here 

0
heshamhussain