Comment utiliser get_template_part ()?

25

Quelqu'un pourrait-il m'expliquer comment fonctionne cette fonction? Je sais ce que cela fait mais quand je regarde le code source dans le modèle de vingt_ten, je ne comprends pas comment toutes les boucles sont collectées dans un seul loop.php (j'ai vu ce fichier aussi).

Alors, par exemple, comment supprimer une certaine partie commune du modèle et la réutiliser dans d'autres modèles?

Amit Erandole
la source

Réponses:

25

Quelques très bonnes réponses introductives ici.

Fondamentalement, get_template_part()permet aux développeurs de thèmes de définir un ordre de spécificité des fichiers de modèle. Pensez-y de manière similaire à la spécificité car elle s'applique aux sélecteurs CSS. Lorsque vous concevez quelque chose, vous voulez commencer avec le strict minimum de spécificité, afin qu'il puisse être facilement remplacé dans les parties d'une conception qui nécessitent une attention individuelle.

Ainsi, par exemple, vous créez un blog et vous créez un fichier loop.php qui fonctionne bien pour baliser les articles. Mais vous planifiez à l'avance et vous l'appelez plus tard dans vos fichiers de modèle avec des spécificateurs de contexte supplémentaires - par exemple, sur la page d'index, vous appelez get_template_part( 'loop', 'index' );, sur le modèle unique, vous appelez get_template_part( 'loop', 'single' );, sur les pages d'archives, vous appelez get_template_part( 'loop', 'archive' );, etc. Cela facilite la tâche lorsque vous décidez de baliser la boucle sur vos pages d'archives différemment de la page d'accueil: créez simplement un modèle loop-archive.php et il sera utilisé plutôt que le loop.php générique .

Mais la magie derrière get_template_part()est dans la fonction locate_template(), qui vérifie d'abord le répertoire du thème, puis le répertoire parent (s'il en existe un) pour le fichier nommé. Ceci est très utile pour le développement de plugins. Dans l'un de mes plugins, je définis un type de publication personnalisé et j'ai créé un fichier de modèle de boucle pour ce type de publication personnalisé dans mon répertoire de plugins. Mais ... je veux autoriser les thèmes utilisant mon plugin à remplacer mon balisage s'ils le souhaitent. C'est là que locate_template()ça fait vraiment des merveilles.

locate_template($template_names, $load = false, $require_once = true )

recherchera chacun des noms dans le tableau $ template_names dans le répertoire des feuilles de style, puis dans le répertoire des modèles. Passant « vrai » comme le moyen d'arguments de charge de $ qu'il exiger le premier fichier trouvé, et renverra une chaîne vide si aucun fichier de modèle a été localisé. Je peux donc faire quelque chose comme ça dans mon plugin:

if ( '' === locate_template( 'loop-mycustomposttype.php', true, false ) )
    include( 'loop-mycustomposttype.php' );

... ce qui devrait, je l'espère, faciliter la tâche des développeurs de thèmes pour personnaliser mon plugin simplement en incluant un fichier appelé loop-mycustomposttype.php dans leur thème.

pommes dorées
la source
2
Remplacez Locate_template par ceci, s'il vous plaît. include(locate_template( 'loop-mycustomposttype.php')) De cette façon, il est possible de passer des variables. J'ai trouvé ce lien ici . C'est extrêmement utile!
Pablo SG Pacheco
1
Ce faisant, il sera nécessaire de changer cela si aussi. Comme çaif ( false === include(locate_template( 'loop-mycustomposttype.php')) )
Pablo SG Pacheco
1
Oh, bon point. Avec la formule que j'ai donnée, l' appel requireor require_once(from locate_template) est à l'intérieur d'une fonction et n'a donc pas accès à la portée actuelle.
goldenapples
5

Pas toutes les boucles, la boucle principale. ;-) Peu importe si vous regardez votre page d'accueil ou une catégorie ou qui sait quoi, vous aurez toujours une boucle principale. Le contenu de cette boucle principale est déterminé par la requête qui a été exécutée avant que votre modèle ne soit appelé du tout.

Le modèle loop.php s'exécute simplement sur les éléments de la boucle et les formate. Voir la documentation sur le Codex .

Si vous regardez le loop.php de Twenty-Ten, vous pouvez voir que Twenty-Ten se diversifie ensuite dans ce fichier de modèle unique.

get_template_part()charge simplement une partie de modèle et la parcourt. Vous pouvez tout aussi bien extraire des parties de votre loop.php dans des fichiers séparés et les remplacer par des get_template_part('loop', 'category')appels a et ainsi de suite.

Ou vous pouvez avoir un modèle de partie pour chaque article individuel dans la boucle et avoir votre appel loop.php uniquement get_template_part('loop','post');dans la while...clause. Tout dépend de toi.

wyrfel
la source
3

A partir du codex get_template_part :

<?php get_template_part( 'loop', 'index' ); ?>

fera un PHP require () pour le premier fichier qui existe ...

Donc, cela fonctionnera comme si vous aviez besoin d'un autre fichier php.

Mise à jour : Il y a une légère différence à «exiger» - Il est enveloppé dans une fonction, vous devez donc globalsi vous voulez passer des variables de votre modèle à votre partie de modèle.

icc97
la source