Come * rimuovere * un modello di pagina del tema principale da un tema secondario?


17

Sto usando il tema TwentyTen per creare un tema figlio, ma non riesco a sbarazzarmi del modello di pagina "Una colonna, nessuna barra laterale" che si trova nel tema principale TwentyTen.

Ho pensato che copiarlo ed eliminare i contenuti avrebbe funzionato, ma sembra che non lo sia. Qualcuno sa come fare questo? Sono sicuro che è molto semplice.

Grazie

OSU

Risposte:


11

Sostituire quel modello sarebbe molto più semplice che liberarsene. Proprio come va la logica.

Non ho alcuna pretesa che sia un'idea efficiente (in ritardo qui), ma questo lo farebbe apparire sfocato 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] );
}

Grazie per questo, sembra una buona soluzione: quando dici di sovrascrivere il modello, intendi comunque includere solo un modello a colonna? O intendi sovrascriverlo con un modello che voglio effettivamente usare (cioè chiamarlo One Column ma in realtà ha 2 o 3 colonne?)?
Osu,

@Osu intendevo sostituire con il tuo modello simile. Per quanto riguarda la logica, è facile per il tema figlio cambiare e aggiungere ai modelli del tema principale, ma è difficile disabilitarli. Fondamentalmente il tema figlio dovrebbe fare di più del tema genitore, non di meno. E la logica del codice segue questo principio.
Rarst

Ah ok. Grazie per averlo chiarito. Creerò quindi un modello a una colonna per loro. Saluti
Osu,

Per chiunque voglia rimuovere il tema dall'elenco a discesa usando jQuery, questo è un altro approccio (non sono sicuro che sia il modo migliore): pastie.org/3710683
Osu

2
Gli interni a tema @brasofilo hanno subito importanti refactoring e modifiche API nel 3.4, quindi un sacco di roba più vecchia non funzionerà
Rarst

29

WordPress 3.9 introduce un theme_page_templatesfiltro.

L'esempio seguente di un tema di ventiquattordici figli functions.phpmostra come rimuovere il modello "Pagina collaboratore":

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

3
Questa dovrebbe essere la risposta accettata aggiornata per WP 3.9+
helgatheviking

9

Espandendo la risposta di @ Rarst, ecco un approccio più generico che non è legato a un tema specifico, ma può essere utilizzato all'interno delle funzioni.php del tuo tema figlio per eseguire l'annullamento di qualsiasi modello di pagina del tema principale da eliminare.

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

Quindi puoi usarlo nel file Functions.php del tuo tema figlio 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 si desidera.

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


6

C'è un nuovo filtro nel core WP (3.9) per rimuovere i modelli di pagina. Può essere utilizzato da temi figlio.

Ecco come ottenere questo risultato 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


Un collegamento fuori sede diventa inutile se il collegamento cambia o viene rimosso. Anche questo non fa alcun tentativo di rispondere effettivamente alla domanda
Tom J Nowell

Abbastanza giusto, esempio aggiunto.
Marcio Duarte

1

Poiché le risposte precedenti non funzionano più qui nelle versioni correnti 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 link a quella risposta.

Inoltre, ho appena pubblicato i modelli di pagina dei temi principali Ometti plug-in che filtra tutti i modelli di pagine dei temi principali dall'elenco a discesa dei modelli nella metabox Attributi di pagina quando si aggiunge o si modifica una "Pagina" di WordPress .


0

10 luglio 2012 - WordPress 3.4.1

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

gli interni relativi al tema sono stati sottoposti a importanti refactoring e modifiche alle API in 3.4, quindi molte cose più vecchie non funzioneranno

Soluzione jQuery rapida e sporca

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 gancio per quello?

Se ho seguito il percorso corretto, è qui che si verifica "l'azione" ( /wp-includes/class-wp-theme.php) e sembra che qui non ci sia nulla da agganciare ...

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.