どうも、個人ビジネス部PHP専門のコウイチです。
この記事では、WordPressのカテゴリページのパーマリンクについてしまう、"category"という文字を取り除く方法について、解説します。
「パーマリンク」について知りたい方は、以下の記事をご覧ください。
↓
【WordPress】最初にやっておくべきパーマリンクの設定方法を解説
[blogcard url="https://businessdepartment.jp/wordpress/permalink/"]
WordPressのカテゴリページのパーマリンクはどうなっていますか?
たとえば、WordPressというカテゴリページを表示したとします。
その時のURLは・・・

その"category"ってやつ、邪魔・・・
そう、勝手に"category"という文字列がURLに付いてきます。
ここをこだわって、
というURLでアクセスできるようにしようじゃないか、というのが今回の課題です。
やりたいこと
何をやりたいのか、整理しますと
というページを表示したとき・・・
- WordPressというカテゴリが存在すれば、そのカテゴリページを
- 存在しない場合、wordpressというパーマリンクの記事が存在すれば、その記事を
表示するようにしたい。
ということです。
これを実現するには、functions.phpにコードを追加する必要があります。
【ちなみに】wordpressが小文字なのはなぜ?
※当ブログの場合、カテゴリ名は"WordPress"という、大文字小文字を混ぜた名前にしていますが、"wordpress"というスラッグを設定しています。なぜなら、URLに使用する英字は小文字のみで構成するのが一般的だからです。
functions.phpに追加する内容
それでは、functions.phpに追加する内容について、説明してきます。
今回、functions.phpに追加するのは以下のコードです。
コピペする場合は、コピペする前のfunctions.phpをバックアップして、期待した動作をしなければ、ファイルを元に戻してくださいね。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
/* パーマリンクの「category」を削除する。*/ function my_user_trailingslashit($link){ return str_replace('/category/', $this_url_right, $link); } add_filter('user_trailingslashit', 'my_user_trailingslashit'); /* 今表示しようとしているURLが、カテゴリページかどうか判定 */ function is_category_page_from_url(){ // ドメインより右以降のURLを取得 $this_url = $_SERVER["REQUEST_URI"]; // 正規表現を使用し、URLからカテゴリ名になりうる部分を抽出 // ($this_urlで、右から末尾以外のスラッシュが最初に出現するまでの部分を抽出) preg_match("/\/?([^\/]+)\/?$/", $this_url, $match_result); $category_url = $match_result[1]; $categories = get_categories(); // すべてのカテゴリ情報を取得 $is_category = false; foreach($categories as $category){ // すべてのカテゴリ情報で繰り返す // カテゴリ名になりうるURL部が、カテゴリ(スラッグ)に存在すれば if(urldecode($category_url) === urldecode($category->slug)){ $is_category = true; break; } } return $is_category; } /* リライトルールを書き換える。*/ function my_rewrite_rules_array($my_rewrite) { $return_rule = array(); $is_category = is_category_page_from_url(); foreach ($my_rewrite as $regex => $rewrite){ if($is_category){ // カテゴリページを出したいなら // リライト元パターンにcategory/とつけるのをやめる。 $regex = str_replace('category/', '', $regex); } // リライトルールをセット $return_rule[$regex] = $rewrite; } return $return_rule; } add_filter('rewrite_rules_array', 'my_rewrite_rules_array'); |
コードの解説
今掲載した、functions.phpに追加するコードの解説をしていきます。
カテゴリページへのリンクの"category"を除去する。
まず、各カテゴリページへのリンクってありますよね?
これ、画像ではもう処置を施しているのでURLに"category"がありませんが、本来ここは、
と表示されているはずです。
これを
と表示されたいわけです。
これを実現するには、「user_trailingslashit」というフィルタをフックして、URLから"/category/"という文字列を取り除きます。
1 2 3 4 5 |
/* パーマリンクの「category」を削除する。*/ function my_user_trailingslashit($link){ return str_replace('/category/', $this_url_right, $link); } add_filter('user_trailingslashit', 'my_user_trailingslashit'); |
今表示しようとしているURLが、カテゴリページかどうか判定
次に、「今表示しようとしているURLが、カテゴリページかどうか判定」する関数を追加します。
この関数は後で使用します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
/* 今表示しようとしているURLが、カテゴリページかどうか判定 */ function is_category_page_from_url(){ // ドメインより右以降のURLを取得 $this_url = $_SERVER["REQUEST_URI"]; // 正規表現を使用し、URLからカテゴリ名になりうる部分を抽出 // ($this_urlで、右から末尾以外のスラッシュが最初に出現するまでの部分を抽出) preg_match("/\/?([^\/]+)\/?$/", $this_url, $match_result); $category_url = $match_result[1]; $categories = get_categories(); // すべてのカテゴリ情報を取得 $is_category = false; foreach($categories as $category){ // すべてのカテゴリ情報で繰り返す // カテゴリ名になりうるURL部が、カテゴリ(スラッグ)に存在すれば if(urldecode($category_url) === urldecode($category->slug)){ $is_category = true; break; } } return $is_category; } |
リライトルールを書き換える。
では、「rewrite_rules_array」というフィルターをフックしてリライトルールを書き換えます。
カテゴリページを表示したい場合に、リライト元のパターンの「category」を削除します。
リライトルールについては
WordPressのパーマリンクにスラッシュ「/」を含める方法
[blogcard url="https://businessdepartment.jp/wordpress/perma-link-slash/"]
で解説していますので、参考にしてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
/* リライトルールを書き換える。*/ function my_rewrite_rules_array($my_rewrite) { $return_rule = array(); $is_category = is_category_page_from_url(); foreach ($my_rewrite as $regex => $rewrite){ if($is_category){ // カテゴリページを出したいなら // リライト元パターンにcategory/とつけるのをやめる。 $regex = str_replace('category/', '', $regex); } // リライトルールをセット $return_rule[$regex] = $rewrite; } return $return_rule; } add_filter('rewrite_rules_array', 'my_rewrite_rules_array'); |
まとめ
以上の内容をfunctions.phpに追加すれば、
https://example.com/[カテゴリ名]
で、そのカテゴリページにアクセスすることができるようになります。
シンプルなURL構造は、訪問者が目で見たときにサイトの構成が分かりやすくなるのと、検索エンジンもサイトの構成を把握しやすくなるため、やっておいて損はない仕掛けです。
是非、試してみてください。
ではまた。