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