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