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.php | templates/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が複雑に絡む環境(専用ルール設計が必要)
✅ 導入手順まとめ
templates/
に PHPファイルを作成- そのファイルの相対パスを
settings/page_map.php
に記述 functions/virtual_pages.php
にルーティング処理を記述(または再利用)- テーマの
functions.php
からそれらを読み込む - WordPress管理画面でパーマリンク設定を「保存」して Rewrite ルールを反映
✅ まとめ
この仮想ページルーティング構成は、
WordPressの自由度とテーマファイルによる構成管理のバランスを取る強力な手法です。
.php
拡張子の有無にとらわれず、明確なパス設計と管理が可能になるため、
会員制システムや業務系画面をテーマファイルのみで安全かつ効率的に管理できます。
コメント