Предположим, вы пишете плагин, который регистрирует новый тип поста WordPress. Ваш новый тип обязательно будет нуждаться в своем собственном шаблоне вывода, но шаблоны пользовательских типов записей, например single-{post_type}.php всегда находятся в папке самого шаблона.
К счастью, существует способ заставить WP привязать шаблон из папки плагина с произвольным типом записи. Сделать это можно привязавшись к фильтру single_template, как показано в примере ниже.
add_filter('single_template', 'hub_custom_post_type_template'); function hub_custom_post_type_template($single) { global $post; /* Проверяем существует ли шаблон в папке плагина и регистрируем его в качестве шаблона для типа записи */ if ( $post->post_type == 'ВАШ ТИП ЗАПИСИ' ) { if ( file_exists( plugin_dir_path(__FILE__) . 'templates/template-single.php') ) { return plugin_dir_path(__FILE__) . 'templates/template-single.php'; } } return $single; }
В этом примере я воспользовался фильтром single_template, который перехватывает определение шаблона для страниц, которые удовлетворяют условию is_single в иерархии шаблона WordPress.
Как подключить шаблон к архиву для типа записи
Как и в примере выше, мы можем пользоваться фильтром для переопределения шаблона для всех или выбранного архива WordPress.
add_filter('archive_template', function($template) { if ( is_post_type_archive('ВАШ ТИП ЗАПИСИ') ) { if ( file_exists( plugin_dir_path(__FILE__) . 'templates/template-my-archive.php') ) { return plugin_dir_path(__FILE__) . 'templates/template-my-archive.php'; } } return $template; });
Для других шаблонов так-же доступны фильтры, ниже я перечислил их список.
add_filter('index_template', function($template) { // Переопределить шаблон для index }); add_filter('404_template', function($template) { // Переопределить шаблон для 404 }); add_filter('archive_template', function($template) { // Переопределить шаблон для archive }); add_filter('author_template', function($template) { // Переопределить шаблон для author }); add_filter('category_template', function($template) { // Переопределить шаблон для category }); add_filter('tag_template', function($template) { // Переопределить шаблон для tag }); add_filter('taxonomy_template', function($template) { // Переопределить шаблон для taxonomy }); add_filter('date_template', function($template) { // Переопределить шаблон для date }); add_filter('embed_template', function($template) { // Переопределить шаблон для embed }); add_filter('home_template', function($template) { // Переопределить шаблон для home }); add_filter('frontpage_template', function($template) { // Переопределить шаблон для frontpage }); add_filter('privacypolicy_template', function($template) { // Переопределить шаблон для privacypolicy }); add_filter('page_template', function($template) { // Переопределить шаблон для page }); add_filter('paged_template', function($template) { // Переопределить шаблон для paged }); add_filter('search_template', function($template) { // Переопределить шаблон для search }); add_filter('single_template', function($template) { // Переопределить шаблон для single }); add_filter('singular_template', function($template) { // Переопределить шаблон для singular }); add_filter('attachment_template', function($template) { // Переопределить шаблон для attachment });
Надеюсь я помог вам разобраться в том, как можно подключить шаблон WordPress к произвольному типу записи в папке плагина.
Прочитал статью, но не смог разобраться с тем, каким образом можно изменить шаблон для страниц архива. Я пытался это сделать фильтром archive_template, но он изменяет шаблон для всех архивов, а мне нужно только для одного типа записи.
Полагаю, Вы не проверяли к какому архиву применять Ваш фильтр. Добавлю пример в статью.