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

时间:2013-11-28 作者:Mayeenul Islam

一个非常简单的问题可能是,但我正在努力。在主题开发方面,我与get_template_part() 很多次,我了解它的基本原理。但是,当我开发插件时,我想知道如何使用它,并向我展示了一些错误:

Notice: Use of undefined constant STYLESHEETPATH - 在中假定为“STYLESHEETPATH”...\\wp-includes\\template.php 在线407

Notice: Use of undefined constant TEMPLATEPATH - 在中假定为“TEMPLATEPATH”...\\wp-includes\\template.php 在线410

通过谷歌搜索该问题显示了一个支持修复:

  • Use get_template_part() into a plugin - WordPress SupportWPSE Answer 找到了这行代码:

    if ( \'\' === locate_template( \'loop-mycustomposttype.php\', true, false ) )
        include( \'loop-mycustomposttype.php\' );
    
    有PHP的地方include() 作用根据我的WordPress知识,我学会了get_template_part() 通过PHPinclude(). 那么我该如何使用get_template_part() 在我的插件中。

    我没有使用任何循环或其他东西,我只是将插件代码分离(或者你可能会说组织)到不同的文件中,以便在某些情况下,我只需将它们注释掉,将它们放在不必要的地方。我试过:

    get_template_part( \'my\', \'special-admin\' );
    
    然后在出现错误后,将其更改为:

    get_template_part( \'my\', \'specialadmin\' );
    
    但你知道这不是问题所在。我在本地服务器上,使用WAMP。

3 个回复
最合适的回答,由SO网友:s_ha_dum 整理而成

get_template_part 是一个主题函数。你不能用这个函数加载插件文件。看看源代码,你会注意到这项工作是由locate_template. Look at that source 您将看到它总是从主题目录加载。

无论您想使用多少get_template_part 这是错误的功能。

你需要include 您的文件。

在我看来get_template_part 是为了允许主题被扩展,也就是为了简化子主题的创建。插件不打算以这种方式扩展,因此不需要get_template_part 或任何等效插件。

SO网友:benklocek

@s\\u ha\\u dum是正确的get_template_part 是一个主题函数,但他不认为插件不打算以这种方式扩展。这就更复杂了。

This post Pippin介绍了如何使用一个函数来加载插件模板,同时允许用户在其主题中覆盖插件模板。

本质上,它会在主题中的一个特殊文件夹中查找,如果没有找到,它会在templates文件夹中查找插件。

SO网友:Marcio Duarte

如前所述,您不能使用get_template_part 在插件中,但有一个handy class 在Github上(由Gary Jones创建),模仿get_template_part 插件中的功能,将插件添加到回退(子主题>父主题>插件)。

通过这种方式,您可以在子主题或父主题中覆盖插件的“模板部分”。

用法(摘自Github repo说明):

复制class-gamajo-template-loader.php 插入插件。它可以放在插件根目录中的文件中,或者更好的是放在includes目录中class-your-plugin-template-loader.php, 在同一目录中class 在扩展的文件中Gamajo_Template_Loader. get_templates_dir() 方法,如果它不适合您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.

结束

相关推荐