Как включить файл с помощью get_template_part () в плагин?

13

Может быть, очень простой вопрос, но я борюсь. В разработке темы я работал get_template_part()много раз, и я понимаю ее основы. Но когда я разрабатывал плагин, я удивился, используя его, показывая мне некоторые ошибки:

Примечание: использование неопределенной константы STYLESHEETPATH - предполагается, что в ...\wp-includes\template.phpстроке 407 указано «STYLESHEETPATH»

а также

Примечание: использование неопределенной константы TEMPLATEPATH - предполагается, что в ...\wp-includes\template.phpстроке 410 указано «TEMPLATEPATH»

Поиск в Google показал исправление поддержки:

Но это кажется огромным обходным путем - я сомневаюсь в этом. Я думаю, что это не должно быть очень сложно. Я проверил этот WPSE-ответ и нашел следующую строку кода:

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

Где есть include()функция PHP . Согласно моим знаниям WordPress, я научился предпочитать get_template_part()PHP include(). Тогда как именно я могу использовать простой get_template_part()в своем плагине.

Я не использую какой-либо цикл или что-то в этом роде, я просто разделяю (или, вы можете сказать, организуете) мой код плагина на разные файлы, так что в некоторых случаях я просто закомментирую их для удаления там, где они не нужны. Я старался:

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

а затем после ошибки изменили его на:

get_template_part( 'my', 'specialadmin' );

Но вы знаете, что это не проблема. Я на локальном сервере, используя WAMP.

Mayeenul Ислам
источник

Ответы:

11

get_template_partэто функция темы . Вы не можете загружать файлы плагинов с этой функцией. Посмотрите на источник, и вы заметите, что работа сделана locate_template. Посмотрите на этот источник , и вы увидите , что она всегда грузы из тематических каталогов.

Как бы вы ни хотели использовать get_template_partэто неправильная функция.

Вам понадобятся includeваши файлы.

Мне кажется, что причина в том, что get_template_partтемы можно расширять, иначе говоря, облегчать создание дочерних тем. Плагины не предназначены для расширения таким образом, поэтому нет необходимости get_template_partв каком-либо плагиновом эквиваленте.

s_ha_dum
источник
6

@s_ha_dum правильно, get_template_partэто функция темы, но он неверен, потому что плагины не предназначены для расширения таким способом. Это просто сложнее.

В этом посте от Pippin описано, как использовать функцию, которая будет выполнять загрузку шаблонов плагинов, позволяя пользователям переопределять шаблоны плагинов в своей теме.

По сути, он выглядит в специальной папке в теме, а затем, если не найден там, он ищет в папке шаблонов для плагина.

benklocek
источник
4

Как было сказано ранее, вы не можете использовать get_template_partв плагинах, но есть удобный класс на Github (созданный Гэри Джонсом), который имитирует get_template_partфункциональность в плагинах, добавляя плагин в резервный (дочерняя тема> родительская тема> плагин).

Таким образом, вы можете переопределить «часть шаблона» вашего плагина внутри дочерней или родительской темы.

Использование (взято из инструкций Github-репо):

  1. Скопируйте class-gamajo-template-loader.phpв свой плагин. Это может быть файл в корне плагина или, что лучше, в каталоге include.
  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.
Марсио Дуарте
источник