Como posso adicionar uma opção à lista de modelos de páginas de um plug-in?

10

Eu tenho procurado nas últimas duas horas uma maneira de criar um modelo de página personalizado a partir de um plug-in, mas ainda não tive sorte.

O que estou tentando especificamente fazer é adicionar uma opção à lista de modelos de página disponíveis ao editar uma página e não usando outro método como if( is_page( 'page-slug' ) ) { /* etc */ }

Existe uma variável global que eu possa modificar para fazer isso?

Editar:

Eu estou usando este código atualmente, com base no link @ m0r7if3r me deu em um comentário, o problema é que ele irá executar esta função ao visualizar a página, mas não ao editar a página (para preencher a lista suspensa com o modelos de página):

class JW_SiteGrader {

    private static $instance;

    private function __construct() {


        add_action( 'template_redirect', array( &$this, 'sitegrader_template_redirect' ), 20 );

    }

    public static function getInstance() {

        // Return the class data in a Singleton fashion
        if (self::$instance == null)
            self::$instance = new JW_SiteGrader();
        return self::$instance;

    }

    public function sitegrader_template_redirect() {

        add_filter( 'page_template', array( &$this, 'sitegrader_page_template' ), 10, 1 );

    }

    public function locate_plugin_template( $template_names, $load = false, $require_once = true ) {

        if ( !is_array( $template_names ) )
            return '';

        $located = '';

        $this_plugin_dir = WP_PLUGIN_DIR . '/' . str_replace( basename( __FILE__ ), '', plugin_basename( __FILE__ ) );

        foreach ( $template_names as $template_name ) {

            if ( !$template_name )
                continue;

            if ( file_exists( STYLESHEETPATH . '/' . $template_name ) ) {

                $located = STYLESHEETPATH . '/' . $template_name;
                break;

            } else if ( file_exists( TEMPLATEPATH . '/' . $template_name ) ) {

                $located = TEMPLATEPATH . '/' . $template_name;
                break;

            } else if ( file_exists( $this_plugin_dir .  $template_name ) ) {

                $located =  $this_plugin_dir . $template_name;
                break;

            }

        }

        if ( $load && '' != $located )
            load_template( $located, $require_once );

        return $located;
    }

    public function sitegrader_page_template( $template ) {

        $object = get_queried_object();

        if ( 'page' == $object->post_type ) {

            // New 
            $templates[] = "page-sitegrader.php";
            // Like in core
            $templates[] = "page-{$object->post_type}.php";
            $templates[] = "page.php";

            return locate_template( $templates );  

        }

        // return apply_filters('page_template', $template);
        return $template;
    }

}

Editar 2:

Parece que esta funcionalidade será lançada em uma atualização futura, eu li alguns trac tickets sobre isso e tem havido alguma discussão, mas nenhuma resposta real (esperando por 3,4). Irá listar os URLs dos bilhetes trac daqui a pouco.

Editar 3:

O código acima funciona, MAS, o único problema que estou tendo neste momento é que não há nenhum modelo sendo adicionado à lista suspensa ao editar / adicionar uma nova página. Estou tentando algumas coisas e atualizarei minha pergunta em breve.

    
por Jared 13.02.2012 / 05:20

6 respostas

4

Filtros? Alguém?

Não há nenhum filtro para ajudar: page_template_dropdown($template); é usado para criar o menu suspenso e não é filtrável.

Entrando na matriz de modelos?

Para criar o conteúdo suspenso, a caixa meta do núcleo usa get_page_templates() . De dentro, a função se parece com o seguinte:

$themes = get_themes();
$theme = get_current_theme();
$templates = $themes[$theme]['Template Files'];

Mas, ao olhar para get_themes(); , não há nenhuma possibilidade de interceptar a lista de modelos. Ainda mais temos o problema, que não há chance de obter um modelo fora do diretório de temas…

... Fingindo um tema!

A teoria e suas desvantagens…

Você pode usar register_theme_directory() para adicionar um diretório de tema adicional onde você pode colocar modelos. Então, o mais fácil seria registrar seu plugin como pasta de temas também:

// Register during init hook:
register_theme_directory( plugin_dir_path( __FILE__ ).'templates' );

Nota: É aqui que não sei se vai funcionar .

Durante a ativação do plugin: Então você deve colocar um arquivo style.css.php dentro de sua pasta templates . Isso permitiria que você adicionasse variáveis ao seu arquivo. Essa variável seria então o tema pai. E o tema pai deve ser simplesmente o tema atualmente ativo. Em seguida, atualize seu tema ativo para o seu plugin.

Drawback # 2: Sobre o »Aparência« Interface do usuário… Talvez adicione uma nota dizendo que esse "Tema" não deve ser usado como tema real. Deixo o resto de »Evitar activar este tema« coisas para a tua imaginação. De qualquer forma: deve funcionar.

Drawback # 2: Esse truque evitará com sucesso temas infantis. Você está autorizado a ter um tema pai. Nada mais.

    
por kaiser 13.02.2012 / 11:00
2

Como uma sugestão para um trabalho em potencial, você considerou usar o sistema de arquivos do WordPress para escrever um arquivo de modelo de página do seu plug-in para o diretório atual do tema ativo? Dependendo de quanto controle você quer durante este processo, você pode ter seu plugin escrever o arquivo na ativação e removê-lo na desinstalação. Como alternativa, você poderia criar arquivos de modelo de página dinamicamente na interface do usuário do seu plug-in usando um formulário para passar certos valores, como o nome do modelo de página que será exibido na caixa suspensa da tela de edição de postagens. Você também pode, em teoria, remover o modelo de página de dentro da sua interface do usuário do plugin com o clique de um botão e, da mesma forma, adicionar vários modelos para diferentes finalidades. Há um bom post sobre o uso do sistema de arquivos no blog da Otto. Eu não tenho o link comigo agora, mas você pode procurar por ele.

Espero que eles divulguem o que você pretendia fazer no próximo lançamento principal.

    
por userabuser 22.02.2012 / 21:22
1

Eu dei uma olhada na fonte e, de maneira bastante chocante, não parece ser uma maneira de fazer isso! Meu hack sugerido seria adicionar uma segunda meta box com uma lista suspensa theme override / second theme. Em seguida, conecte-se a este filtro:

# wp-includes/theme.php line 751 in 3.3.1:
return apply_filters( "{$type}_template", locate_template( $templates ) );

para retornar o arquivo do seu tema, caso tenha sido substituído. É claro que você só deseja adicionar ao filtro se for a postagem desejada.

Se você quiser ser chique, pode desfazer a caixa original e recriá-la (por meio de filtros, é claro, sem modificar o código principal).

Sugiro também adicionar um tíquete do trac solicitando essa funcionalidade (se já não houver uma lá para isso ).

    
por Matthew Boynes 13.02.2012 / 06:53
1

Eu consegui isso no passado removendo o metabox de modelo de página padrão e adicionando seu próprio metabox. Eu tive o novo metabox use o construído em get_page_templates e, em seguida, adicionei os outros que eu precisava programaticamente. Em um save, ele pode atualizar o modelo de página da mesma forma que o wordpress faz.

    
por gruvii 13.03.2012 / 04:16
1

Confira o gancho theme_page_templates , usado pela função get_page_templates , filtro adicionado desde a atualização 3.9 em 4.4:

apply_filters( 'theme_page_templates', $page_templates, $this, $post );
    
por William Gu 20.06.2016 / 10:35
-2

Um resultado de pesquisa com o DuckDuckGo adiciona um modelo de página do wordpress a resposta para mim em uma página do wpmu.org intitulada Tutorial de Modelo de Página Personalizada do WordPress .

Essencialmente, dentro do diretório do tema, wp-content / themes / your-theme , copie um modelo de página existente para um novo nome de arquivo php de sua escolha. Edite o novo arquivo, tomando cuidado para alterar o valor da propriedade mágica "Nome do Modelo:" no comentário na parte superior do arquivo.

Isso era tudo o que havia para isso. É possível que este seja um recurso que pós-data a questão. Estou usando o WP 3.5 com o tema twenty_eleven.

Também é possível que existam maneiras mais claras de estender um tema. Edições como essa podem ser sobrescritas por atualizações de temas. Mea Culpa.

    
por Douglas Lovell 24.01.2013 / 04:35