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としてしまうとカテゴリー一覧が優先表示されてしまいます。