web-dev-qa-db-fra.com

Comment utiliser get_template_part ()?

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

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

25
Amit Erandole

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é telle qu’elle s’applique aux sélecteurs CSS. Lorsque vous concevez quelque chose, vous voulez commencer avec le minimum de spécificité, de sorte qu'il puisse être facilement remplacé dans les parties d'une conception qui nécessitent une attention particulière.

Ainsi, par exemple, vous stylisez un blog et créez un fichier loop.php qui fonctionne bien pour le balisage des publications. Mais vous planifiez à l'avance et vous l'appelez ultérieurement 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'archivage, vous appelez get_template_part( 'loop', 'archive' );, etc. . Cela facilite la tâche lorsque vous décidez de marquer différemment la boucle de vos pages d’archives par rapport à la page d’accueil: il suffit de créer un modèle loop-archive.php qui sera utilisé plutôt que le générique loop.php .

Mais la magie derrière get_template_part() réside dans la fonction locate_template(), qui vérifie d’abord le répertoire theme, 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, j'ai défini un type de publication personnalisé et créé un fichier de modèle de boucle pour ce type de publication personnalisé dans le répertoire de mon plugin. Mais ... je veux permettre aux thèmes utilisant mon plugin de remplacer mon balisage s'ils le souhaitent. C'est là que locate_template() fonctionne vraiment à merveille.

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

cherchera chacun des noms dans le tableau $ template_names dans le répertoire stylesheet, puis dans le répertoire template. Passer 'true' en tant qu'argument $ load signifie qu'il aura require le premier fichier trouvé et qu'il retournera une chaîne vide si aucun fichier de modèle n'a été localisé. Donc, je peux faire quelque chose comme ça dans mon plugin:

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

... qui devrait permettre aux développeurs de thèmes de personnaliser mon plugin très facilement, simplement en incluant un fichier appelé loop-mycustomposttype.php dans leur thème.

23
goldenapples

Pas toutes les boucles, la boucle principale. ;-) Peu importe si vous regardez votre page de garde ou une catégorie ou ce que vous savez, vous aurez toujours une boucle principale. Le contenu de cette boucle principale est déterminé par la requête exécutée before votre modèle a été appelé.

Le modèle loop.php parcourt simplement les éléments de la boucle et les formate. Voir la documentation du Codex .

Si vous regardez le fichier loop.php de Twenty-Ten, vous pouvez voir que Twenty-Ten diversifie alors au sein de ce fichier modèle unique.

get_template_part() charge simplement un élément de modèle et le parcourt. Vous pouvez également extraire des parties de votre fichier loop.php dans des fichiers séparés et les remplacer par un appel get_template_part('loop', 'category') et ainsi de suite.

Vous pouvez également avoir un modèle de partie pour chaque publication individuelle dans la boucle et demander à votre loop.php uniquement d'appeler get_template_part('loop','post'); dans la clause while.... Tout dépend de toi.

5
wyrfel

À partir du codex get_template_part :

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

fera un PHP require () pour le premier fichier existant ...

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

Update : Il existe une légère différence entre "require" - Elle est encapsulée dans une fonction. Vous devez donc global si vous souhaitez transmettre des variables de votre modèle à votre partie de modèle.

3
icc97