Come rimuovere un template di pagina del tema padre da un tema figlio?

1 apr 2011, 01:31:49
Visualizzazioni: 21.2K
Voti: 19

Sto utilizzando il tema TwentyTen per creare un tema figlio, ma non riesco a eliminare il template di pagina 'Una colonna, senza barra laterale' che è presente nel tema padre TwentyTen.

Pensavo che copiarlo e cancellarne il contenuto avrebbe funzionato, ma sembra che non sia così. Qualcuno sa come fare? Sono sicuro che sia molto semplice.

Grazie

osu

0
Tutte le risposte alla domanda 6
1
38

WordPress 3.9 introduce il filtro theme_page_templates.

L'esempio seguente, tratto dal file functions.php di un tema figlio di Twenty Fourteen, mostra come rimuovere il template "Pagina Collaboratori":

function tfc_remove_page_templates( $templates ) {
    unset( $templates['page-templates/contributors.php'] );
    return $templates;
}
add_filter( 'theme_page_templates', 'tfc_remove_page_templates' );

Per tutti gli altri tipi di contenuto (come "post" e i custom post type) puoi usare il filtro più generico theme_{$post_type}_templates (vedi documentazione).

add_filter('theme_page_templates', 'tfc_remove_page_templates');
add_filter('theme_post_templates', 'tfc_remove_page_templates');
add_filter('theme_mycustomposttype_templates', 'tfc_remove_page_templates');
18 apr 2014 07:40:03
Commenti

Questa dovrebbe essere la risposta accettata aggiornata per WP 3.9+

helgatheviking helgatheviking
18 dic 2015 22:25:57
6
11

Sovrascrivere quel template sarebbe molto più semplice che eliminarlo. È semplicemente questione di logica.

Non affermo che sia un'idea efficiente (è tardi qui), ma questo codice lo eliminerebbe dalla schermata di modifica:

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] );
}
1 apr 2011 02:38:21
Commenti

Grazie per questo, sembra una buona soluzione - quando dici di sovrascrivere il template, intendi semplicemente includere comunque un template a una colonna? Oppure intendi sovrascriverlo con un template che voglio effettivamente utilizzare (cioè chiamarlo "Una Colonna" ma che in realtà ne ha 2 o 3?)?

Osu Osu
1 apr 2011 14:49:30

@Osu intendevo sovrascriverlo con un tuo template simile. Per quanto riguarda la logica, è facile per un child theme modificare e aggiungere ai template del parent theme, ma è difficile disabilitarli. Fondamentalmente un child theme dovrebbe fare di più rispetto al parent theme, non di meno. E la logica del codice segue questo principio.

Rarst Rarst
1 apr 2011 15:24:54

Ah, ok. Grazie per la spiegazione. Allora creerò un template a una colonna per loro. Saluti

Osu Osu
5 apr 2011 12:42:03

Per chiunque voglia rimuovere il tema dall'elenco a discesa utilizzando jQuery, ecco un altro approccio (non sono sicuro che sia il modo migliore però): http://pastie.org/3710683

Osu Osu
1 apr 2012 23:06:12

@Rarst : Qualche suggerimento sul perché global $wp_themes non accetta l'unset in 3.4.1?

brasofilo brasofilo
10 lug 2012 00:12:47

@brasofilo gli elementi interni relativi ai temi hanno subito una grande revisione e cambiamenti nell'API in 3.4, quindi molte cose vecchie non funzioneranno

Rarst Rarst
10 lug 2012 00:46:53
Mostra i restanti 1 commenti
0

Espandendo la risposta di @Rarst, ecco un approccio più generico che non è legato a un tema specifico, ma può essere utilizzato all'interno del functions.php del tuo child theme per eliminare qualsiasi template di pagina del tema genitore che desideri rimuovere.

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

    // Per comodità, consente di utilizzare un singolo valore come scalare senza racchiuderlo in un array() inutile
    if ( is_scalar( $files_to_delete ) ) $files_to_delete = array( $files_to_delete );

    // Rimuove l'estensione se è stata fornita
    $files_to_delete = preg_replace( "/\.[^.]+$/", '', $files_to_delete );

    // Popola l'array globale $wp_themes
    get_themes();

    $current_theme_name = get_current_theme();

    // Nota che stiamo prendendo un riferimento a $wp_themes per poterlo modificare direttamente
    $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] );
            }
        }
    }
}

Quindi puoi usarlo nel file functions.php del tuo child theme in questo modo:

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

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

Qui sto solo illustrando che non è necessario passare la parte ".php" se non lo desideri.

Oppure: remove_template( "sidebar-page" ); - non è necessario passare un array se vuoi modificare solo un singolo file.

29 set 2011 20:07:58
2

C'è un nuovo filtro nel core di WordPress (3.9) per rimuovere i template di pagina. Può essere utilizzato dai child theme.

Ecco come implementarlo in TwentyTen (testato su 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

20 mar 2014 02:35:15
Commenti

Un collegamento esterno diventa inutile se il link cambia o viene rimosso. Inoltre, non tenta nemmeno di rispondere realmente alla domanda

Tom J Nowell Tom J Nowell
18 apr 2014 01:25:54

Giusto, ho aggiunto un esempio.

Marcio Duarte Marcio Duarte
18 apr 2014 15:30:17
0

Poiché le risposte precedenti non funzionano più nelle versioni attuali di WordPress e c'era una domanda correlata a cui ho appena risposto (aprile 2013) utilizzando un buffer di output PHP, ho pensato di pubblicare un collegamento a quella risposta.

Ho anche appena pubblicato il plugin Omit Parent Theme Page Templates che filtra tutti i template di pagina del tema genitore dall'elenco a discesa dei template nel metabox "Attributi pagina" quando si aggiunge o modifica una "Pagina" di WordPress.

24 apr 2013 03:23:47
1

10 luglio 2012 - WordPress 3.4.1

Le soluzioni precedenti non funzionano e come ha detto Rarst in un commento:

gli elementi interni relativi ai temi hanno subito una grande riorganizzazione e modifiche all'API nella versione 3.4, quindi molte soluzioni vecchie non funzioneranno

Soluzione Rapida e Semplice con 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
    }
}

Nessun Hook Disponibile?

Se ho seguito il percorso corretto, questo è dove avviene l'"azione" (/wp-includes/class-wp-theme.php), e sembra che non ci sia nulla a cui agganciarsi qui...

/**
 * Restituisce i template di pagina del tema.
 *
 * @since 3.4.0
 * @access public
 *
 * @return array Array di template di pagina, indicizzati per nome file, con il valore del nome tradotto dell'header.
 */
public function get_page_templates() {
    // Se danneggi il tema corrente e invalidiamo il genitore, molte cose continuano a funzionare. Lascia perdere.
    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;
}
11 lug 2012 00:10:45
Commenti

Ticket Trac: http://core.trac.wordpress.org/ticket/21891

mrwweb mrwweb
14 set 2012 20:44:23