Хук theme_templates
в WordPress позволяет добавлять и удалять шаблоны страниц (постов), доступные в админ-панели при редактировании записей. В отличие от аналогичных хуков для конкретных типов записей (например, theme_page_templates
), theme_templates
применяется ко всем типам записей. Это делает его универсальным инструментом для управления шаблонами и добавления нестандартных шаблонов без привязки к конкретному типу записи.
apply_filters( ‘theme_templates’, string[] $post_templates, WP_Theme $theme, WP_Post|null $post, string $post_type )
Хук theme_templates
работает с шаблонами страниц и записей, позволяя разработчикам добавлять свои шаблоны в темы, независимо от их расположения в структуре файлов. Этот фильтр облегчает добавление новых шаблонов, если они находятся за пределами стандартных местоположений, или позволяет скрыть ненужные шаблоны из выпадающего списка при редактировании записи.
Параметры
$post_templates
— массив с шаблонами в форматефайл шаблона => название шаблона
. Ключом является путь до файла относительно папки темы, а значением — название шаблона, отображаемое в админ-панели.$theme
— объект текущей темы (WP_Theme
).$post
— объект записи (WP_Post
), для которой редактируются шаблоны, илиnull
.$post_type
— строка, указывающая тип записи, для которого требуется получить шаблоны.
Пример 1: Добавление шаблона для всех типов записей
Рассмотрим ситуацию, когда нужно добавить шаблон template/custom/page-overview.php
, расположенный в подкаталоге. Этот шаблон будет доступен для всех типов записей.
// Добавляем новый шаблон для всех типов записей
add_filter('theme_templates', 'add_universal_template', 10, 4);
function add_universal_template($templates, $theme, $post, $post_type) {
$templates['template/custom/page-overview.php'] = 'Overview Template';
return $templates;
}
Теперь шаблон Overview Template
будет доступен для всех типов записей в админ-панели.
Пример 2: Добавление шаблона только для страниц
Если шаблон должен быть доступен только для страниц, можно использовать проверку на тип записи page
перед добавлением шаблона.
// Добавляем шаблон только для страниц (post_type = page)
add_filter('theme_templates', 'add_page_template', 10, 4);
function add_page_template($templates, $theme, $post, $post_type) {
if ('page' === $post_type) {
$templates['template/extra/page-landing.php'] = 'Landing Page Template';
}
return $templates;
}
Теперь шаблон Landing Page Template
будет доступен только при редактировании страниц.
Пример 3: Добавление шаблонов из плагина
В случае, если шаблоны должны быть добавлены через плагин, их можно хранить в папке плагина и подключать при помощи хука theme_templates
. Рассмотрим структуру плагина:
plugin-custom-templates/
├── plugin-custom-templates.php
└── templates/
├── single-custom-template.php
└── page-special-template.php
Код для основного файла плагина plugin-custom-templates.php
будет выглядеть так:
/**
* Plugin Name: Custom Templates Plugin
*/
add_filter('theme_templates', 'add_plugin_templates', 10, 4);
add_filter('template_include', 'load_plugin_template');
/**
* Добавляем шаблоны из плагина.
*/
function add_plugin_templates($templates, $theme, $post, $post_type) {
if ('page' === $post_type) {
$templates += get_custom_plugin_templates();
}
return $templates;
}
/**
* Возвращает массив шаблонов плагина.
*/
function get_custom_plugin_templates() {
$base_path = basename(__DIR__);
return [
$base_path . '/templates/page-special-template.php' => 'Special Page Template',
$base_path . '/templates/single-custom-template.php' => 'Single Post Custom Template',
];
}
/**
* Подключаем шаблон из плагина.
*/
function load_plugin_template($template) {
if (!is_page()) {
return $template;
}
$selected_template = get_post_meta(get_the_ID(), '_wp_page_template', true);
if (in_array($selected_template, array_keys(get_custom_plugin_templates()))) {
$template_path = WP_PLUGIN_DIR . '/' . $selected_template;
if (file_exists($template_path)) {
return $template_path;
}
}
return $template;
}
Этот код добавляет два шаблона из плагина и подключает выбранный шаблон при отображении страницы.
Пример 4: Удаление шаблонов из списка
Иногда бывает полезно скрыть определенные шаблоны, чтобы они не отображались в админ-панели. В следующем примере удаляются шаблоны template-sidebar.php
и template-fullwidth.php
:
// Удаляем ненужные шаблоны
add_filter('theme_templates', 'remove_unnecessary_templates', 10, 4);
function remove_unnecessary_templates($templates, $theme, $post, $post_type) {
unset($templates['template-sidebar.php']);
unset($templates['template-fullwidth.php']);
return $templates;
}
Теперь указанные шаблоны не будут доступны для выбора в админ-панели.
Заключение
Хук theme_templates
предоставляет гибкие возможности для управления шаблонами страниц и записей в WordPress. Он позволяет разработчикам добавлять и удалять шаблоны, делать их доступными для всех типов записей или только для определенных, а также подключать шаблоны из плагинов. Использование этого хука помогает создавать уникальные и функциональные сайты, обеспечивая больше возможностей для кастомизации админ-панели.