26
SEPTEMBER
ウェブTUESDAY 2017 / 9 / 26
Welcartで読み込んだテンプレート名を body_class に出力させたい
Text by Hiroyuki Matsumoto
WelcartはWordPress用の通販サイト作成プラグインです。
Welcart ではカートページ、商品ページ、メンバーページごとにテンプレート(雛形)を用意しておき、それにデータが埋め込まれる形で動作します。
ただ、どのテンプレートが呼び出されたのかというのがわかりづらいという問題があります。何かの方法で読み込んだテンプレートファイルが判明すればいいのですが……
もちろん各テンプレート側を書き換えるというのも手ですが、WordPressらしくアクションフックを使った処理でスマートに記述したいところです。
そんなわけで Welcart のソースコードを追っていくと、Welcart側でテンプレートファイルを呼び出す際にはWordPressの機能を使わずに php の include命令で呼び出していました……
わぉ、それじゃアクションフックが挟めねぇじゃねーの (´;ω;`)
しょうがないのでphpの言語仕様について調べたところ、get_included_files関数で過去に include / require したすべてのファイルを取得できるということで、こちらを使って作成しました。
add_action('get_header', 'addWelcartTemplateNameOnBodyClass'); function addWelcartTemplateNameOnBodyClass(){ if(! function_exists('usces_is_login')){ return; } // welcartが使える状態になっているかチェック $welcart_pattern = '/wc_templates/'; // テンプレートファイルのパスのパターンを指定。 $stop_pattern = '/wp-includes/template-loader.php'; // include されるファイル総数は400を越えるので、「ここまでしか読まない」というラインを設定しておく。 $list = get_included_files(); // これまでに include したファイルパスのリストを取得 for($i=count($list) -1; $i>=0 && strpos($path, $stop_pattern)===false; $i--){ $path = $list[$i]; if(strpos($path, $welcart_pattern)!==false){ // テンプレートファイルのパターンを発見したら $template_name = 'wct_'.basename($path, '.php'); // body class用のクラス名を生成し add_filter('body_class', function($classes) use ($template_name){ // body_class フィルターフックでクラス名を追加 $classes[] = $template_name; return $classes; }); break; } } }
注意1. 無名関数(クロージャ)を使用しているため、php5.3以降でないと動かないです。
注意2. welcart のバージョンは 1.9.2 で検証しています。
これを functions.php に記述しておくと、body_class関数を呼び出して、body要素にクラス名を付与する際に wct_ファイル名 という形式のクラス名を付与します。
※ wct : WelCart Template の略
例えば、カートページが呼び出された際にはbody要素に wct_wc_cart_page というクラス名を付与します。
この機能により、WordPress本体ソースコードを直接編集することなく追加処理の挿入が簡単にできるようになった。
また、拡張機能(プラグイン)を作りやすくしており、拡張機能の制作が盛んになったこともWordPress隆盛の一因。
TEXT by
松本 博之(まつもとひろゆき)
1978年、鳥取県米子市生まれ。
株式会社マジックワード WEBシステムの開発・運用を担当。
WordPressの実績多数。表面的な使用方法を把握するだけでなく、WordPressのソースコードを読み解いて対応できます。
国家資格の応用情報処理技術者をなんとなくとりました。