WordPressのショートコードの表示位置が上に来てしまう問題を解決


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で出力する。

バッファリングはいろいろ応用がききそうですね。
ご覧いただきありがとうございました。

last

フォローする