get_template_part ou la réutilisation de code dans WordPress

Article publié par le 8 déc 2011 dans Wordpress | 4 commentaires

get_template_part ou la réutilisation de code dans WordPress

Le contexte

WordPress, comme tous les outils open-source dont l’évolution est due en grande partie à une communauté de développeurs, change à la fois par à-coup et progressivement. Les versions récentes nous offrent des fonctions qui permettent une grosse mutualisation du code que nous réutilisons régulièrement dans la création de nos thèmes. Voici un petit tour d’horizon de ce que nous utilisons à l’agence.

get_template_part()

C’est la plus récente des fonctions autour de la réutilisation des templates : introduite avec la version 3.0 du core, elle offre la possibilité d’inclure simplement une section de code du thème quand on le souhaite. Il y a 2 utilisations principales que nous décrivons ci-dessous.

La section de code auto-porteuse et réutilisée (dans le thème)

Nous parlons ici d’un bout de code html ou php auto-porteur : par exemple une barre de liens images en HTML affichée à plusieurs endroits du thème. Le code suivant fonctionnera :

Dans le fichier appelant :

get_template_part('imagesbar');

Dans le fichier appelé, nommé imagesbar.php :

Le code du fichier appelé sera ainsi ajouté à chaque endroit ou la fonction get_template_part() sera appelée. Un précision importante : la fonction prend 2 paramètres, un nom de fichier principal et un nom de fichier spécifique. Cela vous permet de faire des combinaisons de nommage : get_template_part(‘imagesbar’,'left’) cherchera le fichier imagesbar-left.php.

L’utilisation d’un bout de code à l’intérieur de la boucle (dans le thème)

Il est tout à fait possible de mutualiser du code à l’intérieur de la boucle : le bloc de navigation, les header ou footer d’articles… Et même les variables globales. Tout un monde de code mutualisé, maintenable et clair s’offre à vous. Dans cas, pas de changement dans l’utilisation :

Dans le fichier appelant :

get_template_part('loop');

Dans le fichier appelé, nommé loop.php :

while ( have_posts() ) : the_post();
// your post loop
endwhile;

Un dernier cas se pose avant de passer à la suite : la réutilisation de code à destination de l’admin, ou tout simplement non utilisé dans le thème.

La réutilisation générique d’un bout de code

Pour ce faire, c’est la fonction générique locate_template() qu’il faut utiliser. Je vous renvoie au codex pour son utilisation (simple).

Mais comment inclure un contexte déjà existant?

Se pose un souci dans les cas plus complexes : si avant d’entrer dans la boucle WordPress (ou tout autre boucle), vous avez défini des variables non globales que vous souhaitez réutiliser dans la section de code que vous voulez mutualiser…? Les solutions ci-dessus ne fonctionneront pas. Pourquoi? C’est une histoire de scope… get_template_part() est inclus dans le fichier core general-template.php et fait donc appel dans ce scope-là au fichier que vous lui aurez passé en paramètre. Le fichier sera donc inclus avec une instruction require dans le cas de get_template_part() (ou require_once en fonction du 3ème paramètre que vous aurez passé si vous avez utilisé directement locate_template()), mais tout le contexte du fichier appelant ne sera pas inclus :

Dans le fichier appelant :

$var_test = 34;
get_template_part('loop')

Dans le fichier appelé, nommé loop.php :

$var_test += 2; // $var_test will contain just '2' because it has no idea of the previous initialisation
while ( have_posts() ) : the_post();
// your post loop
endwhile;

La solution est simple : ramener le chargement du fichier mutualisé dans le scope de notre fichier appelant. Pour cela, on fait :

$var_test = 34;
include(locate_template('loop', true, true));

Dans le fichier appelé, nommé loop.php :

$var_test += 2; // $var_test will contain 34 because loop.php has been loaded in calling file scope
while ( have_posts() ) : the_post();
// your post loop
endwhile;

Et voilà ! J’espère que ces astuces vous permettront d’utiliser pleinement les fonctionnalités de mutualisation qu’offrent dorénavant WordPress…

Et vous? Comment vous faisiez avant? Utilisez-vous ces nouvelles fonctions depuis qu’elles sont apparues?

A propos de Nicolas BONNIOT

Titulaire d'un DUT Génie Electrique & Informatique Industrielle et d'un diplôme d'ingénieur généraliste ECAM Rennes, Nicolas a débuté sa carrière dans les systèmes d'information (recette, développement client lourds, flux...) puis s'est spécialisé à présent dans le développement web (boutiques, sites vitrines, CMS...). Un fort intérêt personnel pour l'écologie et l'écriture l'ont rapidement conduit vers le blogging puis la pige magazine, notamment sur l'éco-construction et les énergies renouvelables. Il a par ailleurs toujours voulu garder une pluri-disciplinarité qui s'apparente fortement à la mécatronique : conception mécanique, électronique et informatique pour répondre à des besoins/fonctions d'automatisation simples & complexes.

4 Commentaires

  1. Bonjour Nicolas,
    Je suis débutante et j’essai d’utiliser wordpress et le thème minimatica pour me créer mon portfolio, mais j’ai un petit problème : je voudrais enlever les « posted by… on… filed under… » qu’on trouve en bas de chaque articles, mais je ne parviens pas à trouver la fonctions à supprimer dans les fichiers wordpress ! Peux-tu m’aider s’il te plaît ?! cela fait des heures et des heures que je cherche !! merci beaucoup !
    Justine

    • Bonjour Justine,
      Dans ton cas, il ne va pas s’agir d’une fonction, mais de plusieurs lignes.
      Dans ton cas, voici ce qu’il faut faire :

      1. Tout ce qui concerne l’affichage d’un article se trouve dans single.php. Si tu l’ouvres tu verras que dans ton thème il fait appel à la fonction get_template_part détaillée dans cet article. Il inclut le template loop-single.php
      2. Ouvre loop-single.php : là, tu verras qu’il inclut entre 2 balises
        (les nouvelles balises HTML5) un autre template part, en fonction du type d’article : vidéo, image, gallerie ou audio. Si tu regardes dans ton thème tu verras qu’il y a bien 4 fichiers : content-video.php, content-image.php, content-gallery.php et content-audio.php.
      3. Maintenant, il ne te reste qu’à ouvrir l’un de ces fichiers (ou les 4 si tu souhaites retirer les informations sur tous les types d’articles) et retirer la liste suivante :

      J’espère que ma réponse t’a aidée. N’hésite pas à compléter ta demande si nécessaire !

  2. Bonjour,

    Merci pour vos explications sur cette fonction wp.

    Perso, je l’utilise également dans ce contexte :

    Je travaille les thèmes avec le principe parent/enfant pour pouvoir mettre à jour le parent (« twentyten par exemple).

    Préférant centraliser le code sur index.php et sur loop.php grâce à quelques conditions genre if is_single(), etc. : je supprimais certaines pages (archive.php, category.php, single.php, etc…)

    Problème : lors de la mise à jour du thème parent les pages supprimées reviennent !

    La solution que j’ai trouvé est de mettre dans le thème enfant toutes ces pages (single.php, etc.) vides avec seulement ce bout de code php :

    get_template_part( ‘index’);

    Si vous avez une meilleure solution… n’hésitez pas.
    Merci

    • Bonjour JM,
      Tout d’abord désolé du retard de ma réponse… Concernant votre question, cela me semble un contournement honnête : compte-tenu que vous modifiez la manière dont sont construites les pages dans votre thème enfant, il est normal que vous n’ayez pas une compatibilité lors des mises à jour, puisque le système thème parent/enfant est prévu pour faciliter une surcharge de l’existant, mais pas une réécriture (sauf dans le cas de certains fichiers).

      Après, je pense que la question se situe plus au niveau des bonnes pratiques de construction de pages : faut-il privilégier comme vous le faites une centralisation sur index.php et loop.php? Ou faut-il externaliser dans divers fichiers spécialisés?

      Je n’ai pas encore la réponse mais vous promets un article sur le sujet… ;) .

      En attendant, si vous ne l’avez pas déjà vu, je vous conseille un autre article sur le templating.

Laisser un commentaire

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

Connect with Facebook

*

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>