web-dev-qa-db-ja.com

含める PHP [shortcode]を使用してコンテンツ内のファイル

これは私が持っているものです

ショートコードを使用してコンテンツエディタにファイルを単純に含める方法を見つけることはできません。

例えば私が私の連絡先ページの中にform.phpをインクルードしたい場合、どのように私はこれをショートコードを使って起こさせるでしょうか?

以下は役に立ちませんでした。

任意の助けは大歓迎です!

// Shortcode implementation
function magic_stuff($atts) {

// turn on output buffering to capture script output

ob_start();

// include file (contents will get saved in output buffer)

include(TEMPLATEPATH.'/wp-content/themes/grainandmortar/inc_static/test.php');

// save and return the content that has been output

$content = ob_get_clean();
return $content;
}
//register the Shortcode handler
add_shortcode('magic', 'magic_stuff');
4
Eric Downs

私はこれを行うために古いブログ投稿からのいくつかのコードを修正し、同様にファイルにクエリ文字列を添付することを可能にします。

オリジナルのクレジットは amberpanther.com に行きます、そしてそれは彼らも プラグイン を作ったことがわかります。

//create the shortcode [include] that accepts a filepath and query string
//this function was modified from a post on www.amberpanther.com you can find it at the link below:
//http://www.amberpanther.com/knowledge-base/using-the-wordpress-shortcode-api-to-include-an-external-file-in-the-post-content/
//BEGIN amberpanther.com code
function include_file($atts) {
     //if filepath was specified
     extract(
          shortcode_atts(
               array(
                    'filepath' => 'NULL'
               ), $atts
          )
     );

     //BEGIN modified portion of code to accept query strings
     //check for query string of variables after file path
     if(strpos($filepath,"?")) {
          $query_string_pos = strpos($filepath,"?");
          //create global variable for query string so we can access it in our included files if we need it
          //also parse it out from the clean file name which we will store in a new variable for including
          global $query_string;
          $query_string = substr($filepath,$query_string_pos + 1);
          $clean_file_path = substr($filepath,0,$query_string_pos);     
          //if there isn't a query string
     } else {
          $clean_file_path = $filepath;
     }
     //END modified portion of code

     //check if the filepath was specified and if the file exists
     if ($filepath != 'NULL' && file_exists(get_stylesheet_directory_uri() . "/" . $clean_file_path)){
          //turn on output buffering to capture script output
          ob_start();
          //include the specified file
          include(TEMPLATEPATH.$clean_file_path);
          //assign the file output to $content variable and clean buffer
          $content = ob_get_clean();
          //return the $content
          //return is important for the output to appear at the correct position
          //in the content
          return $content;
     }
}
//register the Shortcode handler
add_shortcode('include', 'include_file');
//END amberpanther.com code
//shortcode with sample query string:
//[include filepath="/get-posts.php?format=grid&taxonomy=testing&term=stuff&posttype=work"]

私はスタイルシートのURIから取得するように設定しました(それは子テーマなどでうまくいくでしょう)が、そのコードを(プラグインディレクトリを含む)どこからでも簡単に調整できるように調整できます。ファイルをインクルードするとき。テンプレートディレクトリに "#"を使用するなどのように、ファイル名の最初の文字が何であるかに基づいて特定のパスを使用するように指示するトリガー文字を含む条件を先頭に追加することもできます。

私はそれを使って私のテンプレートディレクトリにあるget-posts.phpと呼ばれるファイルを引き込み、クエリ文字列で与えられた一連のパラメータに基づいて様々な投稿の出力をフォーマットします。ファイルをインクルードしてフォーマットを送信することができ、get-posts.phpファイルで指定したマークアップを使用して投稿を出力できるので、特別なテンプレートが不要になります。

それはまたクライアントが特定のフォーマットで実際のブログ投稿にカスタム投稿タイプを引っ張ることを可能にし、そして非常に便利です。

あなたが何かを明確にする必要があるかどうか私に知らせてください。

2
Eric Allen

これを行う別の方法は、wordpressのget_template_partを利用することです

function include_file($atts) {
     $a = shortcode_atts( array(
        'slug' => 'NULL',
       ), $atts );

      if($slug != 'NULL'){
        ob_start();
        get_template_part($a['slug']);
        return ob_get_clean();
      }
 }
 add_shortcode('include', 'include_file');

例を示します。

[include slug="form"]

[include slug="sub-folder/filename_without_extension"]

4
adedoy

$ slugは定義されていないため、@adedoyが提供するソリューションにはエラーがあります。これは私のために働いた:

function include_file($atts) {

$atts = shortcode_atts(
    array(
    'path' => 'NULL',
    ), $atts, 'include' );

    ob_start();
    get_template_part($atts['path']);
    return ob_get_clean();

}

add_shortcode('include', 'include_file');
1
CharlesM

私はAmberPantherの人々によって最初に書かれたインクルードコードが私のためにあまりうまくいかなかったことがわかったので、私はほぼ同じことをする別のワードプレスプラグインを見つけました。 Stefano LissaによってInclude Meと呼ばれています。使い方はほとんどあなたがあなたのサイトのルートディレクトリから始めて、ファイルにあなたのパスを書くことです。

たとえば、WordPressページ内に次のように書きます。

[includeme file="wp-content/themes/your-theme/code/example-code.php"]

そして、あなたのfunctions.phpファイルの中にあなたが含むでしょう:

<?php

if (is_admin()) {
include dirname(__FILE__) . '/admin.php';

} else {

function includeme_call($attrs, $content = null) {

    if (isset($attrs['file'])) {
        $file = strip_tags($attrs['file']);
        if ($file[0] != '/')
            $file = ABSPATH . $file;

        ob_start();
        include($file);
        $buffer = ob_get_clean();
        $options = get_option('includeme', array());
        if (isset($options['shortcode'])) {
            $buffer = do_shortcode($buffer);
        }
    } else {
        $tmp = '';
        foreach ($attrs as $key => $value) {
            if ($key == 'src') {
                $value = strip_tags($value);
            }
            $value = str_replace('&amp;', '&', $value);
            if ($key == 'src') {
                $value = strip_tags($value);
            }
            $tmp .= ' ' . $key . '="' . $value . '"';
        }
        $buffer = '<iframe' . $tmp . '></iframe>';
    }
    return $buffer;
}

// Here because the funciton MUST be define before the "add_shortcode" since 
// "add_shortcode" check the function name with "is_callable".
add_shortcode('includeme', 'includeme_call');
}

もちろん、アップデートを利用できるようにプラグインをインストールすることをお勧めします。 https://wordpress.org/plugins/include-me/

0
user18275

わかりました、最初に私は出力バッファリングを捨てます。

第二の変更:

include(TEMPLATEPATH.'/wp-content/themes/grainandmortar/inc_static/test.php');

include( get_stylesheet_directory() . '/inc_static/test.php');

最後に、

ここにドキュメントを読む: https://codex.wordpress.org/Shortcode_API

あなたのtest.phpが返品可能な方法で何かを出力しないなら、あなたは何かを返す必要があります、あなたは悪い時間を過ごすつもりです。

それで test.php が以下の行に沿って何かをすることを確かめてください:

$output = "STUFF"; // a variable you could return after include.
// or
function test() {
    // do stuff
    return $stuff; // a function that returns a value that you can call after include.
}

それから test.php ファイルをインクルードした後 - あなたは単に$outputを返すかreturn test();のようなことをします。

0