KANTENNA.COM

Solarized

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.phpとfunction.phpとstyle.cssだけにした場合 $templateにはindex.phpしか入ってこない。

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

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

TEMPLATEPATHの変更

TEMPLATEPATHはwp-includes/theme.phpのget_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.phpはTEMPLATEPATHとSTYLESHEETPATHが異なる場合、STYLESHEETPATHが最初に検索され 存在しない場合、TEMPLATEPATHも検索するのでどちらにおいてもよい。
  • get_header()など使わなくなるので、そこらへんのアクションにフックされているプラグインとかは動かなくなる。 使いたい場合、自分でトリガーすればよい。

トラックバック(3)

2012年1月 8日 06:05

[WordPress]囲み型ショートコードの改行とかエスケープとか。情報備忘録

囲み型ショートコードのコンテンツを普通に受け取ると、改行があったりセミコロンとかがエスケープされた状態になっている。 JavascriptとかPHPを書く...続きを読む

2012年1月14日 05:55

[WordPress] テンプレートのごちゃごちゃが限界にきたのでラッパー書いてみた。WEBプログラム覚書

テンプレートのごちゃごちゃが限界にきたのでラッパー書いてみた。でも僕なんかではなくもっとデキる人が書いたものを使いたいw続きを読む

2012年1月14日 06:02

[WordPress]3.0から非推奨になったこと。情報備忘録

3.0からheader.phpとfooter.phpがないテーマは非推奨になっとった。続きを読む

コメント

コメントする
Name
Email Address
URL
TIME LINE
2012
02.23

[Ubuntu]Gimp gimp-painterとショートカットの設定

デフォルトで入ってるGimpにG-PenMixBrushというのを追加すると お絵描きツールとして利用できるみたいなので入れてみた。OSはUbuntu11.10。

2012
02.22

[Ubuntu]動画ダウンロードと検索が簡単にできるGMediaFinder

Youtubeなどから動画を検索、ダウンロードが出来るソフトウェアGMediaFinder。 登録とか広告とか一切ありませんUbuntu版は。Windows版もありますよ。

2012
02.21
2012
02.20

[イラスト]きれいな線のイラストを簡単に描くには?

噂のGumroadを使いたくてTwitterのアカウント作った。タマゴだと友達が出来ないみたいなのでアイコン描こうと思った。 絵を描かなくなって軽く8年は経っていて、トレス台も行方不明だったので初めて下書きから全部デジタルでやってみたんだけど、やばい。

デジタルやばい。

2012
02.15

[WordPress] get_header()とwp_head()を捨てる。

捨てることで何かメリットがあるかと言うと残念ながら特にありませんので、この内容をオススメしてるわけではありません。

2012
02.14

[Eclipse]PDTのデバック構成でURLの自動生成が表示されない。

Linux 版のPDT3.0.2でデバック構成ウィンドウから新規作成するとURLの自動生成が表示されない。

2012
02.13

[PHP]Xdebugでvar_dump()の出力が省略されて困る場合の対応

Xdebugを利用している場合、var_dump()の出力が省略されて困る場合、 xdebug.iniかini_set()で設定する。

2012
02.10

[雑記]縦横がランダムな要素を隙間なく並べるのは無理なのか。

サイトマップ作ったんだけど、やりたかったことが出来なかった。

2012
02.08

[Ubuntu11.10]Winows XPユーザーがUbuntuを使ってみて

Windows XPとUbuntuのデュアルブート環境にしてみておもったこと。