ob_start、ob_get_contentsを利用しショートコード内でinclude・WordPressプラグイン開発
2017/03/12
ショートコードでinclude、require処理するには ob_start()関数
ショートコードの処理の中でテンプレートを読み込む処理・ob_start()関数
WordPressのショートコードを使って処理を構築する際のお話です。
PHPの処理を含む HTML部分をテンプレート化し、それを取り込む際に include()関数を使ってファイルを読み込みますが、併せて使う ob_start()関数、ob_get_contents()関数について解説します。
ファイルを読み込む際に include()関数を使うのは、ファイルに記述した PHPの処理も含めて処理してくれるところがいいところなんですが、ショートコードで使用する場合は include()が記述されているその場所で標準出力されてしまうところが問題でした。
それを解決してくれるのが今回紹介する標準出力をバッファリングする ob_start()関数、バッファリングした情報を変数に代入する ob_get_contents()関数です。
ob_start()関数、ob_get_contents()関数については「PHP関数ob_start、ob_get_contentsで標準出力をバッファリング・変数に代入」で詳しく解説していますので、そちらを参照してください。
ファイルをインクルードする際の問題は、include関数だけではなく、include_once()関数、require()関数、require_once()関数でも同じですが、ob_start()関数を使えば同じように解決できます。
その他、関連する記事は下記になります。
ショートコードの使い方については「WordPress投稿にPHPを記述するショートコードの使い方add_shortcode」の記事を。
付随して、ショートコードで任意のファイルを読み込むだけの場合は「WordPress 任意のファイルを読み込むショートコードの処理」の記事を。
こちらでは「file_get_contents()関数」を使う方法を紹介しています。
functions.phpが置いてある場所については「WordPressの functions.phpがある場所」の記事を。
ショートコードで include()関数を使う問題点
例えば、下記のような外部ファイルを読み込むショートコード処理を作ったとしましょう。
下記のショートコードから呼び出される処理を記述する場所は、functions.phpでも、プラグインを作成する場合でも同じような問題を抱えています。
|
1 2 3 4 5 6 |
function function_ob_start_test ( $arg = array () ) { include "include_file.php"; } add_shortcode('ob_start_test', 'function_ob_start_test'); |
「include_file.php」は、以下のような内容です。
|
1 2 3 4 5 |
<div> あ<br /> <?php echo "い"; ?> <br /> う<br /> </div> |
投稿や固定ページに記述するショートコードは「[ob_start_test]」になります。
上記の処理を実行すると下記の画像のようなります。
上記の画像では「あいう」が 2か所に出力されています。
これは、includeしたところで一度標準出力され、さらにショートコードが編集されている箇所でもう一度出力されるからです。
include()した情報をバッファリング関数 ob_start()で取得
include()関数は、そういう処理なので仕方がないワケですが、このままでは WordPressのショートコードで処理を作成する場合には使えません。
そこで、下記のように標準出力をバッファリングする ob_start()関数、バッファリングした情報を変数に代入する ob_get_contents()関数、ob_end_clean()関数を使うことで対処を行います。
|
1 2 3 4 5 6 7 8 9 10 11 12 |
// ob_start()実験 function function_ob_start_test ( $arg = array () ) { ob_start(); include "include_file.php"; $html = ob_get_contents(); ob_end_clean(); return $html; } add_shortcode('ob_start_test', 'function_ob_start_test'); |
「ob_start()」と「ob_end_clean()」で囲んだ処理は標準出力されずにバッファリングされ、そのバッファリングされた内容を「$html = ob_get_contents()」の部分で変数「$html」に代入しています。
これにより、ショートコードを編集した場所にのみ「include_file.php」の内容が反映されるようになります。
この記述の方法を発見したことで、ショートコードを使ったプラグイン開発で、テンプレートを外部ファイル化することができ、開発の自由度が格段にアップしました!
HTMLファイルを読み込むなら file_get_contents()関数が簡単
先に紹介した「WordPress 任意のファイルを読み込むショートコードの処理」の記事では「file_get_contents()関数」でファイルを取り込む方法を紹介しています。
「file_get_contents()関数」は、PHPの関数の中でもすごく便利な関数で、ファイルの中身を取得して、その情報を変数に入れることができますので、静的な HTMLファイルを取り込むのであれば「file_get_contents()関数」で全く問題ありません。
ですが、この記事で解説した「include_file.php」ファイルのように、取得するファイルに PHPのコードが記述されていて、その PHPのコードを実行してその結果を編集したものを画面に表示したい、という場合には使えません。
サンプルで記載した「include_file.php」だと、「<?php echo “い”; ?>」の部分がそのまま表示されてしまいます。残念...
この方法は正しいのか!?
最後に。
ここで紹介した方法は、あくまでも「この方法で実行するとできました!」という内容です。
あちこちサイトを探してみましたが、明確に解説しているサイトが見当たらず、
「もしかするとバッドノウハウなのかも?」
「WordPressなんだからなんか専用の関数があるんじゃ?」
なんてことを思いながら記事を書きました。
これで問題ないのか、どなたか教えていただけると幸いです!
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
EWWW Image Optimizerで画像の圧縮でWordPressを高速化
ページ表示の高速化に使うEWWW Image Optimizerの紹介です。英語で書かれているために取っつきにくいですが設定は3カ所。画像の圧縮もワンクリック。超簡単!
-
-
WordPressのカテゴリの編集の解説
WordPressのカテゴリって何?というところから説明し、カテゴリを登録、編集する方法を解説します。また、カテゴリの順番を自由に変える方法も解説します。
-
-
CSV Importerで WordPressにcsvを取込む
WordPressに csvファイルを取り込む CSV Importerの使い方の解説です。
-
-
WordPressで ¥円マークが \ バックスラッシュになる原因と対処方法
円マークがバックスラッシュに変換される。その原因と対処方法を解説します。原因はCSSでのフォント指定に欧文フォントも含まれるため欧文フォントで表示されること。
-
-
Captchaを使って WordPressのコメントスパム対策をする
コメントスパム対策として入力させない対策の一つとしてCAPTCHAという方法がありそれを簡単に実装できるプラグインCaptchaの解説です。
-
-
Advanced Custom Fields(ACF)のアドオン・ギャラリーの使い方解説
Advanced Custom Fieldsのアドオン・ギャラリーの解説記事。複数の画像を入力できる優れもので、画像のサイズ、容量などでの制限ができ、より厳密な管理が可能。
-
-
SMTP Mailerでスパム判定回避。WP Mail SMTPで発生する送信エラーも対応
WordPressからのメールをスパム判定されずに送信する「SMTP Mailer」の解説。SMTP MailerはPHP 5.6、7.0になってもSMTP接続でエラーにならない設定を搭載しているのが特徴。
-
-
Custom Post Type UIでカスタムタクソノミーを設定・バージョン1.4対応解説
カスタムタクソノミーをプラグインCustom Post Type UIを使って設定する方法の解説。バージョンアップにより設定する項目も増え続け、より柔軟な設定が可能に。
-
-
AdminerはWordPressのデータベース管理プラグインの決定版!
データベース管理プラグインはAdminerがあれば他に必要ありません。なぜならDB管理ツールAdminerと同じものをプラグインとして提供しているからです。
-
-
MW WP Formの使い方詳細解説・WordPressの確認画面付フォーム
WordPressの確認画面付お問い合わせフォームプラグイン「MW WP Form」の詳細解説をしています。
