96d332cec83649a8529c06cdfd24dfd0_large[1]

theme_page_templates
Le hook de la semaine n°16

haaaaaaaa vous l’attendiez ? Moi aussi ! Le hook theme_page_templates est enfin arrivé avec WordPress 3.9.

A quoi ça sert ?

Ce hook permet enfin de filtrer, donc, intervenir sur le liste des modèles de pages, ceux là :

baw_140416-110548[1]

Cette fameuse liste dans laquelle on aimerait pourvoir supprimer des templates …

Pourquoi faire ?

Imaginons que vous développiez un thème enfant et que vous aimeriez enlever la possibilité de choisir un des templates. C’est un cas qui m’est déjà arrivé, peut-être vous aussi !? Même chose si simplement le thème du client propose trop de templates, et vous aimeriez éviter qu’il n’en choisisse un qui défigure le site, pourquoi pas.

Avant ce hook, donc avant 3.9, il fallait tricher en JavaScript en venant supprimer un tag OPTION du select, et en PHP interdire le choix d’un template en particulier, bref, de la bidouille.

Le hook est demandé depuis longtemps, très longtemps, depuis le 05 mai 2010 en fait … et cela a enfin été validé ! \m/

Une démo ?

Oui bien sûr ! Voyons déjà le hook dans le core :

apply_filters( 'theme_page_templates', $page_templates, $this, $post );

Nous avons 3 paramètres :

  1. $page_templates : Contient le tableau avec les templates possibles.
  2. $this : L’objet PHP du thème actuel.
  3. $post : La page en cours de création/modification.

Il nous faut jouer sur le $page_templates, rien ne nous empêche de conditionner ça selon le thème, selon la page justement, grâce aux autres paramètres, je vous laisse libre d’imaginer le scénario que vous voulez, je vais moi, faire une démo simple.

Disons que le tableau nous donne ceci :

baw_140416-145253[1]

array ( 'no-sidebar.php' => 'Page sans sidebar', 'showcase.php' => 'Modèle de vitrine', 'sidebar-page.php' => 'Modèle de colonne latérale', )

Je souhaite empêcher que mon client ne puisse utiliser le template ‘no-sidebar.php’ => ‘Page sans sidebar’, je vais alors utiliser TADAAA le nouveau fitre comme ceci :

add_filter( 'theme_page_templates', 'baw_theme_page_templates' );
function baw_theme_page_templates( $pages_templates )
{
	unset( $pages_templates['no-sidebar.php'] );
	return $pages_templates;
}

Le fichier de templates se trouvant à la racine de mon thème, c’est bien l’index no-sidebar.php que je dois supprimer avec la fonction PHP unset().

Si vos fichiers sont rangés dans des dossiers, ce serait alors peut-être templates/no-sidebar.php qu’il faudrait utiliser, à vous de connaitre l’arborescence de votre thème.

Résultat, template ‘Page sans sidebar‘ disparu :

baw_140416-151426[1]

array ( 'showcase.php' => 'Modèle de vitrine', 'sidebar-page.php' => 'Modèle de colonne latérale', )

Attention

Il n’est pas possible de modifier l’intitulé d’un template, il n’est pas non plus possible d’en ajouter via le hook.

Pour en ajouter, il suffit de déclarer correctement son template dans le thème parent ou enfant. Si dans un thème enfant vous déclarez le même template, c’est à dire même nom de fichier et même nom de template, c’est bien celui de l’enfant qui sera pris en compte, il écrase donc en quelques sortes le parent.

Avouez, vous avez toujours désiré ce hook !

Lire la suite

Vous aimez ? Partagez !

11 réflexions sur “ theme_page_templates

  1. Très bien ça ! En effet cela peut servir surtout s’il ne s’agit pas de notre propre thème ^^ ce qui est chiant en revanche est de devoir connaître l’arborescence, on ne peut pas les repérer par name?
    1. Le nom est potentiellement complexe comme « WTF $^^ LOL&²é rofl ». Je me vois mal coder un hook avec ce truc.
      Si tu es dev, alors tu sais repérer une arborescence d’un fichier, ça devrait aller quand même n’abusons pas.
  2. Oui, je confirme, bien crado comme le dit Daniel : surtout ce qui me gênait avec la méthode Javascript, c’est la persistance des modèles de pages supprimés depuis les modifications rapides de la rubrique « toutes les pages ». Là ça disparait complètement. Grand merci Julio !
    1. Oui les astuces de modification de templates ne le font jamais sur cette liste, pourquoi, je ne sais pas, ce n’est pas plus difficile, juste un oubli du comportement de WordPress ? Dommage. Bref, c’est réglé ! :D De rien je ne fais qu’informer ;)

Envie de dire quelque chose ?

Avant de parler, merci de lire la charte des commentaires.

Utiliser le tag [php][/php] pour ajouter du code ou utilisez un service comme pastebin.com.
Cibler un commentateur avec un "@", merci à Mention Comments Authors !