デフォルトから現行のパーマリンクへリダイレクトできないWordPressの静的トップページ問題

デフォルトパーマリンクをリダイレクト

WordPressでトップページに静的ページを設定したあとに気づいた問題の一つに、ブラウザのアドレスバーへ投稿ページのデフォルトパーマリンクを入力したときに適用済みの現行パーマリンクにリダイレクトされないというのがありました。

この問題の解決へ試行錯誤した結果、次の暫定的な対処方法でなんとか運用を継続できています。

デフォルトパーマリンクをリダイレクトさせる方法

WordPressのトップページにHTMLで作成した静的ページを設定したときに起こるこの問題については、ちょっと調べた程度では解決策を見つけることができませんでした。

試行錯誤した結果、次のコードをindex.html(トップページ)に追加記述することで暫定的に解決できています。

HTMLへの記述

<?php require('./wp-load.php'); ?>
<?php

if (strpos($_SERVER['REQUEST_URI'], '/?p=') === 0) {
    // リクエストURLから投稿IDを抽出
    $post_id = (int) str_replace('/?p=', '', $_SERVER['REQUEST_URI']);

    // 投稿IDから投稿のURLを取得
    $post_permalink = get_permalink($post_id);

    // 投稿のURLが存在する場合はリダイレクト
    if ($post_permalink) {
        wp_redirect($post_permalink, 301);
        exit;
    } else {
        // 投稿が存在しない場合は404エラーを表示
        global $wp_query;
        $wp_query->set_404();
        status_header(404);
        include(get_query_template('404'));
        exit;
    }
}

require('./wp-blog-header.php');
?>

この記述をトップページに使っているHTMLページの記述に書き足します。挿入場所はDOCTYPE宣言(<!DOCTYPE html>)の手前、つまり先頭の書き出し部分に割り込ませることになります。

これで?p=とパラメータの組合せで入力した初期のパーマリンクでアクセスしたときに編集された正規のページURLへリダイレクトされ、該当するパラメータ(記事ID)が存在しないときは404エラーページを表示させることができます。

ここで暫定的に解決という表現にとどめている理由は、同様の問題が生じたサイトやその解決策について同じ対応をしたというケースや対策方法そのものを補完できる情報が乏しいことと、HTMLファイルにPHPを記述することになるのでトップページに適用させたページは静的ページと呼べなくなること。

また、ここで用いた方法ではデフォルトパーマリンクが入力されたときの挙動がWordPressのシステムが行う処理に及ばない(画像データに使われるIDがパラメータとして使われた場合には処理できない)ためです。

問題を放置することで想定される影響

今回、問題としていた症状は、ブラウザのアドレスバーへ投稿ページのデフォルトパーマリンクを入力した際に、既に編集済みとして公開している正規のパーマリンクにリダイレクトされずトップページが表示されてしまうというものでした。

普通にサイトを公開し運用しているだけでは、この不具合になかなか気づくことがないのでデフォルトパーマリンクが検索エンジンやサーバー、閲覧ユーザーなどに記憶させることが無ければ問題ないかのように思われます。

それでも何かの不都合があって、検索エンジンが投稿ページのパーマリンクをクロールしたときに適正にリダイレクトが行われるなどの処理がなされないとSEO的には良くない影響があると推測します。

WordPressはデフォルトパーマリンクからリダイレクトさせる機能がある?

そもそもの話ではありますが、投稿ページを公開した後にパーマリンクを変更したら個別にリダイレクトが必要なことはWordPressを扱う人なら知っている方も多いと思います。

しかし、最近では運用歴が標準テーマに限られるサイトでもデフォルトパーマリンクをアドレスバーに打ち込めばシステムが現行のパーマリンクへリダイレクトしてくれるようです(特定のプラグインによる作用かは不明)。

このことから、現行バージョンのWordPressでサイトを運用している環境下ではデフォルトパーマリンクでサイトにアクセスしたユーザーへは、システムが適正にリダイレクトをしてくれることを期待しても良いと判断できます。

今回の事例では、トップページに静的ページを指定したときに、この当然期待できるリダイレクト動作が行われないことが分かりました。

ここで解説した方法で暫定的には対応ができていますが、今後も同様の不具合についての情報や別な対応策がないか確認をしながらの運用が続くことになりそうです。

おすすめ記事

WordPressのトップページに静的HTML WordPressでトップページに静的htmlを使う方法とそれに伴う課題 サイト内検索 WordPressでトップページに静的htmlを使うことで起きるサイト内検索の問題を修正