Создавать пользовательские шаблоны страниц с помощью плагинов?
Можно ли сделать пользовательские шаблоны страниц доступными с помощью плагина?
4 answers
get_page_template()
может быть переопределен с помощью фильтра page_template
. Если ваш плагин представляет собой каталог с шаблонами в виде файлов в них, это просто вопрос передачи имен этих файлов. Если вы хотите создать их "на лету" (отредактировать их в области администрирования и сохранить в базе данных?), вы можете записать их в каталог кэша и ссылаться на них или подключиться к template_redirect
и делать какие-то сумасшедшие eval()
вещи.
Простой пример плагина, который "перенаправляет" файл в тот же каталог плагинов, если определенный критерий верен:
add_filter( 'page_template', 'wpa3396_page_template' );
function wpa3396_page_template( $page_template )
{
if ( is_page( 'my-custom-page-slug' ) ) {
$page_template = dirname( __FILE__ ) . '/custom-page-template.php';
}
return $page_template;
}
Переопределение get_page_template()
- это просто быстрый взлом. Это не позволяет выбирать шаблон с экрана администратора, а пуля страницы жестко запрограммирована в плагине, поэтому пользователь не может узнать, откуда взялся шаблон.
Предпочтительным решением было бы следовать этому руководству, которое позволяет вам зарегистрировать шаблон страницы в фоновом режиме из подключаемого модуля. Тогда он работает как любой другой шаблон.
/*
* Initializes the plugin by setting filters and administration functions.
*/
private function __construct() {
$this->templates = array();
// Add a filter to the attributes metabox to inject template into the cache.
add_filter('page_attributes_dropdown_pages_args',
array( $this, 'register_project_templates' )
);
// Add a filter to the save post to inject out template into the page cache
add_filter('wp_insert_post_data',
array( $this, 'register_project_templates' )
);
// Add a filter to the template include to determine if the page has our
// template assigned and return it's path
add_filter('template_include',
array( $this, 'view_project_template')
);
// Add your templates to this array.
$this->templates = array(
'goodtobebad-template.php' => 'It\'s Good to Be Bad',
);
}
Да, это возможно. Я нашел этот пример плагина очень полезным.
Другой подход, который приходит мне в голову, - это использование API файловой системы WP для создания файла шаблона в тему. Я не уверен, что это лучший подход, но я уверен, что он работает!
Ни один из предыдущих ответов не работал на меня. Здесь вы можете выбрать свой шаблон в администраторе Wordpress. Просто поместите его в свой основной файл плагина php и измените template-configurator.php
на имя вашего шаблона
//Load template from specific page
add_filter( 'page_template', 'wpa3396_page_template' );
function wpa3396_page_template( $page_template ){
if ( get_page_template_slug() == 'template-configurator.php' ) {
$page_template = dirname( __FILE__ ) . '/template-configurator.php';
}
return $page_template;
}
/**
* Add "Custom" template to page attirbute template section.
*/
add_filter( 'theme_page_templates', 'wpse_288589_add_template_to_select', 10, 4 );
function wpse_288589_add_template_to_select( $post_templates, $wp_theme, $post, $post_type ) {
// Add custom template named template-custom.php to select dropdown
$post_templates['template-configurator.php'] = __('Configurator');
return $post_templates;
}