Comment * supprimer * un modèle de page de thème parent d'un thème enfant?

15

J'utilise le thème TwentyTen pour créer un thème enfant, mais je ne parviens pas à supprimer le modèle de page "Une colonne, pas de barre latérale" figurant dans le thème parent TwentyTen.

Je pensais que le copier et supprimer le contenu ferait l'affaire, mais il semble que non. Est-ce que quelqu'un sait comment faire ça? Je suis sûr que c'est très simple.

Merci

osu

    
posée Osu 01.04.2011 - 00:31

6 réponses

10

Remplacer ce modèle serait beaucoup plus facile que de le supprimer. Comme le veut la logique.

Je ne peux pas prétendre que c'est une idée efficace (tard ici), mais cela ne passerait pas à l'écran d'édition:

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] );
}
    
réponse donnée Rarst 01.04.2011 - 01:38
25

WordPress 3.9 introduit un filtre theme_page_templates .

L'exemple ci-dessous tiré d'un Twenty Fourteen thème enfant functions.php montre comment supprimer le modèle "Page du contributeur":

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

Pour en savoir plus sur la réponse de @Rarst, voici une approche plus générique qui n'est pas liée à un thème spécifique, mais qui peut être utilisée dans le fichier functions.php de votre propre thème enfant pour supprimer tous les modèles de page de thème parent que vous souhaitez supprimer. / 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] );
            }
        }
    }
}

Vous pouvez donc l'utiliser dans le fichier functions.php de votre thème enfant comme suit:

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

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

Ici, je montre simplement que vous ne devez pas passer la partie ".php" si vous ne le souhaitez pas.

Ou: remove_template( "sidebar-page" ); - vous n'avez pas besoin de passer un tableau si vous souhaitez modifier un seul fichier.

    
réponse donnée Tom Auger 29.09.2011 - 19:07
7

Il existe un nouveau filtre dans le noyau WP (3.9) pour supprimer les modèles de page. Il peut être utilisé à partir de thèmes enfants.

Voici comment procéder dans TwentyTen (testé sur 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

    
réponse donnée Marcio Duarte 20.03.2014 - 01:35
1

Les réponses précédentes ne fonctionnant plus dans les versions actuelles de WordPress, il y avait une question connexe à laquelle je venais de répondre (avril 2013) en utilisant un tampon de sortie PHP. J'ai pensé que je posterais un lien vers cette réponse.

Je viens également de publier les Modèles de page à exclure du thème parent . un> plug-in qui filtre tous les modèles de page de thème parent dans la liste déroulante de modèles de la boîte de dialogue Attributs de page lors de l'ajout ou de la modification d'un "Page." WordPress

    
réponse donnée MikeSchinkel 24.04.2013 - 02:23
0

10 juillet 2012 - WordPress 3.4.1

Les réponses précédentes ne fonctionnent pas et, comme le dit Rarst dans un commentaire:

  

Les éléments internes liés aux thèmes ont subi d'importantes modifications de refactoring et d'API dans la version 3.4, de sorte que de nombreux éléments plus anciens ne fonctionneront pas

Solution jQuery rapide et sale

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

Pas de crochet pour ça?

Si j'ai suivi le chemin correct, c'est là que se produit "l'action" ( /wp-includes/class-wp-theme.php ) et ressemble à il n'y a rien ici pour accrocher ...

/**
 * 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;
}
    
réponse donnée brasofilo 10.07.2012 - 23:10

Lire d'autres questions sur les étiquettes