web-dev-qa-db-ja.com

Get_template_part()を使ってプラグインにファイルを含めるにはどうすればいいですか?

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

注意:未定義の定数STYLESHEETPATHの使用 - 407行目の...\wp-includes\template.phpで 'STYLESHEETPATH'を想定しています

そして

注意:未定義の定数TEMPLATEPATHの使用 - 410行目の...\wp-includes\template.phpで 'TEMPLATEPATH'を想定しています

問題をグーグルすると、サポートの修正が示されました。

しかし、それは大きな回避策のようです - 私はそれを疑います。それほど複雑ではないと思います。私はこれをチェックしました WPSE Answer そしてこのコード行を見つけました:

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

PHP include()関数があるところ。私のWordPressの知識のとおり、私はPHP get_template_part()よりinclude()を好むことを学びました。それでは、プラグインの中で単純なget_template_part()をどれほど正確に使用できるのでしょう。

私はループや何かを使っているのではありません。プラグインコードを別々のファイルに分割して整理することもあります。私は試した:

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

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

get_template_part( 'my', 'specialadmin' );

しかし、あなたはそれが問題ではないことを知っています。私はWAMPを使ってローカルサーバーにいます。

9
Mayeenul Islam

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

get_template_partを使いたいと思うかもしれませんが、それは間違った関数です。

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

その理由は、get_template_partがテーマの拡張を許可すること、つまり子供のテーマの作成を容易にすることだからです。プラグインはそのように拡張されることを意図していないので、get_template_partや同等のプラグインは必要ありません。

8
s_ha_dum

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

この投稿 Pippinによる、ユーザーが自分のテーマの中であなたのプラグインテンプレートを上書きできるようにしながら、あなたのプラグインテンプレートをロードする仕事をする関数の使い方を説明します。

基本的には、テーマ内の特別なフォルダを探し、そこに見つからなければ、プラグイン用のtemplatesフォルダ内を探します。

5
benklocek

前述したように、プラグインにget_template_partを使用することはできませんが、プラグインのget_template_part機能を模倣したGithub上の 便利なクラス があります。テーマ>プラグイン).

このようにして、あなたは自分のプラグインの「テンプレート部分」を子テーマまたは親テーマの中で上書きすることができます。

使用方法(Githubレポジトリの説明から引用):

  1. class-gamajo-template-loader.phpをあなたのプラグインにコピーしてください。それはプラグインのルート、あるいはインクルードディレクトリのファイルに入れることができます。
  2. 同じディレクトリにclass-your-plugin-template-loader.phpなどの新しいファイルを作成します。
  3. そのファイルにGamajo_Template_Loaderを拡張するclassを作成します。
  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.
1
Marcio Duarte