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

17

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

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

Gracias

osu

Osu
fuente

Respuestas:

11

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 se vería afectado 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] );
}
Rarst
fuente
Gracias por esto, parece una buena solución: cuando dice que reemplaza la plantilla, ¿quiere decir simplemente incluir una plantilla de una columna allí de todos modos? ¿O te refieres a anularlo con una plantilla que realmente quiero usar (es decir, llamarla una columna pero en realidad tiene 2 o 3 columnas)?
Osu
@Osu quise decir reemplazar tu propia plantilla similar. En lo que respecta a la lógica, es fácil para el tema secundario cambiar y agregar plantillas al tema principal, pero es difícil deshabilitarlas. Básicamente, se supone que el tema secundario debe hacer más que el tema principal, no menos. Y la lógica del código sigue este principio.
Rarst
ah ok Gracias por aclarar eso. Entonces crearé una plantilla de una columna para ellos. Saludos
Osu
Para cualquiera que quiera eliminar el tema de la lista desplegable usando jQuery, este es otro enfoque (aunque no estoy seguro si es la mejor manera): pastie.org/3710683
Osu
2
@brasofilo internos tema relacionado pasaron por grandes cambios de refactorización y la API de 3,4, por lo que un montón de material antiguo no funcionará
Rarst
29

WordPress 3.9 presenta un theme_page_templatesfiltro.

El siguiente ejemplo de un tema secundario de Twenty Fourteenfunctions.php muestra cómo eliminar la plantilla de "Página del contribuyente":

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
fuente
3
Esta debería ser la respuesta aceptada actualizada para WP 3.9+
helgatheviking
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 hijo.php para destruir cualquier plantilla de página de tema principal de la que desee deshacerse.

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 de su tema secundario, así:

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

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

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

O bien: remove_template( "sidebar-page" );no necesita pasar una matriz si desea modificar un solo archivo.

Tom Auger
fuente
6

Hay un nuevo filtro en WP core (3.9) para eliminar plantillas de página. Se puede usar a partir de temas secundarios.

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

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

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

Marcio Duarte
fuente
Un enlace externo se vuelve inútil si el enlace cambia o se desactiva. Esto tampoco hace ningún intento de responder la pregunta
Tom J Nowell
Bastante justo, ejemplo agregado.
Marcio Duarte
1

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

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

MikeSchinkel
fuente
0

10 de julio de 2012 - WordPress 3.4.1

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

aspectos internos relacionados con el tema pasaron por una refactorización importante y 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í el camino correcto, aquí es donde sucede 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;
}
brasofilo
fuente
Boleto de
mrwweb