Como * remover * um modelo de página de tema pai de um tema filho?

17

Estou usando o tema TwentyTen para criar um tema filho, mas não consigo me livrar do modelo de página 'Uma coluna, sem barra lateral' que está no tema pai TwentyTen.

Eu pensei que apenas copiar e excluir o conteúdo faria o truque, mas parece que não. Alguém sabe como fazer isso? Tenho certeza que é muito simples.

obrigado

osu

Osu
fonte

Respostas:

11

Substituir esse modelo seria muito mais fácil do que se livrar dele. Do jeito que a lógica segue.

Não afirmo que seja uma idéia eficiente (tarde aqui), mas isso seria desfeito na tela de edição:

add_action('admin_head-post.php','remove_template');

function remove_template() {

    global $wp_themes;

    get_themes();
    $templates = &$wp_themes['Twenty Ten']['Template Files'];
    $template = trailingslashit( TEMPLATEPATH ).'onecolumn-page.php';
    $key = array_search($template, $templates);
    unset( $templates[$key] );
}
Rarst
fonte
Obrigado por isso, isso parece uma boa solução - quando você diz substituir o modelo, você quer dizer incluir apenas um modelo de uma coluna? Ou você quer substituí-lo por um modelo que eu realmente quero usar (ou seja, chamá-lo de uma coluna, mas na verdade tem 2 ou 3 colunas?)?
Osu
@ Osu, eu quis dizer substituir seu próprio modelo semelhante. No que diz respeito à lógica, é fácil alterar o tema filho e adicioná-lo aos modelos do tema pai, mas é difícil desativá-lo. Basicamente, o tema filho deve fazer mais do que o tema pai, não menos. E a lógica do código segue esse princípio.
Rarst
Ah ok. Obrigado por esclarecer isso. Vou criar um modelo de uma coluna para eles então. Cheers
Osu
Para alguém que quer remover o tema na lista suspensa usando jQuery, então esta é uma outra abordagem (não tenho certeza se é a melhor maneira embora): pastie.org/3710683
Osu
2
@brasofilo internos temáticos relacionadas passou por grandes mudanças de refatoração e API em 3.4, de modo a abundância de material mais antigo não vai funcionar
Rarst
29

O WordPress 3.9 introduz um theme_page_templatesfiltro.

O exemplo abaixo de um tema filho Twenty Fourteenfunctions.php mostra como remover o modelo "Página do colaborador":

function tfc_remove_page_templates( $templates ) {
    unset( $templates['page-templates/contributors.php'] );
    return $templates;
}
add_filter( 'theme_page_templates', 'tfc_remove_page_templates' );
Alex Angas
fonte
3
Esta deve ser a resposta aceita atualizada para o WP 3.9
superior
9

Expandindo a resposta da @ Rarst, aqui está uma abordagem mais genérica que não está vinculada a um tema específico, mas pode ser usada dentro do functions.php do seu próprio tema filho, para alterar os modelos de página de tema pai dos quais você deseja se livrar.

function remove_template( $files_to_delete = array() ){
    global $wp_themes;

    // As convenience, allow a single value to be used as a scalar without wrapping it in a useless array()
    if ( is_scalar( $files_to_delete ) ) $files_to_delete = array( $files_to_delete );

    // remove TLA if it was provided
    $files_to_delete = preg_replace( "/\.[^.]+$/", '', $files_to_delete );

    // Populate the global $wp_themes array
    get_themes();

    $current_theme_name = get_current_theme();

    // Note that we're taking a reference to $wp_themes so we can modify it in-place
    $template_files = &$wp_themes[$current_theme_name]['Template Files'];

    foreach ( $template_files as $file_path ){
        foreach( $files_to_delete as $file_name ){
            if ( preg_match( '/\/'.$file_name.'\.[^.]+$/', $file_path ) ){
                $key = array_search( $file_path, $template_files );
                if ( $key ) unset ( $template_files[$key] );
            }
        }
    }
}

Assim, você pode usá-lo no arquivo functions.php do seu tema filho da seguinte forma:

add_action( 'admin_head-post.php', 'remove_parent_templates' );

function remove_parent_templates() {
    remove_template( array( "showcase.php", "sidebar-page" ) );
}

Aqui estou apenas ilustrando que você não precisa passar a parte ".php" se não quiser.

Ou: remove_template( "sidebar-page" );- você não precisa passar uma matriz se quiser modificar apenas um único arquivo.

Tom Auger
fonte
6

Há um novo filtro no núcleo do WP (3.9) para remover os modelos de página. Pode ser usado a partir de temas filhos.

Veja como conseguir isso no TwentyTen (testado no WP 3.9):

add_filter( 'theme_page_templates', 'my_remove_page_template' );
    function my_remove_page_template( $pages_templates ) {
    unset( $pages_templates['onecolumn-page.php'] );
    return $pages_templates;
}

https://core.trac.wordpress.org/changeset/27297

http://boiteaweb.fr/theme_page_templates-hook-semaine-16-8033.html

Marcio Duarte
fonte
Um link externo se torna inútil se o link for alterado ou removido. Isso também não faz nenhuma tentativa de responder à pergunta
Tom J Nowell
Justo, exemplo adicionado.
Marcio Duarte
1

Como as respostas anteriores não funcionam mais aqui nas versões atuais do WordPress e houve uma pergunta relacionada que acabei de responder (abril de 2013) usando um buffer de saída PHP, imaginei que postaria um link para essa resposta.

Também acabou de publicar o plug-in Omitir modelos de página de tema pai que filtra todos os modelos de página de tema pai na lista suspensa de modelos na metabox Atributos da página ao adicionar ou editar uma "Página" do WordPress .

MikeSchinkel
fonte
0

10 de julho de 2012 - WordPress 3.4.1

As respostas anteriores não estão funcionando e, como Rarst disse em um comentário:

internos relacionados ao tema passaram por grandes refatorações e alterações de API na 3.4, portanto, muitas coisas mais antigas não funcionam

Solução jQuery rápida e suja

add_action('admin_head', 'wpse_13671_script_enqueuer');

function wpse_13671_script_enqueuer() {
    global $current_screen;

    /**
     * /wp-admin/edit.php?post_type=page
     */
    if('edit-page' == $current_screen->id) 
    {
        ?>
        <script type="text/javascript">         
        jQuery(document).ready( function($) {
            $("a.editinline").live("click", function () {
                var ilc_qe_id = inlineEditPost.getId(this);
                setTimeout(function() {
                        $('#edit-'+ilc_qe_id+' select[name="page_template"] option[value="showcase.php"]').remove();  
                    }, 100);
            });

            $('#doaction, #doaction2').live("click", function () {
                setTimeout(function() {
                        $('#bulk-edit select[name="page_template"] option[value="showcase.php"]').remove();  
                    }, 100);
            });       
        });    
        </script>
    <?php
    }

    /**
     * /wp-admin/post.php?post=21&action=edit
     */
    if( 'page' == $current_screen->id ) 
    {
        ?>
        <script type="text/javascript">
        jQuery(document).ready( function($) {
            $('#page_template option[value="showcase.php"]').remove();
        });
        </script>
    <?php
    }
}

Não há gancho para isso?

Se eu segui o caminho correto, é aqui que a "ação" acontece ( /wp-includes/class-wp-theme.php) e parece que não há nada aqui para se agarrar ...

/**
 * Returns the theme's page templates.
 *
 * @since 3.4.0
 * @access public
 *
 * @return array Array of page templates, keyed by filename, with the value of the translated header name.
 */
public function get_page_templates() {
    // If you screw up your current theme and we invalidate your parent, most things still work. Let it slide.
    if ( $this->errors() && $this->errors()->get_error_codes() !== array( 'theme_parent_invalid' ) )
        return array();

    $page_templates = $this->cache_get( 'page_templates' );

    if ( ! is_array( $page_templates ) ) {
        $page_templates = array();

        $files = (array) $this->get_files( 'php', 1 );

        foreach ( $files as $file => $full_path ) {
            $headers = get_file_data( $full_path, array( 'Template Name' => 'Template Name' ) );
            if ( empty( $headers['Template Name'] ) )
                continue;
            $page_templates[ $file ] = $headers['Template Name'];
        }

        $this->cache_add( 'page_templates', $page_templates );
    }

    if ( $this->load_textdomain() ) {
        foreach ( $page_templates as &$page_template ) {
            $page_template = $this->translate_header( 'Template Name', $page_template );
        }
    }

    if ( $this->parent() )
        $page_templates += $this->parent()->get_page_templates();

    return $page_templates;
}
brasofilo
fonte