WordPressの不要ディレクトリはTOPにリダイレクトする方法

WordPress

当WebサイトはサブドメインでWordPressを運用しています。カテゴリーページを作り、カテゴリー毎に一覧を表示するという、サイトの構成になっています。そこで、少し気になったのが、ディレクトリにアクセスがあつた場合に 404 エラーになってしまうということだ。
あまり気にする必要はないと思うが、良い機会なので、ディレクトリにアクセスがあった場合はTOPにリダイレクトする設置をしてみます!

現状を把握する

現時点はこんな感じ(before)

まず、サンプルの投稿記事の個別ページのURLは「web.imagemo.net/archives/462」です。今の状態は、WordPress側で設定しています。
WordPressログイン > 設定 > パーマリンク設定 > パーマリンクの構造が「数字ベース」となっています。この場合、投稿記事のIDが「462」でその前のディレクトリが「archives」ということです。

この状態から、「archives」を「category」に変更して、各カテゴリーのディレクトリの後に投稿記事のID「462」とするのが目的です。
「web.imagemo.net/各カテゴリー名/462」

「archives」部分を「category」に変更する

変更後はこんな感じ(after)

先ほどと同様にダッシュボード > 設定 > パーマリンク設定 > パーマリンクの構造で、「カスタム構造」を選択して「/%category%/%post_id%」を入力する。

カテゴリーの設定はこれ

カテゴリーの設定も忘れずに

WordPressログイン > ダッシュボード > カテゴリー

これで「web.imagemo.net/google-spreadsheet/462」各カテゴリーのディレクトリの後に「カテゴリー名」がついて、投稿記事が表示された。そして、「web.imagemo.net/google-spreadsheet/」にアクセスすると、その記事に属している投稿記事の一覧が表示される。
なぜか「web.imagemo.net/archives/462」でも投稿ページの表示される。。。この挙動はよくわからないが、同一のページが重複してしまっているが、サイトマップをみる限り、このURLは無視されているので、Googleにインデックスされないと思う(憶測)ので、わざわざリダイレクトする必要もなさそうかなぁ〜。ということで、ほうっておく。

URLが変わったらサイトマップも編集するの?

答え ⇒ いいえ。そんな面倒なことは不要です!

なんか、WordPressのURLを途中で変更したら、全ページに影響するのでは? と思いがちですが、心配ご無用!。ちゃんと、新しいURLで自動的にサイトマップが更新されています!超、楽ちん。サイトマップ関連はこちらの記事を参考にしてください → WordPressサイトを「サチコ」に登録後サイトマップxmlを送信する

リダイレクトを設定する

functions.phpに記述します

functions.phpを開いて下記のコードを追加してください。


//---------------------------------------------------------------------
# 特定のディレクトリにアクセスされたら TOPに301リダイレクトする
//---------------------------------------------------------------------
function url_redirect_301(){
  //現在ページ取得
  $url = $_SERVER['REQUEST_URI'];

  //「 category 」ディレクトリにアクセスしたらTOPにリダイレクトする
  if(strstr($url,'category')){
    wp_redirect( get_site_url(), 301 );
    exit;
  }

}
add_action( 'get_header', 'url_redirect_301' );

これで「web.imagemo.net/category/」にアクセスされたら、TOPページにリダイレクトします!
ていうか、このコードを記述しなくても「404」エラーになるだけなので、特になくても良いかなぁ〜と思ってきたのですが、せっかくなので備忘録としておきます。

やっぱり重複ページもリダイレクトを設定する

なんか、重複ページがあるとスッキリしないのでリダイレクトさせます!

functions.phpを開いて下記のコードを追加してください。


//---------------------------------------------------------------------
# URLの archives/以降に存在する記事IDであれば、TOPにリダイレクトさせる
//---------------------------------------------------------------------
function redirect_archives_to_home() {
  if (preg_match('/^\/archives\//', $_SERVER['REQUEST_URI'])) {
      wp_redirect(home_url());
      exit();
  }
}
add_action('template_redirect', 'redirect_archives_to_home');

先ほどまで「web.imagemo.net/archives/462」と「web.imagemo.net/google-spreadsheet/462」の2つのページが重複して表示されていたが、archives/〜 の場合はTOPページにリダイレクトします!
うん!これで、スッキリしました!

まとめ

  • 「archives」部分を「category」にすることでカテゴリー分けが一目でわかる。
  • 新しいURLは勝手にサイトマップに反映される。
  • カテゴリーの設定(重要)をしておかないとうまくいかない。
  • リダイレクトをさせるのはfunctions.phpに記述するのが手取り早い。
  • archivesのページをリダイレクトするか要検討する。
  • 重複したページをTOPにリダイレクトしたらスッキリした。