WordPressで .php 拡張子の有無やディレクトリ形式にも対応できる仮想ページルーティングを構築する

WordPress では通常、固定ページや投稿を使ってページを追加していきますが、
業務システムや会員専用エリアなど、管理画面を使わずにコードのみでページ構成を管理したいケースも少なくありません。

本記事では、以下のような要件をすべて満たす柔軟な仮想ページルーティング機構の構築方法を解説します。


✅ この方法で実現できること

  • .php 拡張子の あり・なし両方のURL形式に対応
  • /private_area/section/item/ のようなディレクトリ形式でアクセスしても index.php を自動補完
  • page_map.php に記載されたテンプレートパスのみを有効とし、管理とセキュリティを強化
  • 投稿や固定ページを使わず、テーマファイルだけでページ構成を管理可能
  • SEOにも優しい、整然としたURL設計

📁 ディレクトリ構成イメージ

your-theme/
├── settings/
│   └── page_map.php         ← 仮想ページの一覧を定義
├── functions/
│   └── virtual_pages.php    ← Rewriteルールとテンプレート読込処理
├── templates/
│   └── private_area/
│       └── section/
│           ├── item/
│           │   ├── detail.php
│           │   └── index.php
│           └── index.php

🔧 settings/page_map.php の定義例

<?php
return [
    'private_area/section/index.php',
    'private_area/section/item/index.php',
    'private_area/section/item/detail.php',
];

このように、テンプレートファイルの相対パスを1行ずつ記述するだけで
対応するURLへの Rewrite ルールが自動生成されます。


⚙ functions/virtual_pages.php の主な機能

1. Rewriteルールを自動生成

.php 拡張子の有無や index.php 補完に対応したルールを動的に登録します。

add_rewrite_rule(
  '^private_area/section/item/?$',
  'index.php?vp_virtual_path=private_area/section/item/index.php',
  'top'
);
add_rewrite_rule(
  '^private_area/section/item/detail\.php$',
  'index.php?vp_virtual_path=private_area/section/item/detail.php',
  'top'
);
add_rewrite_rule(
  '^private_area/section/item/detail/?$',
  'index.php?vp_virtual_path=private_area/section/item/detail.php',
  'top'
);

2. クエリ変数の登録

add_filter('query_vars', function ($vars) {
    $vars[] = 'vp_virtual_path';
    return $vars;
});

3. テンプレートの読み込み処理

add_filter('template_include', function ($template) {
    $filepath = get_query_var('vp_virtual_path');

    if (!preg_match('/\.php$/', $filepath)) {
        $filepath .= '/index.php';
    }

    $full_path = get_template_directory() . '/templates/' . $filepath;

    if (file_exists($full_path)) {
        return $full_path;
    }

    return $template;
});

✅ 対応できるURLの例

アクセスURL読み込まれるテンプレートファイル
/private_area/section/templates/private_area/section/index.php
/private_area/section/item/templates/private_area/section/item/index.php
/private_area/section/item/detail.phptemplates/private_area/section/item/detail.php
/private_area/section/item/detail/同上(.php 拡張子なしでも可)

✅ メリットとデメリット

✅ メリット

内容説明
管理画面不要投稿や固定ページを使わず、完全にテーマ側でページ管理が可能
URLの柔軟性階層構造や任意のファイル名(foo/bar/detail.php など)に対応
高速にページを追加可能テンプレートファイルを設置し page_map.php に1行追加するだけ
セキュリティ管理がしやすい定義されたパス以外は受け付けないため、意図しないアクセスを防げる
SEO・UX向上.php 拡張子を含まないURL設計ができ、ユーザーにも優しい

⚠ デメリット(注意点)

内容説明
ページ追加はコード作業が必要管理画面からページ追加はできないため、非開発者にはややハードルがある
パーマリンク設定の再保存が必要Rewriteルールを反映させるには「設定 → パーマリンク設定」で再保存が必要
ルール外アクセス時の制御が必要page_map.php にないURLにアクセスがあった場合、404制御などの追加対応が必要なことも
URL構成とテンプレートパスの整合性が重要一貫性を保つ設計が求められるため、構成ルールを定めて運用する必要がある

📝 この仕組みが向いているサイト

  • 会員制サイトのマイページや各種照会機能ページ
  • 業務用出力画面や管理ダッシュボード
  • 投稿や固定ページでは表現しにくい動的出力が必要な画面

✋ 避けたほうがよいケース

  • 非開発者が日常的にページを追加・編集する必要がある
  • WordPressの投稿・固定ページ機能を中心としたCMS用途
  • 多言語対応や動的URLが複雑に絡む環境(専用ルール設計が必要)

✅ 導入手順まとめ

  1. templates/ に PHPファイルを作成
  2. そのファイルの相対パスを settings/page_map.php に記述
  3. functions/virtual_pages.php にルーティング処理を記述(または再利用)
  4. テーマの functions.php からそれらを読み込む
  5. WordPress管理画面でパーマリンク設定を「保存」して Rewrite ルールを反映

✅ まとめ

この仮想ページルーティング構成は、
WordPressの自由度とテーマファイルによる構成管理のバランスを取る強力な手法です。

.php 拡張子の有無にとらわれず、明確なパス設計と管理が可能になるため、
会員制システムや業務系画面をテーマファイルのみで安全かつ効率的に管理できます。

コメント

タイトルとURLをコピーしました