サポート » 使い方全般 » ウィジェットにPHPファイルを読み込むショートコード

  • 解決済 JunichiK

    (@junichik)


    ウィジェットに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' );

    以上、よろしくお願いいたします。

4件の返信を表示中 - 1 - 4件目 (全4件中)
  • ishitaka

    (@ishitaka)

    こんにちは

    get_template_part() はテンプレートファイルを読み込みます。ファイルの読み込み処理は比較的遅い処理といえます。ファイルサイズが極端に大きくなければ問題ないレベルかもしれませんが、それを避けるためではないでしょうか?

    moyo55

    (@moyo55)

    そのコードはLuxeritas開発者のるな氏が考えたもので、

    なので、eval() もプラグインも使わず、もう少し安全で、なおかつ速度も出るようにウィジェットで PHP コード動かす方法を考えてみた。

    とありますので、ishitaka氏の言うとおり速度重視の記述なのだと思います。

    munyagu

    (@munyagu)

    こんにちは

    下のコードを実際に試してみたのでしょうか?実際に動かすと多分おかしなことになると思うのですが・・・
    2つのコードには、以下の2点が大きく異なります。

    1.上のコードではテキストウィジットに[alias]というショートコードが記述されている場合だけテンプレートを読み込む。
      下のコードではテキストウィジットにショートコードがなくてもテキストウィジットであれば常にテンプレートを読み込む。

    2.上のコートではwidget_textはフィルターフックなので値を返す必要があり、ob_start()ob_get_clean()を使ってテンプレートを読み込んだ結果を変数に入れ、関数の返り値としている。
     下のコードではテンプレートを単純に読み込んでいるので、ウィジットのタイトルより先にテンプレートの内容が出力される。

    strpos の必要性は、1の[alias]というショートコードが記述されている場合だけ動かすためだと思います。

    • この返信は3年前にmunyaguが編集しました。
    トピック投稿者 JunichiK

    (@junichik)

    皆様、ありがとうございます。

    >ishitakaさん、moyo55さん
    ありがとうございます。
    速度重視ということで腹落ちしました。

    >munyaguさん
    ありがとうございます。
    下のコードの場合でも特に見かけ上の不具合はありませんでした。
    しかしお詳しい動作のご説明で、テンプレートを読み込んだ結果を変数に格納して関数の返り値とするか、単純にテンプレートを読み込んでいるかの違いに気づきました。
    ありがとうございました。

4件の返信を表示中 - 1 - 4件目 (全4件中)
  • トピック「ウィジェットにPHPファイルを読み込むショートコード」には新たに返信することはできません。