WordPress記事内でSmartyのテンプレートを使いたい人のためのソースコード

WEB運用

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の両立を目指していますが、勝手に整形されるのが難点ですよね。

とりあえず、メモ代わりの超マニアックな記事でしたが、お付き合い下さりありがとうございます。