Ceux qui modifient, créent ou optimisent les thèmes de WordPress ont déjà rencontré ces deux fonctions : Get_Template_Part et Include. Elles servent toutes les deux à inclure un autre contenu dans votre page. On pourrait également y ajouter vos propres fonctions, puisqu'elles peuvent également rajouter du contenu dans vos articles.
La question, c'est de savoir quelle méthode utiliser pour optimiser au maximum le temps de chargement de votre thème WordPress.
Commençons tout d'abord à présenter les 3 méthodes avant de montrer les résultats.
Get_Template_Part
La fonction Get_Template_Part fait partie intégrante de WordPress, et permet d'intégrer dans plusieurs types de page un même contenu.
Pour le header, le footer ou les éventuelles sidebar, il existe d'autres fonctions pour les appeler directement. Mais imaginons que vous avez créé un bloc de contenu commun à plusieurs types de pages. Vous allez pouvoir appeler depuis celles-ci un fichier de template. L'idée, c'est de gagner du temps pour la mise à jour et l'évolution de cet élément.
Voici la syntaxe de la fonction Get_Template_Part de WordPress :
<?php get_template_part('nom-du-template');?>
Il est également possible de complexifier l'appel en ajoutant un type de template en fonction de la page appelante. On appelera alors un fichier sous la forme {slug}-{name}.php.
Par exemple, j'appelle le fichier monloop depuis la page d'accueil de mon blog WordPress. Mon fichier template s'appelera monloop-index.php, et j'utiliserai le code pour l'insérer :
<?php get_template_part('monloop', 'index');?>
De même pour l'utilisation d'un élément de template seomix-is-good depuis vos pages d'articles. Cela donnerait un fichier seomix-is-good-single.php et le code d'appel suivant :
<?php get_template_part('seomix-is-good', 'single');?>
Documentation complète : Get_Template_Part
Include
La fonction Include n'est pas propre à WordPress, mais à PHP. Dans les anciens thèmes du CMS, on la retrouverait presque systématiquement quand on voulait inclure un même contenu dans plusieurs types de template.
Voici la syntaxe de la fonction Include :
<?php include (TEMPLATEPATH . "/mon-fichier.php"); ?>
Cela permettait donc d'inclure le contenu du template mon-fichier.php dans la page en cours. Libre à vous ensuite de mettre le contenu de votre choix dans ce fichier.
Documentation complète : Php Include
Votre fonction WordPress
Pour terminer, il est possible de créer sa propre fonction qui va ajouter du contenu dans vos pages.
Pour créer une fonction, il faut modifier le fichier functions.php de votre thème WordPress. Vous allez pouvoir ainsi créer une fonction simple qui va afficher un contenu, en vous basant sur cette syntaxe :
function nom-de-ma-fonction () {
echo 'montexte';
}
Pour afficher une simple ligne de contenu, ce code deviendrait alors :
function affichemoncontenu () {
echo "Ma super phrase de contenu";
}
Dans les fichiers de votre thème, il suffira ensuite de copier/coller le code d'appel de la fonction pour faire apparaître votre contenu là où vous le souhaitez :
<?php if (function_exists('affichemoncontenu')) affichemoncontenu();?>
Et le tour est joué : vous avez créé votre fonction WordPress pour ajouter un contenu dans les différentes pages de votre bog.
Résultats du test
Le test mis en place pour tester ces différentes fonctionnalités de WordPress est simple : j'ai pris une page d'un blog que je gère et qui possède par défaut 10 articles différents en page d'accueil. J'ai testé l'insertion d'un contenu statique relativement long de 16000 caractères, avec 40 images (4 images répétées 10 fois). Pour mesure le temps de chargement, j'ai utilisé l'outil Webwait pour charger 100 fois la page pour chaque méthode, chaque chargement étant espacé de 2 secondes.
Attention, comme tout test de ce type, il est soumis à trois variables que l'on ne peut maîtriser totalement, et qui peuvent fausser partiellement les résultats obtenus :
- La connexion Internet de l'endroit du test.
- La surcharge du réseau sur cette même connexion.
- La surcharge variable du serveur sur lequel est le site Internet.
Comme le montre le graphique, c'est le fichier functions.php de WordPress qui l'emporte :
Voici les mêmes résultats sous forme de tableau :
Méthode utilisée |
Moyenne |
Max | Min |
Sans contenu ajouté | 2,69 | 4,32 | 2,34 |
Fonction | 2,89 | 5,72 | 2,47 |
Include | 3,10 | 8,16 | 2,70 |
Template_part | 3,06 | 7,40 | 2,51 |
Comme on peut le constater, une fonction personnalisée sera la meilleure méthode pour ajouter du contenu statique dans votre thème: elle bat à plate couture la fonction include ou les get_template_part de WordPress. Cela provient sans doute du fait que le fichier functions.php est forcément chargé par votre thème, et qu'il mettra donc moins longtemps à s' exécuter plutôt que de charger un autre fichier de template.
Mais les fonctions personnalisées de WordPress ne restent utiles que pour du contenu simple ou statique. Si certains éléments de votre thème font appel à des loops personnalisés par exemple, ou à des requêtes SQL complexes, je vais quand même vous conseiller l'utilisation du Get_Template_Part qui sera plus simple à coder et à implanter, surtout si votre fichier functions est déjà long.
22 Commentaires
Merci pour ce test, c'est effectivement très intéressant comme retour. Et j'avoue que je ne m'attendais pas à voir l'include aussi mauvais par rapport au fichier functions.php. Cela dit, comme tu l'indiques, ca reste logique puisqu'il est chargé systématiquement.
Je doute qu'il y ait réellement une différence de performances entre ces différentes méthodes.
Pour moi la grande différence entre le INCLUDE et le GET_TEMPLATE_PART c'est la portée des variables PHP.
Dans un include, on conserve les variables PHP utilisées dans le fichier parent, alors qu'avec la fonction de WordPress, il faut faire un global PHP.
Merci Daniel pour ces tests, j'en veux encore !!
Je suis d'accord avec Amaury et j'ajouterai que l'utilisation du code "pur WordPress" est parfois préféré et demandé par des clients pour que la future maintenance du code soit plus simple si elle est faite par des dev WP.
Aussi je vous dirait d'éviter de faire un include non sécure comme :
include( $_GET['monfichier'] );
Bonne journée !
Dis, pour le INCLUDE, as-tu mis le lien en relatif ou absolu ? Car il semblerait qu'en absolu les performances soient meilleures, aurais-tu la possibilité de tester en absolu si ce n'était pas le cas ? Merci
Mon test était en relatif, car les thèmes le sont toujours (sinon ils seraient incompatibles avec les autres sites).
Je verrais si j'ai le temps pour refaire le test.
Non tu peux faire de l'absolu avec de la compatibilité en utilisant les DEFINE de WP et autres dirname/etc
Julio > S'il utilise la constante TEMPLATEPATH, alors c'est un chemin absolu fourni par WP !
Voilà c'est elle dont je parlais. Merci Amaury
Merci Daniel pour ce test très intéressant :)
Je suis surpris que get_template_part soit plus performant que include (ok, ça se joue à très peu de choses).
À mon avis, c'est juste de la micro-optimisation qui, dans la plus part des cas, ne sert pas à grand chose.
Les tests seraient plus fiables s'ils auraient été faits en local. Les résultats sont incohérents -- en théorie get_template_part devrait être le plus lent.
@Alex, @Screenfeed,
Effectivement ces tests ne prouvent rien. get_template_part déroule plus de code et se termine par un 'require' ...
Je suis surpris du résultat du test. En "théorie" la fonction de WordPress devrait être moins performante qu'un simple include puisqu'il y a moins de traitement.
Arena mentionne que get_template_part termine par un require, cela veut peut être dire qu'un require est plus performant qu'un include.
La différence entre un include et un require c'est que si le fichier à inclure n'est pas trouvé, un simple warning apparait, mais avec un require, si ce fichier n'existe pas, le script s'arrête.
Je ne connaissais pas la fonction get_template_part, , merci pour ces précisions ! J'ai cependant du mal à comprendre à quoi correspondent les variables entre parenthèses. J'ai dans mon fichier page.php la ligne suivante :
Je souhaite apporter des modifications au niveau des balises des pages, mais je ne trouve pas où elles sont générées, il n'y a qu'un fichier loop.php et il ne semble pas concerner les pages...
Je suis d'accord avec certains ici : les tests effectués peuvent êtres très aléatoires.
Moi par exemple, quand je teste une page donnée de mon site, les tests peuvent donner un résultat de performance temps du simple au double, pour un écart de quelques secondes seulement entre deux tests. La page étant toujours la même, sans modifications.
@Olivier : tout à fait d'accord avec toi. Ce genre de test peut subir de nombreuses variations qui dépendent des facteurs externes à l'élément testé. C'est d'ailleurs pour cela que chaque méthode a été testé 100 fois pour réduire la marge d'erreur.
C'est vrai Daniel, en faisant une moyenne je pense que l'on peut quand même se faire une idée. Mais ça reste un peu aléatoire...
À ce propos : j'ai retiré de mon fichier functions.php - temporairement j'espère - ton excellent script sur les menus. Il me faisait perdre au moins deux ou trois secondes dans la génération d'une page (et pourtant j'utilise WP super cache, mais pas à fond il est vrai...). Et cela est vrai pour la plupart des scripts que je met dans ce fichier. Je me demande si j'ai bien configuré mon truc (j'ai créé mon thème moi-même)...
Tiens, bizarre que tu rencontres ce problème. Il faudra que je regarde mon code de plus près pour voir d'où peut venir le souci.
J'ai bien aimé le benchmark, même s'il aurait effectivement eu plus de sens effectué en local pour éviter les variations dues entre autre à la bande passante. Par contre, j'ai eu l'occasion de tester un thème où get_template_part était omniprésent, ce qui m'amène à faire quelques remarques par rapport à l'article et aux commentaires :
- à utiliser un framework, il est préférable d'utiliser l'ensemble du framework pour optimiser développement et maintenance que de créer des fonctions personnalisées, qui éventuellement créeront des conflits lors de la mise à jour de WordPress
- il est inutile d'utiliser get_template_part si la part récupérée est dédiée au fichier appelant, çà n'a de sens que s'il est possible d'appeler divers types de contenu par exemple à partir d'un même template.
- découlant de la 2e remarque, il est préférable de revoir (si possible) la hiérarchie des templates plutôt que de créer des
. On y gagnera en performances et en lisibilité.
Je suis en train de recoder mon thème avec ces principes mais j'ai la très désagréable impression que le nombre de requêtes SQL par page est en train d'exploser à cause de ca (j'ai de plus nombreux loop personnalisés)
Est-ce à priori lié ou bien ça n'a rien à voir ?
Théoriquement, cela n'a rien à voir car ses fonctions ne font pas de requêtes SQL : il faut plutôt regarder du côté de tes loops personnalisés.
merci pour cette présentation facile qui nous permet d'ajouter autant de chose a notre blog, la fonction include est trés exhaustive mais a ceux qui comprennent bien wordpress et sa hiérarchie
Laisser un commentaire