投稿のスラッグを数字のみにする

数字のみにしたいけど

パーマリンクを /%category%/%postname%/ にし、投稿の slug を “数字のみ” にした場合、子カテゴリーのみに属する投稿が表示されません。

プラグイン「Rewrite Rules Inspector」で Rewriteルールを見てみると、投稿の slug が “数字のみ” は想定されていない様です。

数字のみにするぞ

functions.php に下記を追記して Rewriteルールを変更すれば…
(変更後は「設定 - パーマリンク」で「変更を保存」を押すのを忘れずに)

// 投稿のスラッグを数字のみにする
if (!function_exists('custom_rewrite')) :
function custom_rewrite()
{
   add_rewrite_rule('tag/([^/]+)/page/?([0-9]{1,})/?$', 'index.php?tag=$matches[1]&paged=$matches[2]', 'top');
   add_rewrite_rule('type/([^/]+)/page/?([0-9]{1,})/?$', 'index.php?post_format=$matches[1]&paged=$matches[2]', 'top');
   add_rewrite_rule('page/?([0-9]{1,})/?$', 'index.php?&paged=$matches[1]', 'top');
   add_rewrite_rule('search/(.+)/page/?([0-9]{1,})/?$', 'index.php?s=$matches[1]&paged=$matches[2]', 'top');
   add_rewrite_rule('author/([^/]+)/page/?([0-9]{1,})/?$', 'index.php?author_name=$matches[1]&paged=$matches[2]', 'top');
   add_rewrite_rule('([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/page/?([0-9]{1,})/?$', 'index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]&paged=$matches[4]', 'top');
   add_rewrite_rule('([0-9]{4})/([0-9]{1,2})/([0-9]{1,2})/?$', 'index.php?year=$matches[1]&monthnum=$matches[2]&day=$matches[3]', 'top');
   add_rewrite_rule('([0-9]{4})/([0-9]{1,2})/page/?([0-9]{1,})/?$' , 'index.php?year=$matches[1]&monthnum=$matches[2]&paged=$matches[3]', 'top');
   add_rewrite_rule('([0-9]{4})/([0-9]{1,2})/?$', 'index.php?year=$matches[1]&monthnum=$matches[2]', 'top');
   add_rewrite_rule('([0-9]{4})/page/?([0-9]{1,})/?$', 'index.php?year=$matches[1]&paged=$matches[2]', 'top');
   add_rewrite_rule('(.+?)/page/([0-9]+)/?$', 'index.php?category_name=$matches[1]&paged=$matches[2]', 'top');
   add_rewrite_rule('(.?.+?)/page/?([0-9]{1,})/?$', 'index.php?pagename=$matches[1]&paged=$matches[2]', 'top');
   add_rewrite_rule('(.?.+?)(?:/([0-9]+))?/?$', 'index.php?pagename=$matches[1]&page=$matches[2]', 'top');
   add_rewrite_rule('(.+?)/([^/]+)/page/?([0-9]{1,})/?$', 'index.php?category_name=$matches[1]&name=$matches[2]&paged=$matches[3]', 'top');
   add_rewrite_rule('(.+?)/(?=post-)([^/]+)(?:/([0-9]+))?/?$', 'index.php?category_name=$matches[1]&name=$matches[2]&page=$matches[3]', 'top');
   add_rewrite_rule('(.+?)/([0-9]+)(?:/([0-9]+))?/?$', 'index.php?category_name=$matches[1]&name=$matches[2]&page=$matches[3]', 'top');
}
add_action('init', 'custom_rewrite');
endif;

これで投稿の slug が “数字のみ” でも “数字のみ以外” でも今のところ動いている様な気がするが…

ただし、ページ分割がある投稿に “数字のみ以外” の slug を付ける場合は、始めに post- を付けないと 2ページ目が表示されない。
(post- は上記コードの 19行目の (?=post-) の所で変更可)

上記コード 19行目を

add_rewrite_rule('(.+)/([^/]+?)/([1-9])/?$', 'index.php?category_name=$matches[1]&name=$matches[2]&page=$matches[3]', 'top');

に変えれば投稿にページ分割があるなしにかかわらず、slug は “数字のみ” でも “数字のみ以外” でも OK です。ただし以下の制約があります。

  • ページ分割は 9ページまで
  • slug を “数字のみ” にする場合は 10 以上の数字を付ける

2024.08.04

日付及び投稿者アーカイブがちゃんと表示できなかったので修正しました。

ただし

Rewriteルールは使用しているテーマやプラグインによって変わるので上記コードでうまくいくとは限らない。

URL から category を消すためにパーマリンクのカテゴリーベースを「 . 」にしている人は、先頭に add_rewrite_rule('(.+?/カテゴリーのslug)/?$', 'index.php?category_name=$matches[1]', 'top'); の追記が必要。
プラグイン「No Category Base (WPML)」や「Remove Category URL」なら OK。

私、正規表現やら Rewriteルールやら難しすぎて良くわからんので、あくまで参考程度で…
ここまで苦労して数字のみの slug を付ける必要ないだろ? とは言わないで…。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です