WordPressのでSmartyコードを書きたいと思ったことありませんか?基本的にWordPressはブログ形式なので、ループや変数といった事は苦手です。投稿ページを動的に作るためにSmartyという選択肢をどうぞ。
WordPressにSmartyを埋め込む
Smartyを埋め込むのは非常に簡単。functions.phpに次のSmartyをインクルードしてあげるだけです。
<?php require_once ('Smarty/libs/Smarty.class.php') ; $smarty = new Smarty(); ?>
ここまでは簡単です。これで、Smartyが使えるようになりました。
$smarty->template_dir = '/Wordpressのパス/wp-content/themes/cocoon/templates'; $smarty->compile_dir = '/Wordpressのパス/wp-content/themes/cocoon/templates_c';
Templatesの場所はどこでもいいので、好きな場所に設置してください。
WordPressでSmartyを表示する
これは様々な方法があると思いますが、一番簡単なのがショートコードを作る事です。同じくfunctions.phpの中につぎのコードを入れてみましょう。
function smarty_func() { $html = $smarty->fetch("output.tpl"); return $html; } add_shortcode('smarty_hoge', 'smarty_func');
これで、ショートコード [smarty_hoge] が使えるようになります。
fetchを使うことで、output.tplの中身が変数$htmlの中に格納され、returnされているわけですね。
しかし、これだと普通すぎてつまらないです。
そこでふと思いました、記事の中にそのままSmartyコードを埋め込むことができないのかと。
試行錯誤した結果、なんとか記事の中にSmartyコードを入れてることに成功したので、その方法を公開します。
WordPressの記事テンプレートを利用する
まずは投稿ページテンプレート single.php をコピーして自由な名前を付け、テーマファイルがある場所に設置しましょう。中身はこんな感じです。
<?php /* Template Name: Smartyテンプレートファイル Template Post Type: post, page */ ?>
これを投稿用の記事テンプレートとして使います。
この記事テンプレートに先ほどのSmartyを読み込んでも使えます。functions.phpに書かなくてもOKです。
例えばこんな感じのテンプレートになります。
<?php /* Template Name: Smartyテンプレートファイル Template Post Type: post, page */ require_once('Smarty/libs/Smarty.class.php'); $smarty = new Smarty(); $smarty->template_dir = '/Wordpressのパス/wp-content/themes/cocoon/templates'; $smarty->compile_dir = '/Wordpressのパス/wp-content/themes/cocoon/templates_c'; ?>
この記事テンプレートの中で、$_GET、$_POSTなんて変数も受け取ることができます。幅が広がりますよね。
この記事テンプレートを表示するだけでは、投稿ページ内でSmartyコードは使えません。今回のゴールは投稿ページ内でSmartyコードを使えるようにすることですので、もう一工夫必要です。
その工夫されたコードは、こんな感じです。
ob_start(); get_template_part('tmp/page-contents'); $contents = ob_get_contents(); ob_get_clean(); $smarty->display('string:' .$contents);
ob_start(); で標準出力を乗っ取ります。
その後、get_template_part(‘テンプレート’); を呼び出し、出力をバッファーに。
$contents の中にobした内容を格納します。
ob_get_clean(); はobした内容を破棄。まー呪文ですよね。
最後が一番のポイント。
$smarty->display(“string:” .$contents);
ここがミソです。
smartyは、”string:”を付けることによって、変数の中身をテンプレートとして評価します。つまり、変数をテンプレートとして扱うことが出来るわけです。
これで、投稿ページに書かれたSmartyのコードを評価してくれるようになるわけです。ここを調べるのに半日かかりました。笑
ソース全体を見るとこんな感じになります。
<?php /* Template Name: Smartyテンプレートファイル Template Post Type: post, page */ require_once('Smarty/libs/Smarty.class.php'); $smarty = new Smarty(); $smarty->template_dir = '/Wordpressのパス/wp-content/themes/cocoon/templates'; $smarty->compile_dir = '/Wordpressのパス/wp-content/themes/cocoon/templates_c'; //ヘッダー表示 get_header(); //GETもPOSTも普通に使える $user = $_GET['user']; $address = $_POST['address']; $smarty->assign('user',$user ); $smarty->assign('address',$address); //標準出力をバッファリング ob_start(); get_template_part('tmp/page-contents'); $contents = ob_get_contents(); ob_get_clean(); //Smartyテンプレートとして評価 $smarty->display('string:' .$contents); //フッター表示 get_footer(); ?>
これで記事の中で{$user}や{$address}が使えるようになります。なんて便利!!
名前なんかを{$user}としておけば、「https://damema.net/page/?user=太郎」とかいうのにも対応するわけです。クッキーやセッションなんかも使えますね。
まとめ
GET、POSTも使えるため、データベースでゴリゴリ処理した動的なページもWordPressで作れますよね。
さらに、テンプレートファイルを用意することなく、記事をそのままテンプレートとして扱えるわけですが、一つだけ注意事項があります。
記事内で{foreach}{/foreach}などを扱うと、ただの文字列として評価されますので、勝手に<p>タグが入ったりしちゃいます。可能な限りコードで編集するようにしたほうが無難かもしれません。
デザインとSmartyの両立を目指していますが、勝手に整形されるのが難点ですよね。
とりあえず、メモ代わりの超マニアックな記事でしたが、お付き合い下さりありがとうございます。