Создание пользовательских шаблонов страниц с помощью плагинов?
Возможно ли создавать пользовательские шаблоны страниц через плагин?

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;
}

Привет, Ян, у тебя есть пример кода, как передать файл плагина в качестве пользовательского шаблона страницы?

@trnsfrmr: Это очень просто, я добавил простой пример в свой ответ.

Обратите внимание, что в более поздних версиях (3.1+) это в основном заменено фильтром "template_include".

Переопределение функции get_page_template()
— это просто быстрый хак. Оно не позволяет выбирать шаблон из админки, а slug страницы жёстко прописывается в плагине, поэтому пользователь не может понять, откуда берётся шаблон.
Предпочтительное решение — следовать этому руководству, которое позволяет зарегистрировать шаблон страницы в бэкенде прямо из плагина. Затем он будет работать как любой другой шаблон.
/*
* Инициализирует плагин, устанавливая фильтры и административные функции.
*/
private function __construct() {
$this->templates = array();
// Добавляем фильтр к метабоксу атрибутов, чтобы внедрить шаблон в кеш.
add_filter('page_attributes_dropdown_pages_args',
array( $this, 'register_project_templates' )
);
// Добавляем фильтр к сохранению записи, чтобы внедрить наш шаблон в кеш страницы
add_filter('wp_insert_post_data',
array( $this, 'register_project_templates' )
);
// Добавляем фильтр к подключению шаблона, чтобы определить, назначен ли нашей
// странице шаблон, и вернуть его путь
add_filter('template_include',
array( $this, 'view_project_template')
);
// Добавьте ваши шаблоны в этот массив.
$this->templates = array(
'goodtobebad-template.php' => 'Быть плохим — это хорошо',
);
}

Было бы здорово (и предпочтительно), если бы вы могли опубликовать соответствующий код из ссылки в своем ответе, иначе это не более чем раздутый комментарий :-)

В этом руководстве фактически указано, что пример Тома МакФарлина является первоисточником данного подхода.

Ни один из предыдущих ответов не сработал для меня. Вот решение, где можно выбрать шаблон в админке WordPress. Просто поместите этот код в основной PHP-файл вашего плагина и замените template-configurator.php
на название вашего шаблона.
// Загрузка шаблона для конкретной страницы
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;
}
/**
* Добавление шаблона "Custom" в раздел атрибутов страницы.
*/
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 ) {
// Добавляем кастомный шаблон с именем template-custom.php в выпадающий список
$post_templates['template-configurator.php'] = __('Конфигуратор');
return $post_templates;
}

Да, это возможно. Я нашел этот пример плагина очень полезным.
Еще один подход, который пришел мне в голову - это использование WP Filesystem API для создания файла шаблона в теме. Я не уверен, что это лучший подход, но уверен, что он работает!
