WordPressを使っていると、独自のPHPコードを固定ページ中に入れたくなる時があります。以前まではExec-PHPを使う場合が多かったように思いますが、最近はセキュリティの問題で、function.php内に記述したPHPコードを、ショートコードにより呼び出すことによって、実現するようになりました。しかし、ショートコードの部分にPHPコードがそのまま代入されるかのごとく動作すると思いきや、固定ページの上方に出力されてしまいます。これはWPの内部処理段階においてecho文が動作してしまうためです。ここでは、勝手に内部処理によってechoの結果が画面に表示されてしまわないための工夫を紹介します。
スポンサーリンクreturnを使う
echoを普通に使ってしまっては、勝手に出力されてしまいます。そこで、returnを使用するようにすれば、勝手に出力されることはなくなります。ただ、echo文をreturn文に書き換えまくるのはちょっとしんどいことが多いと思います。そこで、もう一工夫します。
(もともとショートコードはreturnを使うことを想定した仕様となっているっぽいですが…)
PHP標準の出力バッファリング機能を利用する
PHP(4以上)には、標準で出力のバッファリングの機能がついています。これを使って、画面ではなくバッファの方へechoで出力しておいて、そのバッファをまるごとreturnする手法が使えます。とても簡単に実装できるので、お試しあれ!
実装
例えばこんなショートコードを作ったとします。
<?php
function hoge() {
echo 'ショートコードテスト';
}
add_shortcode('hoge', 'hoge');
固定ページの中身は
前の文
[hoge]
後の文
こんな感じです。
このままでは、
こんな変なところにショートコードが適用されてしまいます。というわけで、バッファリングを使います。
ショートコードの処理を
ob_start();
と
return ob_get_clean();
で囲みます。
<?php
function hoge() {
ob_start();
echo 'ショートコードテスト';
return ob_get_clean();
}
add_shortcode('hoge', 'hoge');
このように書き換えます。すると、
このように、思い通りの位置に表示されます。
テーマファイル内の関数をうまく使ってショートコードを作成したいが、その関数の中身ではechoが使用されているという場合などに応用できます。
スポンサーリンクまとめ
WordPressのショートコードの出力位置がおかしいときは、出力内容をバッファに一時出力したのち、一気にreturnで出力する。
バッファリングはいろいろ応用がききそうですね。
ご覧いただきありがとうございました。