ウィジェットにPHPファイルを読み込むショートコード
-
ウィジェットにPHPファイルを読み込むショートコードを追加するのに functions.php に下記のコードを追記するというのをよく拝見します。
add_filter( 'widget_text', function( $ret ) { $php_file = 'alias'; if( strpos( $ret, '[' . $php_file . ']' ) !== false ) { add_shortcode( $php_file, function() use ( $php_file ) { get_template_part( $php_file ); }); ob_start(); do_shortcode( '[' . $php_file . ']' ); $ret = ob_get_clean(); } return $ret; }, 99 );
ここで、なぜ、strpos を使う必要があるのかが、いまいちよく分かっていません。
シンプルに下記ではなぜダメなのか、その問題点をご教示いただけると幸いです。$php_file = 'alias'; add_shortcode( $php_file, function() use ( $php_file ) { get_template_part( $php_file ); }); add_filter('widget_text', 'do_shortcode' );
以上、よろしくお願いいたします。
-
こんにちは
get_template_part() はテンプレートファイルを読み込みます。ファイルの読み込み処理は比較的遅い処理といえます。ファイルサイズが極端に大きくなければ問題ないレベルかもしれませんが、それを避けるためではないでしょうか?
そのコードはLuxeritas開発者のるな氏が考えたもので、
なので、eval() もプラグインも使わず、もう少し安全で、なおかつ速度も出るようにウィジェットで PHP コード動かす方法を考えてみた。
とありますので、ishitaka氏の言うとおり速度重視の記述なのだと思います。
こんにちは
下のコードを実際に試してみたのでしょうか?実際に動かすと多分おかしなことになると思うのですが・・・
2つのコードには、以下の2点が大きく異なります。1.上のコードではテキストウィジットに
[alias]
というショートコードが記述されている場合だけテンプレートを読み込む。
下のコードではテキストウィジットにショートコードがなくてもテキストウィジットであれば常にテンプレートを読み込む。2.上のコートでは
widget_text
はフィルターフックなので値を返す必要があり、ob_start()
ob_get_clean()
を使ってテンプレートを読み込んだ結果を変数に入れ、関数の返り値としている。
下のコードではテンプレートを単純に読み込んでいるので、ウィジットのタイトルより先にテンプレートの内容が出力される。strpos の必要性は、1の
[alias]
というショートコードが記述されている場合だけ動かすためだと思います。- この返信は3年、 9ヶ月前にmunyaguが編集しました。
- トピック「ウィジェットにPHPファイルを読み込むショートコード」には新たに返信することはできません。