Как использовать get_template_part() для подключения файла в плагине?

28 нояб. 2013 г., 17:38:59
Просмотры: 51.7K
Голосов: 29

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

Notice: Use of undefined constant STYLESHEETPATH - assumed 'STYLESHEETPATH' в ...\wp-includes\template.php на строке 407

и

Notice: Use of undefined constant TEMPLATEPATH - assumed 'TEMPLATEPATH' в ...\wp-includes\template.php на строке 410

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

Но это кажется слишком сложным обходным путем - я сомневаюсь в этом. Думаю, это не должно быть настолько сложно. Я проверил этот ответ на 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.

0
Все ответы на вопрос 3
0
19

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

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

Вам нужно будет подключать свои файлы с помощью include.

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

28 нояб. 2013 г. 17:56:19
0
15

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

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

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

24 июн. 2015 г. 22:04:03
0

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

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

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

  1. Скопируйте class-gamajo-template-loader.php в ваш плагин. Это может быть файл в корне плагина или, что лучше, в директории includes.
  2. Создайте новый файл, например class-your-plugin-template-loader.php, в той же директории.
  3. Создайте class в этом файле, который наследует Gamajo_Template_Loader.
  4. Переопределите свойства класса в соответствии с вашим плагином. Вы также можете переопределить метод get_templates_dir(), если он вам не подходит.
  5. Теперь вы можете создать экземпляр вашего пользовательского класса загрузчика шаблонов и использовать его для вызова метода get_template_part(). Это может быть внутри обработчика шорткода или того, что вы хотите, чтобы разработчики тем включали в свои файлы.

Пример кода:

// Экземпляр загрузчика шаблонов создан где-то ещё, например, в основном файле плагина.
$meal_planner_template_loader = new Meal_Planner_Template_Loader;

// Используйте его для вызова метода get_template_part(). Это может быть внутри 
// обработчика шорткода или того, что вы хотите, чтобы разработчики тем 
// включали в свои файлы.
$meal_planner_template_loader->get_template_part( 'recipe' );

// Если вы хотите передать данные в шаблон, вызовите метод set_template_data() 
// с массивом перед вызовом get_template_part().        
// set_template_data() возвращает объект загрузчика для цепочки вызовов методов.
$data = array( 'foo' => 'bar', 'baz' => 'boom' );

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

// Значение bar теперь доступно внутри шаблона recipe как $data->foo.
// Если вы хотите использовать другое имя переменной, добавьте второй параметр 
// в set_template_data():
$data = array( 'foo' => 'bar', 'baz' => 'boom' );

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

// Значение bar теперь доступно внутри шаблона recipe как $context->foo.
7 мая 2017 г. 23:34:05