Criar modelos de página personalizados com plugins?

61

É possível disponibilizar modelos de página personalizados a partir de um plug-in?

jnthnclrk
fonte

Respostas:

73

get_page_template()pode ser substituído pelo page_templatefiltro. Se o seu plug-in é um diretório com os modelos como arquivos, é apenas uma questão de passar os nomes desses arquivos. Se você quiser criá-los "on the fly" (editá-los na área de administração e salvá-los no banco de dados?), Convém escrevê-los em um diretório de cache e consultá-los, ou conectar-se template_redirecte fazer eval()coisas loucas .

Um exemplo simples para um plug-in que "redireciona" para um arquivo no mesmo diretório de plug-ins se um determinado critério for verdadeiro:

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;
}
Jan Fabry
fonte
Olá, Jan, você tem algum código de exemplo sobre como passar um arquivo de plug-in como um modelo de página personalizado?
Jnthnclrk
@trnsfrmr: É realmente fácil, adicionei um exemplo simples à minha resposta.
Jan Fabry
10
Observe que isso foi mais ou menos substituído pelo filtro "template_include" em versões posteriores (3.1+).
Inigoesdr
Perfeito !!!, você economizou meu tempo @JanFabry
Kishan Chauhan
Conforme afirmado por @fireydude, esta não é uma solução genérica. É uma solução alternativa que codifica a lesma da página.
Mauro Colella 07/07
22

Substituir get_page_template()é apenas um hack rápido. Ele não permite que o modelo seja selecionado na tela Admin e o slug da página é codificado no plug-in para que o usuário não tenha como saber de onde vem o modelo.

A solução preferida seria seguir este tutorial, que permite registrar um modelo de página no back-end a partir do plug-in. Então funciona como qualquer outro modelo.

 /*
 * 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
fonte
Seria bom ( e preferido ) se você pode postar o código relevante a partir do link na sua resposta, caso contrário, este é nada mais do que um comentário :-) inchado
Pieter Goosen
O tutorial realmente credita o exemplo de Tom McFarlin como o autor dessa abordagem.
fireydude
7

Sim, é possível. Achei este exemplo de plugin muito útil.

Outra abordagem que me vem à cabeça é o uso da API do sistema de arquivos WP para criar o arquivo de modelo para o tema. Não tenho certeza de que é a melhor abordagem a ser adotada, mas tenho certeza de que funciona!

Ari
fonte
O plugin de exemplo vinculado está bem documentado. Eu gosto disso. :)
Arvid
0

Nenhuma das respostas anteriores estava funcionando para a minha. Aqui um onde você pode escolher o seu modelo no administrador do Wordpress. Basta colocá-lo no seu arquivo principal de plug-in php e mudar template-configurator.phppelo nome do seu modelo

//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;
}
Dessauges Antoine
fonte