La technique des thèmes enfants sous WordPress ou child theme en anglais, vous permet d’apporter des modifications à un thème parent sans pour autant modifier le code original. Utilisant cette méthode assez fréquemment, je cherchais un moyen de désactiver – ou du moins de masquer, les modèles de pages issus dudit thème parent sans pour autant supprimer les fichiers sources ; que je vous délivre dans la suite du tutoriel.

Pour rappel, les modèles de pages sous WordPress permettent de bénéficier d’une mise en page différente. Ils sont souvent utilisés dans les thèmes premium pour proposer des pages prêtes-à-l’emploi comme les formulaires de contact, les plans de site ou encore les portfolio. Reportez à cette liste de 6 modèles de pages pour WordPress pour en apprendre davantage à leurs sujets.

Capture d'écran - Liste des modèles de page sous WordPress
Un exemple de modèle de page disponible avec mon thème WordPress

Ces modèles de page sont présents dans la boite Attributs de la page dans l’éditeur de création de page, sur la partie droite. Ils correspondent automatiquement à un fichier PHP présent dans le dossier du thème dans /wp-content/themes/NOM_DU_THEME/

Ainsi, si je souhaite désactiver le modèle Liens correspondant au fichier template-links.php, je devrais l’ajouter dans la fonction ci-dessous. Cette fonction doit être insérée dans le fichier functions.php de votre thème enfant pour surpasser les réglages du thème parent.

// Masquage des modèles de page inutiles
$_templates_to_remove = array();
function remove_template( $files_to_delete = array() ){
 if ( is_scalar( $files_to_delete ) ) $files_to_delete = array( $files_to_delete );
global $_templates_to_remove;
 $_templates_to_remove = array_unique(array_merge($_templates_to_remove, $files_to_delete));

add_action('admin_print_footer_scripts', '_remove_template_footer_scripts');
}
function _remove_template_footer_scripts() {
 global $_templates_to_remove;
if ( ! $_templates_to_remove ) { return; }
 ?>
 <script type="text/javascript">
 jQuery(function($) {
 var tpls = <?php echo json_encode($_templates_to_remove); ?>;
 $.each(tpls, function(i, tpl) {
 $('select[name="page_template"] option[value="'+ tpl +'"]').remove();
 });
 });
 </script>
 <?php
}
add_action('admin_head-post.php', 'remove_parent_templates');
add_action('admin_head-post-new.php', 'remove_parent_templates');
function remove_parent_templates() {
 remove_template(array(
 'template-links.php',
 'page-portfolio.php'
));
}

Le principe est donc fort simple : il suffit d’ajouter en fin de code les noms des fichiers PHP à désactiver en les séparant par des virgules.

Retournez ensuite dans l’éditeur de création de page de WordPress pour constater la disparition du modèle dans la liste déroulante.

Le code original est issu du forum WordPress.org et ce ne fut pas évident de trouver une telle information qui soit fonctionelle sous la dernière version de WordPress. Faites-en bon usage !

13 commentaires

  1. Encore un très bon tutoriel que voilà. Pour ma part, j’avais déjà au le souci avec un client et j’avais tout simplement masqué en CSS le système de template. Mais ton code est bien meilleur, surtout que seuls les templates désirés sont retirés, et non pas l’ensemble.

  2. Bonjour,

    Pour masquer un ou plusieurs modèles de page dans ce menu déroulant, j’avais pris l’habitude de simplement supprimer le nom du modèle au tout début de la page template même. Par exemple, j’ai un modèle de page dont le nom est contact.php, j’édite cette page dans le menu Apparence > Editeur, puis je supprime les premières lignes /*Template Name: Contact*/ et la balise d’encadrement php.

    Ainsi je conserve la page dans le dossier du thème, n’ajoute aucun code supplémentaire et garde la possibilité d’utiliser le menu déroulant.

    Cette méthode entraîne t’elle des complications particulières ?

    N’étant qu’un lecteur occasionnel, j’en profite pour vous adresser tous mes remerciements pour votre formidable travail sur WordPress.

  3. Trop marrant de voir mon code pourri réapparaître ici.
    Content aussi de voir que ca puisse vous servir.

    En espérant qu’une méthode plus propre soit possible prochaine, le filtre serait certainement une bonne solution.

Laisser un commentaire