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

17

J'utilise le thème TwentyTen pour créer un thème enfant, mais je n'arrive pas à me débarrasser du modèle de page "Une colonne, pas de barre latérale" qui se trouve 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

Osu
la source

Réponses:

11

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

Je ne prétends pas que c'est une idée efficace (tard ici), mais cela le ferait disparaître 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] );
}
Rarst
la source
Merci pour cela, cela semble être une bonne solution - lorsque vous dites remplacer le modèle, voulez-vous simplement juste y inclure un modèle à une colonne? Ou voulez-vous dire le remplacer par un modèle que je veux réellement utiliser (c'est-à-dire l'appeler One Column mais il a en fait 2 ou 3 colonnes?)?
Osu
@Osu, je voulais dire remplacer votre propre modèle similaire. En ce qui concerne la logique, le thème enfant peut facilement être modifié et ajouté aux modèles du thème parent, mais il est difficile de les désactiver. Fondamentalement, le thème enfant est censé faire plus que le thème parent, pas moins. Et la logique du code suit ce principe.
Rarst
Ah ok. Merci d'avoir clarifié cela. Je vais ensuite créer un modèle un col pour eux. Acclamations
Osu
Pour tous ceux qui souhaitent supprimer le thème de la liste déroulante à l'aide de jQuery, il s'agit d'une autre approche (je ne sais pas si c'est la meilleure façon): pastie.org/3710683
Osu
2
Les internes liés au thème @brasofilo ont subi des modifications majeures de refactorisation et d'API dans la version 3.4, de sorte que de nombreuses choses plus anciennes ne fonctionneront pas
Rarst
29

WordPress 3.9 introduit un theme_page_templatesfiltre.

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

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
la source
3
Cela devrait être la réponse acceptée mise à jour pour WP 3.9+
helgatheviking
9

En développant 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 les fonctions de votre propre thème enfant.php pour nuke tous les modèles de page de thème parent dont vous souhaitez vous débarrasser.

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 ceci:

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

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

Ici, j'illustre simplement que vous n'avez pas besoin de 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 ne souhaitez modifier qu'un seul fichier.

Tom Auger
la source
6

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

Voici comment y parvenir 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

Marcio Duarte
la source
Un lien hors site devient inutile si le lien change ou est supprimé. Cela ne tente pas non plus de répondre à la question
Tom J Nowell
Assez juste, exemple ajouté.
Marcio Duarte
1

Étant donné que les réponses précédentes ne fonctionnent plus ici dans les versions actuelles de WordPress et qu'il y avait une question connexe à laquelle je viens de répondre (avril 2013) en utilisant un tampon de sortie PHP, j'ai pensé que je publierais un lien vers cette réponse.

Nous venons également de publier le plug-in Omettre les thèmes de page de thème parent qui filtre tous les modèles de page de thème parent dans la liste déroulante des modèles de la metabox Attributs de page lors de l'ajout ou de la modification d'une «page» WordPress .

MikeSchinkel
la source
0

10 juillet 2012 - WordPress 3.4.1

Les réponses précédentes ne fonctionnent pas et comme Rarst l'a dit dans un commentaire:

les éléments internes liés au thème ont subi des modifications majeures de refactoring et d'API dans la version 3.4, de sorte que de nombreuses choses plus anciennes 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 "l'action" se produit ( /wp-includes/class-wp-theme.php), et il semble qu'il n'y ait rien ici à 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;
}
brasofilo
la source
Billet
mrwweb