如何在插件中使用get_template_part()包含文件?


13

一个非常简单的问题可能是,但是我很挣扎。在主题开发中,我工作了get_template_part()很多次,并且了解了它的基础知识。但是当我开发一个插件时,我想知道如何使用它显示一些错误:

注意:使用未定义的常量STYLESHEETPATH-...\wp-includes\template.php在第407行假定为'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。

Answers:


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.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.