本記事のソースコードの利用によって生じた損害について、当方は一切の責任を負いません。ご自身の判断と責任のもとで参照・ご利用ください。
目的
WordPressをサブディレクトリ(例:https://xxx.com/interview)にインストールして運営している場合、記事ページ(`is_single()`)以外のすべてのアクセスをルートURL(https://xxx.com/)にリダイレクトする設定が必要になることがあります。これは、記事の更新のみをWordPressで管理し、トップページと分けて運営したい場合に使われる設定です。具体的には、https://xxx.com/interview/article/ や https://xxx.com/interview/ など、記事ページ以外にアクセスした際に、https://xxx.com/ へリダイレクトされるようにする設定です。
この記事では、この目的を達成するためのWordPressリダイレクトの方法について、具体的なコード例を示しながら解説します。
サブディレクトリにインストールしたWordPressでリダイレクト設定をする理由
サブディレクトリにWordPressをインストールしている場合、サイトのURL構造は次のようになります。
https://xxx.com/interview/
しかし、ユーザーがhttps://xxx.com/interview/article/
などにアクセスしたとき、実際にはトップページhttps://xxx.com/
にリダイレクトさせたい場合があるでしょう。例えば、以下のようなケースでリダイレクトが有効です。
- トップページ以外のページへのアクセスをルートに集約したい
- サブディレクトリにインストールした理由や特定のURL構造が変更された場合
リダイレクトを実現するためのコード
以下のコードは、記事ページ(is_single()
)以外のアクセスがhttps://xxx.com/
にリダイレクトされるように設定します。
function redirect_non_singular_admin_login_to_parent_root() {
// --- リダイレクトを除外する条件 ---
// 1. 管理画面へのアクセスか?
if ( is_admin() ) {
return; // 管理画面ならリダイレクトしない
}
// 2. 個別の投稿・固定ページ・添付ファイルページか?
if ( is_singular() ) {
return; // 個別ページならリダイレクトしない
}
// 3. ログインページか?
$request_uri = isset( $_SERVER['REQUEST_URI'] ) ? $_SERVER['REQUEST_URI'] : '';
$login_path = wp_parse_url( site_url( 'wp-login.php' ), PHP_URL_PATH );
if ( $login_path && strpos( $request_uri, $login_path ) !== false ) {
return; // ログインページならリダイレクトしない
}
// --- リダイレクト処理 ---
$site_url = site_url(); // サイトURLを取得
$site_path = wp_parse_url( $site_url, PHP_URL_PATH );
if ( empty( $site_path ) || $site_path === '/' ) {
return; // ルートディレクトリにインストールされている場合はリダイレクトしない
}
// 親ディレクトリのURLを生成
$parent_dir_url = dirname( $site_url );
if ( ! $parent_dir_url || in_array($parent_dir_url, ['.', '/', '\\']) ) {
$scheme = is_ssl() ? 'https' : 'http';
$host = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : null;
if ($host) {
$parent_dir_url = $scheme . '://' . $host;
} else {
return; // ホスト名が取得できない場合はリダイレクトしない
}
}
// リダイレクト先のURLを構築
$target_redirect_url = rtrim( $parent_dir_url, '/' ) . '/';
// リダイレクトを実行(無限ループ防止)
$current_full_url = (is_ssl() ? 'https' : 'http') . '://' . $_SERVER['HTTP_HOST'] . $request_uri;
if ( $target_redirect_url !== $current_full_url ) {
wp_redirect( $target_redirect_url, 301 );
exit;
}
}
add_action( 'template_redirect', 'redirect_non_singular_admin_login_to_parent_root' );
コードの説明
管理画面やログインページを除外:
is_admin()
を使って、WordPressの管理画面にアクセスしている場合はリダイレクトしません。
wp-login.php
へのアクセスがあった場合もリダイレクトしません。
記事ページを除外:
is_singular()
を使って、投稿ページや固定ページ、添付ファイルページにアクセスしている場合はリダイレクトしません。
親ディレクトリにリダイレクト:
サブディレクトリにインストールされたWordPressの場合、親ディレクトリのURLをdirname()
で取得し、リダイレクト先を構築します。
無限リダイレクト防止:
リダイレクト前に現在のURLとリダイレクト先URLが同じでないかチェックし、無限ループを防止します。
SEOを意識したリダイレクト
リダイレクトに関してSEOを意識することは非常に重要です。特に、恒久的なリダイレクトにはHTTPステータスコード301
を使用しています。このコードは、検索エンジンに対してページが永続的に移動したことを伝えるため、SEOへの影響を最小限に抑えることができます。
301リダイレクト:
wp_redirect( $target_redirect_url, 301 );
を使用することで、検索エンジンに対して永続的なリダイレクトを伝えることができます。
ユーザー体験の向上:
不要なURLにアクセスするとトップページに自動的に移動するため、ユーザーにとっても便利で使いやすいサイト構成になります。