HOME>WEBプログラム覚書>[WordPress] テンプレートルーティングのメモ

[WordPress] テンプレートルーティングのメモ

WordPressが呼びだすテンプレートをTEMPLATEPATH直下じゃなくてTEMPLATEPATH/views/とかにできるのか調べた時のメモ。 バージョンはWordPress 3.3 日本語版。

wp_includes/tempate_loader.php

テンプレートの選択、呼び出しはこのファイルで実行される。

template_redirectアクション

リクエストされたページの表示に使用するテンプレートファイルを判断する前に実行し、プラグインがテンプレートファイルの選択を上書きできるようにする。

プラグイン API/アクションフック一覧 - WordPress Codex 日本語版

とあるが、基本的にここで何をしようが、次のテンプレート選択処理に入る気がする。例外投げるとかdieするとかリダイレクトするとかすれば別だが。 なのでtemplate_redirect()はテンプレートファイルの選択を上書きというより、 wordpressがテンプレートを読み込む前に、リダイレクトしたいとか何らかの処理をしたい場合に利用するものっぽい。

本当にここでテンプレート選択処理をしたいのなら、/index.phpで設定されてる

PHP

  1. <?php
  2. define('WP_USE_THEMES', true);
  3. ?>

を削除するかfalseにすればテンプレート選択処理には入らないので、リダイレクト先のファイルで テンプレートのルーティングを実装すればよい。 このファイルってコアに含まれるのだろうか?

で、WordPressがルーティングしたテンプレートを変更したい場合。

ルーティングしたいテンプレートが決まっている場合。

wp_includes/theme.phpのget_query_template()関数内で設定されている {$type}_templateフィルターを利用する。

$typeには、indexとか404とかcategoryとか呼ばれるテンプレートのタイプ名?が入る。

WordPressをサイトの一部として利用していて、404はサイトのものを利用したい場合。 まぁ404.phpから呼び出すとかでもいいんだけど例ってことで。

PHP

  1. <?php
  2. add_filter('404_template', 'my_404_template', $templates);
  3.  
  4. function my_404_template($template) {
  5.     return $_SERVER['DOCUMENT_ROOT'] . '/errors/404.php';
  6. }
  7. ?>

$templateにはWordPressのルーティングで決定されたテンプレートのパスが入る。 この場合、

ABSPATH/wp-content/themes/theme_name/404.php

のように。

全てをルーティングしたい場合

template_loader.php内でテンプレートが呼ばれる直前に apply_filters( 'template_include', $template )というフィルタが 設定されているのでこれにフックすればよい。

$templateはインクルードされるテンプレートのフルパス。 function.php内でこんな感じで設定する。

PHP

  1. <?php
  2. add_filter('template_include', 'my_template_include', $template);
  3. function my_template_include($template) {
  4.     $name = pathinfo($template, PATHINFO_FILENAME);
  5.     switch ($name) {
  6.         case '404':
  7.             $load_file = $_SERVER['DOCUMENT_ROOT'] . '/errors/404.php';
  8.             brea;
  9.  
  10.         default:
  11.             $load_file = $template;
  12.             break;
  13.     }
  14.     return $load_file;
  15. }
  16. ?>

ただ、この場合テーマ直下をindex.phpfunction.phpstyle.cssだけにした場合 $templateにはindex.phpしか入ってこない。

WordPressのテンプレート階層はTEMPLATEPATHにあるファイルの存在を確認することで決定しているので TEMPLATEPATH/views/をテンプレート設置場所にしたい場合、TEMPLATEPATH自体を変更しないといけない。

ただfunction.phpが呼ばれる時点ではTEMPLATEPATHは決定されているので、ここがfunction.phpの限界点。 TEMPLATEPATHを変更するにはプラグインを利用する必要がある。

TEMPLATEPATHの変更

TEMPLATEPATHwp-includes/theme.phpget_template_directory()の実行結果で決まっていて、この関数では

PHP

  1. <?php
  2. return apply_filters( 'template_directory', $template_dir, $template, $theme_root );
  3. ?>

が設定されているので、プラグインで、

PHP

  1. <?php
  2. template_directory($template_dir, $template, $theme_root)
  3. {
  4.     return $template_dir . '/views/';
  5. }
  6. ?>

とすることで、TEMPLATEPATHの変更が可能となる。 でもってテンプレートが呼び出される直前で実行されるtemplate_include

PHP

  1. <?php
  2. add_filter('template_include', 'my_template_include', $template);
  3.  
  4. function my_template_include($template)
  5. {
  6.     // グローバルなオブジェクトとか変数に
  7.     // 本来呼び出されるファイルのパスを保存。
  8.     Configure::write('View.file', $template);
  9.  
  10.     // WordPressは常にテーマ直下のindex.phpを呼び出す
  11.     return get_theme_root() . DS . get_template() . DS . 'index.php';
  12. }
  13. ?>

としておくことでテーマ直下のindex.phpからテンプレートをビューとして呼び出せる。

PHP

  1. <?php
  2. <html>
  3.     <head>
  4.     </head>
  5.     <body>
  6.  
  7.         <?php require_once(Configure::read('View.file')); ?>
  8.  
  9.     </body>
  10. </html>
  11. ?>

これでCakePHPのようにビューとレイアウトを分けることが出来そうな気がする。 まだ実装はしてないのでわからんけどw

追記

ファイル確認はSTYLESHEETPATHが優先されるので、テーマ直下がSTYLESHEETPATHで、index.phpを呼び出すパターンの場合、上記だとviews/index.phpではなくテーマ直下のindex.phpが選択される。なので

PHP

  1. <?php
  2.     // WordPressは常にテーマ直下のfront_controller.phpを呼び出す
  3.     return get_theme_root() . DS . get_template() . DS . 'front_controller.php';
  4. ?>

など、フロントコントローラーはWordPressのテンプレート階層で利用されないファイル名にした方がよい。

その他メモ

  • funtions.phpTEMPLATEPATHSTYLESHEETPATHが異なる場合、STYLESHEETPATHが最初に検索され 存在しない場合、TEMPLATEPATHも検索するのでどちらにおいてもよい。
  • get_header()など使わなくなるので、そこらへんのアクションにフックされているプラグインとかは動かなくなる。 使いたい場合、自分でトリガーすればよい。
投稿日 2011年12月19日 04:40
カテゴリ PHP
タグ WordPress
トラックバック URL http://www.kantenna.com/cgi-bin/mt504/mt-tb.cgi/1247

コメント

コメントする
Name
Email Address
URL