Un hook pour get_template_part ?

Je voulais appeler ce post « Should i get or should i show ? » .. mais pas top pour le SEO 😉

La fonctionnalité que je préfère dans WordPress, c’est bien la possibilité d’utiliser des hooks (ceux du core ou les nôtres).

Peu de thèmes utilisent cette notion, ou alors assez mal, car mal/pas documentée, ce qui enlève beaucoup de sa puissance (il faut dire que la plupart des thèmes ont une cible « end user » et n’ont pas vocation à être modifiés.. ou alors par le dev lui même..).

Si le Codex est votre livre de chevet, vous connaissez certainement la fonction  get_template_part() , qui permet de diviser votre thème en morceaux, pour le rendre plus lisible et modulable.

Il y a quelques temps, sur un projet, je voulais afficher une partie de template de manière conditionnelle. Comme d’habitude, pour facilité le travail de l’intégrateur, j’ai commencé à chercher une solution avec des hooks (ce qui permet de déplacer la partie fonctionnelle dans un plugin).

Problème : malgré son nom qui pourrait le laisser penser (avec un préfixe en « get »), la fonction get_template_part() ne renvoi aucune valeur, elle affiche directement le résultat dans le navigateur !

Il devient donc impossible de filtrer ce résultat 🙁

Enfin, impossible.. c’est ce que je croyais jusqu’à il y a quelques jours… lorsque j’ai lu un article à propos de la « bufferisation » avec PHP : « Understanding PHP Output Buffering, and Why It’s Great for Shortcodes« .

Le déclic n’a pas été immédiat, mais c’est exactement ce qu’il me faut pour mon hook ! 🙂

Au niveau de mon template, je place un buffer avec un filtre:

ob_start();

get_template_part( 'template-parts/loop', 'index' );

$tpl = apply_filters('the_tpl', ob_get_clean());

echo $tpl;

 

et dans mon plugin:

add_filter( 'the_tpl', function( $tpl ) {

// treatments

//

return $tpl;

} );

 
Pas mal non ?

Loading Facebook Comments ...

0 comments on “Un hook pour get_template_part ?Add yours →

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *