WordPressでパーマリンク構造を変更したときに404にならないようにリダイレクトさせる方法

Googleでの表示回数が激減

今年に入りパーマリンク構造を変更した。自動的にリダイレクトされると思っていたのだが、リダイレクトされるのはパーマリンク構造は変更せずに、記事のパーマリンクを変えたときのみだったようで、これまで地道に増えてきた多数のリンクが全て404に…。気づかずに放置していたためか、Googleでの表示数、流入数が約半数になってしまった。

Googleでの表示回数が激減
Googleでの表示回数が激減

404エラーは数が多くてもクロールとインデックス、ランキングに悪い影響を与えない」とことだそうだが、サイト自体の評価には影響が無いということであって、404となったページ自体はGoogleから消されていく。そのためGoogleでの表示回数の減少につながったのだろう。

新しいパーマリンクがGoogleに拾われれば、また徐々に表示回数も増えるのであろうが、これまでのリンク資産が全て失われてしまうので、表示順位は低くなるだろう。そこで「ページが無くなったのではなく移動した」ということをGoogleに伝え、ページの評価を新しいページに引き継がせる必要がある。そのためにはステータス「404」を返すのではなく、「301」を返して新しいページにリダイレクトさせれば良い。

Permalink Redirect

何か使えるプラグインがないかと調べると「Permalink Redirect | パーマリンクを変更しても、新しいURLに自動転送してくれるプラグイン」など「Permalink Redirect」を紹介している記事が多数。

とりあえず入れてみたものの、現在のバージョンのWordPressには対応していないようで、Noticeエラーを吐いてまともに動かなかった。

自力でなんとかしてみる

当ブログの古いパーマリンク構造は「/blog/%category%/%post_id%/」。ということは、この古いパーマリンクへのリクエストがあったときは、記事のIDがわかるということ。試しにリンク切れになっているページでリクエストの情報が入っている「$wp_query」をdumpしてみたところ

$wp_query->query_vars["page"]

に記事のIDが入っていることがわかった。

そこで、その記事IDをもとに現在のパーマリンクを取得し、リダイレクトさせることにした。

// functions.php
// リクエスト解析したぐらいのところのフックに引っ掛けて処理を実行。
add_action( 'wp', 'redirect404' );
function redirect404() {
	global $wp_query;
	if ( is_404() ) {
		// リクエスト情報から記事IDを取得、数値なら現在のURLにリダイレクト
		$id = $wp_query->query_vars["page"];
		if ( preg_match( '/^\d+$/', $id ) ) {
			wp_redirect( get_permalink( $id ), 301 );
			exit;
		}
	}
}

元のパーマリンク構造に %post_id% が含まれているとき限定だが同じような状況で悩まれている方は一度試してみては。

  • ブックマーク
  • Feedly

この記事を書いた人

キタジマタカシ

長崎在住、フリーランスのWordPress テーマ / プラグインデベロッパー。 多数のプロダクトをオープンソースで開発・公開しています。現在は WordPress 有料テーマ Snow Monkey を開発・販売しています。