Як включити файл за допомогою get_template_part () у плагін?


13

Можливо, дуже просте запитання, але я борюся. У розробці тем я get_template_part()багато разів працював і розумію її основи. Але коли я розробляв плагін, я задумався про його використання, показуючи мені деякі помилки:

Повідомлення: Використання невизначеної постійної STYLESHEETPATH - припущена "STYLESHEETPATH" у ...\wp-includes\template.phpрядку 407

і

Повідомлення: Використання невизначеної постійної TEMPLATEPATH - припущена "TEMPLATEPATH" у ...\wp-includes\template.phpрядку 410

Проблема в Googling показала підтримку:

Але це здається величезним вирішенням - я сумніваюся. Я думаю, що це не повинно бути дуже складним. Я перевірив відповідь 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.

Відповіді:


11

get_template_partє тематичною функцією. Ви не можете завантажити файли плагінів за допомогою цієї функції. Погляньте на джерело, і ви помітите, що робота виконується locate_template. Подивіться на це джерело, і ви побачите, що воно завжди завантажується з каталогів тем .

Хоча скільки б ви не хотіли використовувати, get_template_partце неправильна функція.

Вам знадобляться includeваші файли.

Причина, так мені здається, get_template_partполягає в тому, щоб дозволити розширення тем - ака, щоб полегшити створення дитячих тем. Плагіни не розширюються таким чином, тому немає потреби get_template_partв будь-якому еквіваленті плагіну.


6

@s_ha_dum вірно, що get_template_partце тематична функція, але він невірний, що плагіни не розширюються таким чином. Це просто складніше.

У цьому дописі Піппіна описано, як використовувати функцію, яка буде виконувати роботу з завантаження шаблонів плагінів, дозволяючи користувачам змінювати шаблони плагінів у межах своєї теми.

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


4

Як було сказано раніше, ви не можете використовувати get_template_partв плагінах, але в Github (створений Gary Jones) зручний клас, який імітує get_template_partфункціональність плагінів, додаючи плагін до резервної копії (дочірня тема> батьківська тема> плагін).

Таким чином, ви можете змінити "частину шаблону" вашого плагіна всередині дочірньої теми або батьківської теми.

Використання (взято з інструкції Github repo):

  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.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.