Как разместить файлы шаблона кастомного типа записи или таксономии в произвольной директории

Как разместить файлы шаблона кастомного типа записи или таксономии в произвольной директории

При разработке своего плагина или аддона, файлы шаблона темы 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. Т.е. здесь используются префиксы применяемые для кастомизации файлов темы.
Перейдем к коду. Чтобы реализовать подгрузку дополнительных файлов используйте следующий код.

Для сингл страницы:

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 сайтом проблемы? нужен дополнительный функционал? нестандартный плагин или сверстать новую страницу?
Тогда напишите мне через форму обратной связи, и я постараюсь вам помочь.

Оставить комментарий

Ваш адрес email не будет опубликован.