WordPressサイトのURLから/category/を消し、カスタム構造に%category%を含めない方法

URLからcategoryは消すけど、投稿記事ページ(single.php)は、%category%を含めたくないケースが検索してもほとんどでてこなかったので、実装方法をまとめました。

前提

投稿のURLはそれぞれ以下を想定しています。
あらかじめ、home.phpが投稿一覧ページとして動作するよう設定しておいてください。
また、カテゴリーも事前に追加しておいてください。

・投稿一覧ページ(home.php):/blog/ ページング時:/blog/paged/[ページ数]/
・カテゴリ一覧ページ(archive.php):/blog/[カテゴリ名]/ ページング時:/blog/[カテゴリ名]/paged/[ページ数]/
・投稿記事ページ(single.php):/blog/[post_id]/

結論

functions.phpに以下を追加。

// URLからcategoryを削除
function remove_category($link) {
  return str_replace("/category/", "/", $link);
}
add_filter('user_trailingslashit', 'remove_category');

function remove_category_rewrite_rules($wp_rewrite) {
  $baseDir = 'blog/'; // 今回は/blog/が投稿一覧
  $categories = get_categories(['hide_empty' => 0]); // 投稿のカテゴリーをすべて取得

  // 各カテゴリのディレクトリをルールに追加
  foreach ($categories as $cat) {
    // 各カテゴリ一覧ページのページング
    $new_rules[$baseDir . $cat->category_nicename . '/page/(.+)/?'] = 'index.php?category_name=' . $cat->category_nicename . '&paged=$matches[1]';
    // 各カテゴリ一覧ページ
    $new_rules[$baseDir . $cat->category_nicename . '/?'] = 'index.php?category_name=' . $cat->category_nicename;
  }
  $wp_rewrite->rules = array_merge($new_rules, $wp_rewrite->rules);
}
add_filter('generate_rewrite_rules', 'remove_category_rewrite_rules');

次に、WordPressの管理画面「設定>パーマリンク」を開き、
カスタム構造を /blog/%post_id%/ と設定、保存する。

カテゴリーベースの部分は特に何も入れなくてOKです!

これで実装は完了です!

注意点

(1) カテゴリーを追加した場合、再度パーマリンクを更新する必要がある

カテゴリー追加後に、管理画面「設定>パーマリンク」を開き、変更を保存を押してください。

functions.php内に、flush_rules()を入れておけば自動で反映されますが、
この関数自体処理が重い点や毎回パーマリンク(リライトルール)の変更処理をさせる必要はないため、initフィルターに含めての実行は非推奨です。
ちょっと面倒ですが、手動でやることをおすすめします。

(2) カスタム構造で %post_id% 以外を使いたい

%postname%を指定しても問題はないのですが、カテゴリーのスラッグ名とかぶらないようにする必要があります。

例えば、カテゴリーにテスト(スラッグ名はtest)が存在。投稿のパーマリンクもtestとしてしまうとカテゴリー一覧が優先表示されてしまいます。

About Me

プロフィール画像

ユーキと申します。北海道恵庭市という札幌と新千歳空港の間でフリーランスのWebエンジニアとして活動してます。

当サイトのブログでは、主にWeb制作全般、フリーランス周りの情報など色々なノウハウや知識を載せています。
その他日々気になったこと、思ったことも書いてます。

お仕事の相談など何かありましたら、お問い合わせかツイッターのDMからお気軽にご連絡くださいませ。

お問い合わせはこちら

ツイッターはこちら

ポートフォリオはこちら

Latest Posts

Popular Posts

TOP