プラグインにget_template_part()を使用してファイルを含める方法は?


13

非常に単純な質問かもしれませんが、私は苦労しています。テーマの開発では、get_template_part()何度も作業を行い、その基本を理解しました。しかし、私がプラグインを開発しているとき、私はそれを使用していくつかのエラーを表示することを考えました:

通知:未定義の定数STYLESHEETPATHの使用 -407 ...\wp-includes\template.php行目で 'STYLESHEETPATH'が想定されています

そして

通知:未定義の定数TEMPLATEPATHの使用...\wp-includes\template.php -410行目で「TEMPLATEPATH」を想定

問題をグーグルすることでサポート修正が示されました:

しかし、それは大きな回避策のようです-私はそれを疑います。それほど複雑ではないはずです。私はこのWPSE回答を確認したところ、次のコード行が見つかりました。

if ( '' === locate_template( 'loop-mycustomposttype.php', true, false ) )
    include( 'loop-mycustomposttype.php' );

PHP include()関数があるところ。私のWordPressの知識に従って、私get_template_part()はPHP よりも好むことを学びましたinclude()。次にget_template_part()、プラグインでシンプルをどのように使用できますか?

私はループなどを使用していません。プラグインコードを別のファイルに分離(または整理)しているだけなので、場合によっては、コメントアウトして、必要のない場所にドロップします。私は試した:

get_template_part( 'my', 'special-admin' );

そして、エラーの後、それを次のように変更しました:

get_template_part( 'my', 'specialadmin' );

しかし、それは問題ではありません。WAMPを使用して、ローカルサーバーにいます。

回答:


11

get_template_partあるテーマ機能が。その関数ではプラグインファイルをロードできません。ソースを見ると、作業がによって行われていることがわかりますlocate_templateそのソースを見ると、常にテーマディレクトリから読み込まれることがわかります。

どんなに使いたくてget_template_partも間違った機能です。

あなたのincludeファイルにする必要があります。

その理由は、私にget_template_partは、テーマを拡張できるようにするためです-別名、子テーマの作成を容易にするためです。プラグインはそのように拡張することを意図していないget_template_partため、同等のプラグインは必要ありません。


6

@s_ha_dumは正しい、つまりget_template_partテーマ関数ですが、プラグインがこのように拡張されることを意図していないことは間違っています。単にもっと複雑です。

この Pippinによる投稿では、ユーザーがプラグインテンプレートをテーマ内でオーバーライドできるようにしながら、プラグインテンプレートをロードする機能を使用する方法を説明しています。

基本的に、テーマ内の特別なフォルダーを検索し、見つからない場合は、テンプレートフォルダー内でプラグインを検索します。


4

前述のようにget_template_part、プラグインでは使用できませんが、プラグインの機能を模倣するGithub(Gary Jonesによって作成)に便利なクラスがありget_template_part、プラグインをフォールバックに追加します(子テーマ>親テーマ>プラグイン)。

このようにして、子テーマまたは親テーマ内のプラグインの「テンプレートパーツ」をオーバーライドできます。

使用法(Githubリポジトリの指示から取得):

  1. class-gamajo-template-loader.phpプラグインにコピーします。プラグインルート内のファイル、またはインクルードディレクトリに入れることができます。
  2. などの新しいファイルをclass-your-plugin-template-loader.php同じディレクトリに作成します。
  3. classそのファイルに拡張するを作成しますGamajo_Template_Loader
  4. プラグインに合わせてクラスプロパティをオーバーライドします。get_templates_dir()メソッドが適切でない場合は、メソッドをオーバーライドすることもできます。
  5. これで、カスタムテンプレートローダークラスをインスタンス化し、それを使用してget_template_part()メソッドを呼び出すことができます。これは、ショートコードコールバック内か、テーマ開発者にファイルに含めてほしいものです。

コード例:

// Template loader instantiated elsewhere, such as the main plugin file.
$meal_planner_template_loader = new Meal_Planner_Template_Loader;

// Use it to call the get_template_part() method. This could be within 
// a shortcode callback, or something you want theme developers 
// to include in their files.
$meal_planner_template_loader->get_template_part( 'recipe' );

// If you want to pass data to the template, call the set_template_data() 
// method with an array before calling get_template_part().        
// set_template_data() returns the loader object to allow for method chaining.
$data = array( 'foo' => 'bar', 'baz' => 'boom' );

$meal_planner_template_loader
    ->set_template_data( $data );
    ->get_template_part( 'recipe' );

// The value of bar is now available inside the recipe template as $data->foo.
// If you wish to use a different variable name, add a second parameter 
// to set_template_data():
$data = array( 'foo' => 'bar', 'baz' => 'boom' );

$meal_planner_template_loader
    ->set_template_data( $data, 'context' )
    ->get_template_part( 'recipe', 'ingredients' );

// The value of bar is now available inside the recipe template as $context->foo.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.