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

15

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 em apenas copiá-lo 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

    
por Osu 01.04.2011 / 00:31

6 respostas

10

Substituir esse modelo seria muito mais fácil do que se livrar dele. Apenas o caminho da lógica.

Eu não tenho a menor idéia de que é uma ideia eficiente (tarde, por exemplo), mas isso a tiraria da 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] );
}
    
por Rarst 01.04.2011 / 01:38
25

WordPress 3.9 introduz um filtro theme_page_templates .

O exemplo abaixo, de um tema infantil Vinte e Quatorze functions.php , mostra como remover o modelo "Página de Colaborador":

function tfc_remove_page_templates( $templates ) {
    unset( $templates['page-templates/contributors.php'] );
    return $templates;
}
add_filter( 'theme_page_templates', 'tfc_remove_page_templates' );
    
por Alex Angas 18.04.2014 / 06:40
9

Expandindo a resposta do @Rarst, aqui está uma abordagem mais genérica que não está vinculada a um tema específico, mas pode ser usada dentro do próprio functions.php do seu tema filho para eliminar qualquer modelo de página de tema pai do qual você queira se livrar. / p>

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] );
            }
        }
    }
}

Então você pode usá-lo no arquivo functions.php do tema filho, assim:

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.

    
por Tom Auger 29.09.2011 / 19:07
7

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

Veja como conseguir isso em 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;
}

enlace

enlace

    
por Marcio Duarte 20.03.2014 / 01:35
1

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

Também acabamos de publicar os Omitir modelos de página de tema pai "Page".

    
por MikeSchinkel 24.04.2013 / 02:23
0

10 de julho de 2012 - WordPress 3.4.1

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

  Os internos relacionados ao tema

passaram por grandes refatorações e alterações de API na versão 3.4, então muitas coisas antigas não funcionarão

Solução rápida e suja jQuery

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 seguisse o caminho correto, é aqui que a "ação" acontece ( /wp-includes/class-wp-theme.php ), e parece que não há nada aqui para ligar ...

/**
 * 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;
}
    
por brasofilo 10.07.2012 / 23:10