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

28 окт. 2010 г., 20:04:20
Просмотры: 122K
Голосов: 84

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

0
Все ответы на вопрос 4
5
92

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;
}
2 нояб. 2010 г. 15:52:24
Комментарии

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

jnthnclrk jnthnclrk
16 нояб. 2010 г. 19:58:46

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

Jan Fabry Jan Fabry
16 нояб. 2010 г. 21:46:14

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

Daniel R Daniel R
10 июн. 2013 г. 18:54:10

Отлично!!! Вы сэкономили мое время, @JanFabry

Kishan Chauhan Kishan Chauhan
21 дек. 2018 г. 16:02:14

Как отметил @fireydude, это не универсальное решение. Это временное исправление, в котором жестко прописан ярлык страницы.

Mauro Colella Mauro Colella
8 июл. 2019 г. 00:18:25
2
31

Переопределение функции 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'     => 'Быть плохим — это хорошо',
        );
}
12 окт. 2015 г. 14:29:34
Комментарии

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

Pieter Goosen Pieter Goosen
12 окт. 2015 г. 14:32:32

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

fireydude fireydude
12 окт. 2015 г. 14:53:34
1
16

Ни один из предыдущих ответов не сработал для меня. Вот решение, где можно выбрать шаблон в админке 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;
}
22 окт. 2019 г. 11:21:25
Комментарии

Это правильный способ сделать это.

Muhammad Zohaib Muhammad Zohaib
26 авг. 2023 г. 11:52:32
1

Да, это возможно. Я нашел этот пример плагина очень полезным.

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

4 дек. 2014 г. 17:37:08
Комментарии

Приведенный в примере плагин даже довольно хорошо документирован. Мне это нравится. :)

Arvid Arvid
14 авг. 2017 г. 17:46:58