Создавать собственные шаблоны страниц с помощью плагинов?
4 ответ
- голосов
-
- 2010-11-02
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()
can be overridden via thepage_template
filter. If your plugin is a directory with the templates as files in them, it's just a matter of passing the names of these files. If you want to create them "on the fly" (edit them in the admin area and save them in the database?), you might want to write them to a cache directory and refer to them, or hook intotemplate_redirect
and do some crazyeval()
stuff.A simple example for a plugin that "redirects" to a file in the same plugin directory if a certain criterium is true:
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; }
-
Привет,Ян,у вас есть пример кода о том,как передать файл плагина в качестве настраиваемого шаблона страницы?Hey Jan, do you have some example code on how to pass a plugin file in as a custom page template?
- 0
- 2010-11-16
- jnthnclrk
-
@trnsfrmr: Это действительно просто,я добавил к своему ответу простой пример.@trnsfrmr: It's really easy, I added a simple example to my answer.
- 0
- 2010-11-16
- Jan Fabry
-
Обратите внимание,что он более или менее заменен фильтром «template_include» в более поздних версиях (3.1+).Note that this has been more or less replaced by the "template_include" filter in later versions (3.1+).
- 12
- 2013-06-10
- Inigoesdr
-
Отлично !!!,ты сэкономил мне время @JanFabryPerfect !!!, you have save my time @JanFabry
- 0
- 2018-12-21
- Kishan Chauhan
-
Как заявил @fireydude,это не общее решение.Это обходной путь,который жестко кодирует ярлык страницы.As stated by @fireydude, this is not a generic solution. It's a workaround that hard-codes the page slug.
- 0
- 2019-07-07
- Mauro Colella
-
- 2015-10-12
Переопределение
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', ); }
Overriding
get_page_template()
is just a quick hack. It does not allow the template to be selected from the Admin screen and the page slug is hard-coded into the plugin so the user has no way to know where the template is coming from.The preferred solution would be to follow this tutorial which allows you to register a page template in the back-end from the plug-in. Then it works like any other 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', ); }
-
Было бы неплохо (* и желательно *),если бы вы могли опубликовать соответствующий код по ссылке в своем ответе,иначе это не что иное,как раздутый комментарий :-)Would be nice (*and prefered*) if you can post the relevant code from the link in your answer, otherwise this is nothing more than a bloated comment :-)
- 0
- 2015-10-12
- Pieter Goosen
-
В учебнике фактически упоминается [пример Тома МакФарлина] (https://github.com/tommcfarlin/page-template-example) как автора этого подхода.The tutorial actually credits [Tom McFarlin's example](https://github.com/tommcfarlin/page-template-example) as the originator of this approach.
- 1
- 2015-10-12
- fireydude
-
- 2014-12-04
Да,это возможно.Я нашел этот пример плагина очень полезным.
Другой подход,который пришел мне в голову,- это использование WP Filesystem API для создания файла шаблона для темы.Я не уверен,что это лучший подход,но уверен,что он сработает!
Yes, it is possible. I found this example plugin very helpful.
Another approach that is come into my head is using WP Filesystem API to create the template file to theme. I am not sure that it is the best approach to take, but I am sure it work!
-
Связанный пример плагина даже довольно хорошо документирован.Мне нравится,что.:)The linked example plugin is even pretty well documented. I like that. :)
- 0
- 2017-08-14
- Arvid
-
- 2019-10-22
Ни один из предыдущих ответов не помог мне. Здесь вы можете выбрать свой шаблон в админке 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; }
None of the previous answers was working for mine. Here one where you can choose your template in Wordpress admin. Just put it in your main php plugin file and change
template-configurator.php
by your template name//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; }
Можно ли сделать настраиваемые шаблоны страниц доступными из плагина?