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

Ответы:

73

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;
}
Ян Фабри
источник
Привет, Ян, у тебя есть пример кода о том, как передать файл плагина в качестве пользовательского шаблона страницы?
jnthnclrk
@trnsfrmr: Это действительно легко, я добавил простой пример к своему ответу.
Ян Фабри
10
Обратите внимание, что это было более или менее заменено фильтром template_include в более поздних версиях (3.1+).
Inigoesdr
Отлично !!!, ты сэкономил мое время @JanFabry
Кишан Чаухан
Как утверждает @fireydude, это не общее решение. Это обходной путь, который жестко кодирует слаг страницы.
Мауро Колелла
22

Переопределение 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',
        );
}
fireydude
источник
Было бы неплохо ( и желательно), если вы можете опубликовать соответствующий код по ссылке в вашем ответе, иначе это не более чем раздутый комментарий :-)
Pieter Goosen
Учебное пособие фактически приписывает пример Тома Макфарлина как автора этого подхода.
fireydude
7

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

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

Ari
источник
Связанный пример плагина даже довольно хорошо задокументирован. Я люблю это. :)
Арвид
0

Ни один из предыдущих ответов не работал на мой. Здесь вы можете выбрать свой шаблон в админке 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;
}
Снижение Антуана
источник