どうも。最近、このサイトのパーマリンクの構造を変更しました。
すると、Google検索等に変更が反映されるまでは、404 Not Found が表示されちゃうんですよね。
それはどうしようもないんですが、それでは不便なのでpost-idを使ってリダイレクトするスクリプトを書きました。
変更前のURLの末尾が、post-XXXの場合は、これと全く同じコードを使うことが出来ます。もし違う場合は、少し変更して対応できると思います。
コードについて
コード本体
add_action(
'wp',
function ($wp) {
if (is_404()) {
$uri = $_SERVER["REQUEST_URI"];
$post_id = substr($uri, strrpos($uri, '-') + 1);
if($link = get_permalink(intval($post_id))){
header("HTTP/1.1 301 Moved Permanently");
header('location: ' . get_permalink(intval($post_id)));
exit();
}
}
}
);
これを、functions.phpに追記します。heaer関数を使っているので、これより前に文字列を出力しているとエラーとなります。
無名関数を使うかどうかはお好みで。
解説
add_action関数を使って、実行を遅延させています。なぜかというと、そのまま書いてしまうと、is_404関数が機能しなかったからです。毎回falseが返ってきました。
アクションフックはwpよりsend_headersのほうがよかったのかもしれませんが、それだとうまく行きませんでした。
また、普通は現在のURLの取得にget_permalinkを使うと思うんですが、これもうまくいかなかったので$_SERVER変数を使って取得しています。
そして、6行目で、substrとstrrposを使ってpost-idだけを取り出しています。この行を変更すれば、ほかのパーマリンク構造でも対応できそうですね。
そして、get_permalink()を使って、そのpost-idの投稿が存在するかどうかチェックしてから転送しています。
転送にはheader()関数を使っています。まず、http 301で恒久的に移動しましたっていう設定をしてから、locationで転送し、さらにexit()で実行を終了しています。