В WordPress хук theme_{$post_type}_templates
позволяет добавлять или удалять шаблоны страниц для различных типов записей. Этот хук особенно полезен, когда нужно предоставить дополнительные шаблоны для администраторов сайта или исключить ненужные шаблоны из списка при создании или редактировании записей.
apply_filters( “theme_{$post_type}_templates”, string[] $post_templates, WP_Theme $theme, WP_Post|null $post, string $post_type )
Хук theme_{$post_type}_templates
динамичен, и в зависимости от типа записи его имя будет меняться. Например:
theme_page_templates
для страниц (page
)theme_post_templates
для стандартных записей (post
)theme_attachment_templates
для вложений (attachment
)
Этот фильтр позволяет разработчикам управлять списком шаблонов для типов записей, которые доступны в админ-панели WordPress при редактировании или создании записи.
Параметры
$post_templates
— массив шаблонов в форматефайл шаблона => имя шаблона
, отображаемого в админ-панели.$theme
— объект текущей темы WordPress (WP_Theme
).$post
— объект записи (WP_Post
), для которой выводится список шаблонов, илиnull
.$post_type
— строка, указывающая тип записи.
Пример 1: Добавление пользовательского шаблона для страниц
Рассмотрим, что у нас в теме есть файл шаблона tpl/pages/portfolio.php
. WordPress не сможет автоматически обнаружить этот файл, так как он находится в подкаталоге. Используя хук theme_page_templates
, добавим этот шаблон в список доступных в админ-панели.
// Добавляем пользовательский шаблон для страниц
add_filter('theme_page_templates', 'add_custom_page_template');
function add_custom_page_template($templates) {
$templates['tpl/pages/portfolio.php'] = 'Portfolio Page Template';
return $templates;
}
Теперь шаблон Portfolio Page Template
будет доступен при создании или редактировании страниц в админ-панели, несмотря на то, что он находится в подкаталоге.
Пример 2: Удаление стандартных шаблонов для записей
Иногда в теме присутствуют шаблоны, которые не требуются для сайта, и их нужно убрать из списка. Допустим, тема имеет шаблон template-wide.php
, который мы не планируем использовать.
// Удаляем ненужные шаблоны записей
add_filter('theme_post_templates', 'remove_unwanted_post_templates');
function remove_unwanted_post_templates($templates) {
unset($templates['template-wide.php']);
return $templates;
}
Этот код удаляет шаблон template-wide.php
из списка доступных шаблонов для стандартных записей в админ-панели.
Пример 3: Добавление шаблона для пользовательского типа записи
Предположим, что у нас есть пользовательский тип записи event
, и мы хотим добавить для него специальный шаблон event-special.php
. Используем хук theme_event_templates
для добавления этого шаблона.
// Добавляем шаблон для пользовательского типа записи "event"
add_filter('theme_event_templates', 'add_event_template');
function add_event_template($templates) {
$templates['templates/event-special.php'] = 'Special Event Template';
return $templates;
}
Теперь шаблон Special Event Template
будет доступен для типа записи event
.
Пример 4: Фильтрация шаблонов для мультисайтовой сети
Если ваш сайт является частью сети мультисайтов, можно настроить, чтобы определенные шаблоны были доступны только на конкретных сайтах. Допустим, мы хотим, чтобы шаблон page-shop.php
был доступен только на сайте с ID 3 (например, «Shop»), и скрываем его для остальных сайтов.
// Ограничиваем доступность шаблона для конкретного сайта сети
add_filter('theme_page_templates', 'restrict_template_to_specific_site', 10, 3);
function restrict_template_to_specific_site($templates, $theme, $post) {
if (get_current_blog_id() !== 3) {
unset($templates['page-shop.php']);
}
return $templates;
}
Этот код скрывает шаблон page-shop.php
для всех сайтов, кроме сайта с ID 3.
Пример 5: Добавление шаблонов из плагина
Допустим, вы разработали плагин, который добавляет шаблоны в тему. Файлы шаблонов находятся в папке плагина. В этом случае также можно воспользоваться хуком theme_page_templates
, чтобы сделать шаблоны плагина доступными в админ-панели.
// Добавляем шаблоны страниц из плагина
add_filter('theme_page_templates', 'add_plugin_templates');
function add_plugin_templates($templates) {
$templates[plugin_dir_path(__FILE__) . 'templates/custom-page.php'] = 'Custom Plugin Page Template';
return $templates;
}
Этот код добавляет шаблон из плагина, и он будет отображаться в списке доступных шаблонов для страниц.
Советы по использованию
- Используйте динамическое имя хука: Учитывайте тип записи и подставляйте его в
theme_{$post_type}_templates
для нужного пост-типа, например,theme_page_templates
илиtheme_post_templates
. - Убедитесь в доступности шаблона: Проверяйте пути к шаблонам, если они находятся в подкаталогах темы или в плагинах. WordPress по умолчанию просматривает только корень темы и один уровень подпапок.
- Работа с мультисайтовыми установками: Если шаблоны должны быть ограничены для использования только на определенных сайтах, всегда можно использовать
get_current_blog_id()
.
Заключение
Хук theme_{$post_type}_templates
предоставляет гибкие возможности для управления доступными шаблонами. Используя его, разработчики могут расширять список шаблонов для различных типов записей, добавлять шаблоны из нестандартных расположений и исключать ненужные шаблоны, что помогает сделать админ-панель WordPress более организованной и удобной для администраторов.