パーマリンクを変更しても404を表示させない!!

どうも。最近、このサイトのパーマリンクの構造を変更しました。

すると、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()で実行を終了しています。