Більшість роботи, яку я зараз виконую, зосереджена на користувацьких плагінах або утилітах, які працюють поверх WordPress.
Якби ви уявляли собі, скільки проектів, які я створюю, об’єднано, ви б розглянули WordPress (і все, що з ним пов’язано) як основу, а потім код має рівень, який взаємодіє з WordPress, і який може спілкуватися зі сторонніми API.
Однак під час цього часто використовується зовнішній компонент, який вимагає відтворення інформації в шаблонах. Хоча створювати шаблони для WordPress за своєю суттю не складно (хоча мені б хотілося, щоб у нас було щось більше, ніж теги шаблонів – як-от система створення шаблонів, це інша публікація), я вважаю, що варто розглянути кілька способів обробки нестандартних шаблони, які ми об’єднали з плагінами.
Одне з перших питань, яке часто виникає під час цього твердження, таке
Навіщо вам додавати спеціальні шаблони до плагіна?
І я розумію це на деяких рівнях.
- Зберігання шаблонів у плагіні дещо стирає межі між темами та плагінами, особливо коли ви залишаєте теми для презентації та плагіни для бізнес-логіки,
- Просити користувачів скопіювати файли теми з одного місця в інше – це погано.
Але є кілька спростувань або, можливо, відвертих винятків із наведених вище випадків.
WordPress template_redirect Hook
Перш ніж говорити про хук WordPress template_redirect, я хочу трохи поговорити про пункти, згадані вище.
1 Шаблони в плагінах
Якщо ви створюєте спеціальний плагін, який взаємодіє як з WordPress, так і зі стороннім API або який використовує певний тип комбінації репозиторіїв, фабрик, моделей і представлень, вам потрібно буде відобразити цю інформацію на передній панелі -end, і це має бути агностиком теми.
Це не означає, що хтось не може стилізувати елементи на сторінці чи включити шаблон у свою роботу, але це означає, що плагін має надавати базовий рівень інформації, яка відображається користувачеві.
2 Просити користувачів копіювати файли – погано
Пам’ятаєте слоган, який Apple колись і часто рекламувала як «Це просто працює?» " Хоча це може бути не те, що вони висловлюють так багато, як колись (якщо взагалі, то більше), мені подобається ідея "просто працювати" для користувача, і це те, чого я намагаюся прагнути у своєму працювати.
Тому, коли справа доходить до створення власних шаблонів або представлень для плагінів, я не хочу просити користувача копіювати файли. Я просто хочу, щоб вони:
- встановити плагін,
- натисніть активувати.
І це все. Решта має бути або самоочевидним, або добре задокументованим.
Назад до Гака
Гаразд, тож давайте на мить припустимо, що ми створили плагін, який містить кілька базових шаблонів (або представлень залежно від лінгво, яке ви використовуєте), і що шаблони потрібно записати в кореневий каталог активної теми.
Ви можете використовувати хук template_redirect (і багато популярних плагінів це роблять). Детальніше про це можна прочитати тут, але суть полягає в наступному:
Цей хук дії виконується безпосередньо перед тим, як WordPress визначить, яку сторінку шаблону завантажити. Це хороший хук для використання, якщо вам потрібно зробити перенаправлення з повним знанням вмісту, який був запитаний.
І, щоб було зрозуміло, я не відмовляюся від використання цього гачка. Я просто пропоную альтернативу. І ось це (як це має працювати наступним чином):
- активувати плагін,
- знайдіть активну тему,
- якщо вони ще не існують, скопіюйте файли шаблону з плагіна в кореневий каталог активної теми
Останній крок є критично важливим, тому що якщо файли шаблонів існують, то важливо не перезаписати їх, перш за все тому, що користувач міг написати свої налаштування.
З огляду на це, ось як ви можете це зробити за допомогою однієї функції (доповненої коментарями, щоб показати, що ви використовуєте).
<?php
add_action('plugins_loaded', __NAMESPACE__. 'acmeCopyTemplates');
/**
* Copies the template files from the `assets/templates` directory to the root directory
* of the currently active theme (if they do not already exist).
*/
function acmeCopyTemplates()
{
// Find the currently active theme.
$activeThemeDir = get_template_directory();
/**
* Read all of the template files from assets/templates into an array but
* exclude the '.' and the '..' from the array.
*/
$templates = array_slice(scandir(dirname(__FILE__).'/assets/templates'), 2);
/**
* Now copy all of these files to the active theme directory.
* If the file already exists, then don't do it.
*/
foreach ($templates as $template) {
if (!file_exists($destination = trailingslashit($activeThemeDir).$template)) {
continue;
}
$source = dirname(__FILE__).'/assets/templates/'.$template;
$destination = trailingslashit($activeThemeDir).$template;
copy($source, $destination);
}
}
Зауважте, що тут використовується кілька функцій PHP. а саме:
Усе це, на мою думку, є зручним і важливим, щоб знати незалежно від природи, у якій ви їх використовуєте.
Чи підтримують це хости?
Деякі господарі так і роблять. Я точно знаю, що такі хости, як WPEngine, цього не роблять, і це також не є критикою хостів. Деякі роблять це з міркувань безпеки; інші дозволяють це, але це не означає, що вони менш безпечні – це просто означає, що їхня інфраструктура налаштована інакше.
Зрештою, це свідчить про те, що існують інші способи зробити шаблони доступними для користувачів, коли використовується плагін, але це не єдиний спосіб, і він може не завжди працювати.
Наявність опцій — це добре, особливо якщо ви віддаєте перевагу певній архітектурі свого плагіна над іншою.