Як розмістити файли шаблону кастомного типу запису або таксономії у довільній директорії

Як розмістити файли шаблону кастомного типу запису або таксономії у довільній директорії

Під час розробки власного плагіна або аддона, файли шаблонів теми 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”. Тепер, при пошуку шаблонів, перший пріоритет буде віддано файлам плагіна, а не теми.

Пости на схожі теми

З вашим WordPress сайтом проблеми? потрібний додатковий функціонал? нестандартний плагін чи згорнути нову сторінку?
Тоді напишіть мені через форму зворотного зв'язку, і я намагатимусь вам допомогти.

Напишіть коментар

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *