WordPressでパーマリンクからカテゴリを安全に取り除く方法

ワードプレスサイトでパーマリンクからカテゴリを外したのですが、リダイレクトてどハマリしたのでメモしておきます。あとから考えればキャッシュの削除失敗?と、一文字つけ忘れが原因だったんですけどね。

パーマリンクからカテゴリを外すメリット

パーマリンクにカテゴリを含めると階層的なパスになるので見栄えがいいですし見やすいというメリットがあります。しかし、記事が増えたり、あとから記事を更新したらカテゴリとは異なる方向性になることがあります。

そうなってからカテゴリを変更するとファイルパスが変わってしまうためSEO上好ましくありません。SEOを意識しないにしても、リダイレクトの設定をしないと、(検索エンジンのインデックスが更新されるまでは)検索から来た人が記事にアクセスできなくなります。

そんなわけで、あとから記事のカテゴリを変更しても影響を受けないようにするには、カテゴリをパーマリンクに入れないほうがいいケースが多くなります。

ぼくはカテゴリが不要なサイトでは「%postname%」のみにしています。

こうすると、あとからそのページを固定ページにしたくなったり、逆に固定ページを投稿ページにしたくなったとき、名前さえ同じにすればパスを変えずに変更できるメリットがあります。

リダイレクトを行う際に注意すること

リダイレクトにはページの恒久的移転のpermanent(ステータスコード301)と、一時的な移転のtemporary(ステータスコード302)があります。

気をつけるべきは、301だとリダイレクト先をブラウザが記憶してしまうことです。

  1. ページAの転送先をページBに設定する
  2. ブラウザでページAにアクセスするとページBに移動
  3. 2の後ページAの転送先をページCに設定する
  4. ブラウザでページAのアドレスを入力すると、ページCではなくページBに移動

3.の「ページAの転送先をページCに設定する」の後にブラウザキャッシュを削除すれば再度.htacccessの設定が反映されるようになりますが、ブラウザによってはうまくいかないことがあります。

Chromeでキャッシュ削除をしてもなぜか古いリダイレクト先に飛んでしまうことがあって確認に手間取った。削除し忘れたんだろうとは思いますが。

そんなわけで、まずは302で試して、うまくいくことを確認してから301にする方がいいです。

Chromium系のキャッシュ削除なら機能拡張のSingle Click Cleanerが使いやすくてオススメ
最終的なチェックはリダイレクトチェックツール

.htaccessによるリダイレクト

正規表現の使えるRedirectMatchを使用。正規表現が使えるだけで、Redirectと同じです。

使い方

RedirectMatch ステータスコード 移転元パス 移転先パス
RedirectMatch 301 ^/sample/(.*)?\.html /$1

正規表現ですが、スラッシュ(/)のエスケープは不要です。ピリオド(.)のエスケープは必要なので、¥を入れます。

コード   RedirectMatch 301 ^/sample/(.*)?\.html /$1
対象文字列 /sample/sample.html

結果    /sample

()内の文字列が$1に代入されます。

階層が深い場合の対処

カテゴリの階層が1なら上のやり方でいいですが、2階層よりも深い(カテゴリに親子関係がある)ならこうします。

2階以上層
RedirectMatch 301 ^/sample.*/(.*)?\.html$ /$1

/sample/sample1/test1.html
/sample/sample2/test2.html

/test1
/test2

解説

^は行頭を表す正規表現で、.*?は最短マッチを表します。移転元最後の$は行末を表し、移転先/$1は移転元()内の文字列を代入するために用いられています。

/sample.*/の部分は/sampleのあとから、最後に出てくる/までの全ての文字が対象になります。このため、sample1だけでなく、sample2のパスにもマッチします。

/(.*)?にする理由は、最短マッチがほしいからです。?をつけないと最長マッチになるため、/sample/sample1/test1.htmlの黄色の部分が対象となってしまいます。

?をつけることで、/sample/sample1/test1.htmlに制限することができます。

^は絶対に忘れないこと

で、行頭の^は必須です。これが抜けているとカテゴリーページまで転送されてしまいます。カテゴリーページも/category/以下が、もとのパーマリンクと同じ構造になっているので、そちらにもマッチしてしまうためです。たとえばカテゴリーの2ページ目なら

/category/sample/sample1/page/2

末尾の2にマッチするため/2に転送されてしまいます。

ケアレスミスってなかなか気づかないんですよね。

スポンサーリンク
336
336