web-dev-qa-db-fra.com

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

J'utilise le thème TwentyTen pour créer un thème enfant, mais je n'arrive 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 feraient 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

16
Osu

Remplacer ce modèle serait beaucoup plus facile que de s'en débarrasser. Juste comme la logique va.

Je ne prétends pas que c'est une idée efficace (tard ici), mais cela l'aurait effacée de 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] );
}
10
Rarst

WordPress 3.9 introduit un filtre theme_page_templates.

L'exemple ci-dessous tiré d'un Twenty Fourteen child theme functions.php montre comment supprimer le modèle "Contributor Page":

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

Pour compléter 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 functions.php de votre propre thème enfant pour supprimer tous les modèles de page de thème parent que vous souhaitez supprimer.

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.

9
Tom Auger

Un nouveau filtre dans WP core (3.9) permet de 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;
}

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

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

6
Marcio Duarte

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)} à l'aide d'un PHP tampon de sortie. link à cette réponse.

Vient également de publier le Omettre les modèles de page de thème parent plug-in qui filtre tous les modèles de page de thème parent dans la liste déroulante de modèles de la métaboxe Attributs de page lors de l'ajout ou de la modification d'un WordPress "Page . "

1
MikeSchinkel

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 la refactorisation et des API dans la version 3.4, de sorte que beaucoup d'é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 bon chemin, 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;
}
0
brasofilo