theme_page_templates : Le hook de la semaine n°16

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 !


Réagir à cet article

120 caractères maximum