¿Cómo * eliminar * una plantilla de página de tema principal de un tema secundario?

15

Estoy usando el tema TwentyTen para crear un tema secundario, pero parece que no puedo deshacerme de la plantilla de página 'Una columna, sin barra lateral' que se encuentra en el tema principal de TwentyTen.

Pensé que solo copiarlo y eliminar el contenido haría el truco, pero parece que no. ¿Alguien sabe como hacer esto? Estoy seguro de que es muy simple.

Gracias

osu

    
pregunta Osu 01.04.2011 - 00:31

6 respuestas

10

Anular esa plantilla sería mucho más fácil que deshacerse de ella. Justo como va la lógica.

No pretendo que sea una idea eficiente (tarde aquí), pero esto quedaría bloqueado desde la pantalla de edición:

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] );
}
    
respondido por el Rarst 01.04.2011 - 01:38
25

WordPress 3.9 introduce un filtro theme_page_templates .

El siguiente ejemplo de un Twenty Fourteen tema infantil functions.php muestra cómo eliminar la plantilla "Página de contribuyente":

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

Ampliando la respuesta de @Rarst, aquí hay un enfoque más genérico que no está vinculado a un tema específico, pero se puede usar dentro de las funciones de su propio tema infantil.php para eliminar cualquier plantilla de página de tema principal que desee eliminar.

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

Para que pueda usarlo en el archivo functions.php del tema de su hijo, de este modo:

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

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

Aquí solo estoy demostrando que no tienes que pasar la parte ".php" si no quieres.

O: remove_template( "sidebar-page" ); : no es necesario que pase una matriz si desea modificar un solo archivo.

    
respondido por el Tom Auger 29.09.2011 - 19:07
7

Hay un nuevo filtro en el núcleo de WP (3.9) para eliminar las plantillas de página. Se puede usar desde temas infantiles.

Aquí se explica cómo lograr esto en TwentyTen (probado en 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

    
respondido por el Marcio Duarte 20.03.2014 - 01:35
1

Dado que las respuestas anteriores ya no funcionan aquí en las versiones actuales de WordPress y hubo una pregunta relacionada que acabo de responder (abril de 2013) utilizando un búfer de salida PHP, pensé que publicaría un enlace a esa respuesta.

También acaba de publicar Omitir plantillas de página de tema principal complemento que filtra todas las plantillas de página del tema principal de la lista desplegable de plantillas en el metabox Atributos de página al agregar o editar una WordPress "Page."

    
respondido por el MikeSchinkel 24.04.2013 - 02:23
0

10 de julio de 2012 - WordPress 3.4.1

Las respuestas anteriores no funcionan y, como dijo Rarst en un comentario:

  

los aspectos internos relacionados con el tema pasaron por la refactorización principal y los cambios de API en 3.4, por lo que muchas cosas antiguas no funcionarán

Solución jQuery rápida y sucia

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
    }
}

¿No hay gancho para eso?

Si seguí la ruta correcta, aquí es donde ocurre la "acción" ( /wp-includes/class-wp-theme.php ), y parece que no hay nada aquí para enganchar ...

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

Lea otras preguntas en las etiquetas