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

今年に入りパーマリンク構造を変更した。自動的にリダイレクトされると思っていたのだが、リダイレクトされるのはパーマリンク構造は変更せずに、記事のパーマリンクを変えたときのみだったようで、これまで地道に増えてきた多数のリンクが全て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% が含まれているとき限定だが同じような状況で悩まれている方は一度試してみては。

MW WP Form

MW WP Form はショートコードベースのフォームプラグインです。多くの機能を持っており、例えば、多くのバリデーションルール、問い合わせデータの保存、そしてグラフ機能集計などを使用することができます。

さらに詳しく
Habakiri

Habakiri

Bootstrap ベースのシンプルな WordPress テーマ。レスポンシブ、多くのカスタマイズ機能。圧縮された CSS・JS を使用する高速化対策。Microformats 対応。Sass、クラスベースの functions.php。

さらに詳しく
basis-stylus

Basis

軽量なレスポンシブ Stylus/CSS フレームワーク。Flexbox ベースのグリッドシステム、疎結合なコンポーネント、バーティカルリズム。

さらに詳しく