Під час розробки власного плагіна або аддона, файли шаблонів теми WordPress, через деякі технічні вимоги, потрібно розміщувати в каталозі плагіна (тобто не в папці з темою). Що для цього потрібно?
У якості прикладу можна взяти плагіни WooCommerce або bbPress. За замовчуванням, файли шаблонів плагіна зберігаються в папці самого плагіна. Для Woo це папка “/wp-content/plugins/woocommerce/templates”, а для bbPress — “/wp-content/plugins/bbpress/templates/default/bbpress”. У цій статті йтиметься про те, як частково реалізувати подібний функціонал, але у спрощеній формі (в наступних статтях розглянемо повну реалізацію).
У нашому випадку ми будемо зберігати файли кастомного пост-тайпу та кастомної таксономії у папці з плагіном. У каталозі:
plugin_dir_path(__FILE__) . 'views' . DIRECTORY_SEPARATOR;
Щоб WordPress зрозумів, що йому потрібно шукати файли кастомного пост-тайпу чи таксономії в додатковій директорії, йому про це потрібно якось повідомити. Це можна зробити за допомогою фільтра:
$templates = apply_filters( "{$type}_template_hierarchy", $templates );який знаходиться у файлі “wp-includes/template.php”, див. функцію “get_query_template(...)”.
Це динамічний фільтр, змінна “$type” у фільтрі, як мінімум (з мого досвіду) може мати наступні значення — single, archive, taxonomy. Тобто тут використовуються префікси, які застосовуються для кастомізації шаблонів теми.
Перейдемо до коду. Щоб реалізувати підключення додаткових шаблонів використовуйте такий код:
Для сторінки одиничного запису (single):
add_filter('single_template_hierarchy', function($templates)
{
if(is_singular(‘my-plugin’))
{
array_unshift($templates, plugin_dir_path(__FILE__) . 'views' . DIRECTORY_SEPARATOR . 'single.php');
}
return $templates;
});умова “if” визначає, що додаткові шаблони теми підвантажуються лише якщо користувач знаходиться на сторінці одиничного запису плагіна.
Аналогічний код буде для сторінки архіву:
add_filter('archive_template_hierarchy', function($templates)
{
if(is_post_type_archive('my-plugin'))
{
array_unshift($templates, plugin_dir_path(__FILE__) . 'views' . DIRECTORY_SEPARATOR . 'archive.php');
}
return $templates;
});І для сторінки таксономії:
add_filter('taxonomy_template_hierarchy', function($templates)
{
if(is_tax('my-plugin'))
{
array_unshift($templates, plugin_dir_path(__FILE__) . 'views' . DIRECTORY_SEPARATOR . 'taxonomy.php');
}
return $templates;
});Зверніть увагу, що різниця полягає лише у підключаємих шаблонах і в умові “if”. Тепер, при пошуку шаблонів, перший пріоритет буде віддано файлам плагіна, а не теми.
