私は私の投稿用にカスタムパーマリンク構造を作っています。
www.example.com / post / %post_id% / %posttitle% /
このパーマリンクでは、投稿のIDが最初に来て、その後に投稿のタイトルが続きます。
postname
は通常wp_posts
行のpost_name
テーブルに格納され、投稿のURLを制御します。つまり、投稿のpost_name
がmy-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 ║
╚════╩════════════════════╩═════════════════════╝
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
ルールを使用してこれを行うにはどうすればよいですか。
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
へのパーマリンク構造にすることができ、正しい投稿を表示することができます。
上記のコードに伴う1つの問題は、投稿エディタから投稿スラグを編集できないことです。しかし、あなたの投稿URLは編集可能な投稿タイトルから来ています。