【WordPress】一部のページをテーマテンプレートから切り離して実装する
みなさんこんにちは、yamashitaです。
日中は窓を開けてると気持ちいいですが、日が落ちると寒くなってきましたね。
気温の上下に振り回されてる日々を送っています。
今回はWordPressの一部ページをテーマから切り離した状態で表示したい時の処理について紹介します。
あまり使用することもないかもしれませんが、特別な案件で、テーマ内の既存のテンプレートファイルを編集できないとのことで、この方法を使用したので手順等を記したいと思います。
準備すること
- テーマから切り離すパスを決める
- パスに応じたディレクトリとindex.phpの作成
- 必要に応じて別途PHPファイルの作成
- 必要に応じて.htaccessの作成
テーマから切り離すパスを決める
まず切り離すパスを決めなければ話は進みませんので、決めていきます。
例えば「カスタム投稿の一つのタイプの場合だけ」という場合はテーマ内にsingle-xxxx.php
を作ればいいだけですので、切り離す必要はありません。
今回は「一部のカテゴリの投稿のみ切り離したい」(※カテゴリがURLに入っている場合のみ)など、テンプレートを新しく作るだけでは実現できない場合を想定しています。
※single.phpやarchive.phpなどの共通テンプレートファイルをカテゴリごとに出力内容を変えられるよう修正できるのであれば、それで済みますので必要ない対応です。
パスに応じたディレクトリとindex.phpの作成
前項の想定例としてカテゴリーsample
に属する投稿、パーマリンクは/カテゴリ名/投稿ID
で考えて分けていきます。
まず、ドキュメントルート直下にsample
ディレクトリを作成し、index.phpを作成します。
index.phpには先頭にinclude "wp-blog-header.php";
を書いてください。
※ドキュメントルートとWordPressのインストールディレクトリが違う場合は相対パスで調整してください。
このindex.phpには/sample/
でアクセスできるため、WordPressと同じく該当の投稿一覧を表示します。
投稿情報の取得方法はget_posts()
かnew WP_Query()
が主だと思います。
REST APIで取得する方法もありますが、こちらはカスタムフィールドの取得や条件の設定にテーマ側で調整が必要になるため、お勧めしません。
取得した後は、通常のテンプレートファイルと同じようにwhileやforeachで出力してください。
必要に応じて別途PHPファイルの作成と.htaccessの作成
次に必要なファイルはsingle.php
です。※名前は何でもいいです
更に.htaccessも必要です。※パーマリンクを無視して/sample/single.php?id=nnnnn
でも問題なければ必要ないです。
.htaccessの内容は以下の通りです。
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /sample/
RewriteRule ^([0-9]+)$ ./single.php?id=$1
RewriteRule ^([0-9]+)/$ ./single.php?id=$1
</IfModule>
上の.htaccessでパーマリンク通り/sample/カテゴリID
でアクセスできるようになりました。
他にもパラメータが必要なページを作る場合は上の.htaccessを参考にリライトできるようにしてください。
single.php
の記述内容ですが。ここにも同じように先頭にはinclude "wp-blog-header.php";
を書いてください。
次に上の.htaccessで取得できるようになったIDを取得します。
$id = $_GET['id'];
これで取得したIDを基に投稿情報をget_post()
などで取得して表示してください。
最後に
静的なページやパラメータを使用しないページを使わない場合は.htaccessを使わなくて済みます。
また、全ての投稿情報の取得をREST APIで済ます場合はwp-blog-header.php
をincludeする必要もないです。
あまりこのような実装をすることもないと思いますが、実装する際は参考にしてみてください。