get_template_part vs action hooks dans les thèmes

15

Il me semble que ces deux options permettent à l'utilisateur final de modifier un thème sans réellement éditer les fichiers de thèmes (via des thèmes enfants).

Ma question est, est une méthode préférée à l'autre.

Par exemple, prenez un thème sur lequel je travaille actuellement. J'essaie de décider s'il faut aller avec des parties de modèle de crochets.

<?php get_template_part('before_sitecontainer' ); ?>
<div id="sitecontainer" class="sitecontainer" <?php //closed in footer ?>>

<?php get_template_part( 'before_topcontainer' ); ?>
<div id="topcontainer ">

    <?php get_template_part( 'before_topedge_navigation' ); ?>
    <?php get_template_part( 'topedge_navigation' ); ?>

    <?php get_template_part( 'before_site_header' ); ?>
    <?php get_template_part( 'site_header' ); ?>

    <?php get_template_part( 'before_second_navigation' ); ?>
    <?php get_template_part( 'second_navigation' ); ?>

    <?php get_template_part( 'after_second_navigation' ); ?>

</div><!-- end topcontainer div -->
<?php get_template_part( 'after_topcontainer' ); ?>

Ce qui précède permet à l'utilisateur du thème de remplacer n'importe quelle section de code existant en créant simplement un fichier nommé de manière appropriée dans son dossier de thème enfant ainsi qu'en ajoutant un nouveau code avant / après chaque section préexistante par la même méthode - le modèle avant / après les fichiers de pièce n'existent pas du tout dans le thème parent et sont là simplement pour leur permettre d'insérer du code - et cette méthode ne nécessite pas qu'ils comprennent les crochets / filtres pour accomplir cela.

Je pourrais bien sûr obtenir le même résultat en utilisant des crochets et des filtres.

Y a-t-il un avantage à utiliser des crochets / filtres à la place? Garder à l'esprit le public cible qui utilisera ceci n'est décidément pas un connaisseur du code. Je peux leur donner des instructions relativement basiques qu'ils peuvent suivre pour utiliser la méthode du modèle, mais ils vont sûrement les confondre avec des crochets.

Ou existe-t-il des situations où l'une serait meilleure que l'autre dans le même thème?

Ashley G
la source

Réponses:

8

Je préfère les crochets, car ils sont plus flexibles: vous pouvez les accrocher à partir de votre thème functions.php fichier , mais aussi depuis des plugins. J'essaie de mettre autant de logique dans les plugins, afin que les thèmes contiennent principalement des trucs de mise en page.

Si vous utilisez un hook d'action, il est toujours possible de l'utiliser get_template_part() dans ce gestionnaire de hook . Cela vous donne le meilleur des deux mondes. Vous pourriez probablement même créer un hook par défaut qui appelleget_template_part() , afin que les personnes qui n'ont pas beaucoup d'expérience avec le codage puissent ajouter des fichiers supplémentaires et que d'autres puissent supprimer ce hook s'ils ne le souhaitent pas.

Concernant les performances: get_template_part()utilise ( enlocate_template() ) file_exists()une, deux ou quatre fois (selon la façon dont vous l'appelez). Il semble file_exists()très rapide et utilise la mise en cache en PHP et peut-être même dans le système d'exploitation. Ce n'est donc probablement pas un problème.

Jan Fabry
la source
Ça a du sens. Une partie de mon objectif de conception a été d'éliminer le besoin de plugins dans la plupart des situations d'utilisation tout en conservant la possibilité de les utiliser avec ceux qui le souhaitent. Mon client cible en sait très peu sur WordPress ou les plugins, n'est pas qualifié pour distinguer les bons plugins des mauvais (la principale faiblesse des plugins IMO) et ne veut pas avoir à gérer la mise à jour et la gestion de plusieurs logiciels. Je dois donc intégrer de nombreuses fonctionnalités directement dans les thèmes afin de fournir ce qu'ils veulent: une solution simple à utiliser, simple à maintenir et à guichet unique.
Ashley G
4

Je dirais que la principale différence est la lisibilité. Si vous voyez plusieurs parties de modèle bien nommées, vous pouvez facilement comprendre ce qui se passe. Si vous voyez juste un crochet, vous devrez parcourir le reste du thème pour déterminer ce qui est attaché au crochet.

Doux Fuzz
la source
1
Oui, cela a du sens et fait partie de ce que j'essayais de réaliser avec l'exemple de code.
Ashley G
4

Il est (relativement) facile de supprimer la fonction du crochet dans le thème enfant, mais beaucoup plus difficile de le faire ignorer le modèle parent indésirable.

Essentiellement, travailler avec des hooks est plus proche du côté PHP et travailler avec des modèles est plus proche du côté HTML. J'utilise le thème parent hybride, qui est très orienté hook. C'est un bonheur jusqu'à ce que vous ayez besoin de vous débarrasser du modèle d'un parent.

Pour les utilisateurs qui ne sont pas technophiles, ce n'est pas une très bonne option. Pourquoi auraient-ils besoin de jouer avec de tels thèmes internes de toute façon?

PS note également des problèmes de performances. Les trucs avec des crochets se produisent en mémoire, les trucs avec des modèles nécessitent beaucoup de recherches sur le disque. Surtout si vous écrivez quelque chose comme dans votre exemple.

PPS n'est pas la préférence de tout le monde ... mais au lieu d'écrire le thème parent à partir de zéro, pourquoi ne pas prendre le thème parent existant et fournir un thème enfant simple à l'utilisateur?

Rarst
la source
Ignorer un modèle parent serait aussi simple que de créer un fichier de modèle vierge pour le remplacer, j'aurais pensé. Beaucoup plus facile que de jouer avec des crochets (et donc PHP) pour l'utilisateur non averti en technologie. Bien que pour quelqu'un avec de l'expérience, les crochets seraient beaucoup plus faciles. Quant à savoir pourquoi, il y a toujours ceux qui veulent personnaliser, vous avez même admis que vous le faisiez. Quant à savoir pourquoi je crée un thème, c'est dans cette direction que je veux emmener mon entreprise. Construire autour de quelqu'un d'autre ne me semble pas très à l'épreuve du temps, également parce que la plupart des thèmes existants de l'OMI laissent beaucoup à désirer. Je pense que je peux faire mieux.
Ashley G
Bons points sur les problèmes de performances. Bien que wordpress ait été conçu pour fonctionner avec get_template_part, j'aurais pensé que ce ne serait pas tant un problème de performances. Quelqu'un a-t-il des repères à ce sujet?
Ashley G
Je vois ce que vous entendez par ignorer une partie de modèle. Pas aussi facile que je le pensais
Ashley G
En fait, c'est aussi simple que de placer un fichier de modèle vierge dans le dossier enfant, à condition qu'il soit à la racine du dossier. Lorsque cela devient difficile, c'est lorsque les fichiers de modèle se trouvent dans les sous-dossiers du dossier de thème parent / enfant
Ashley G
En fait, même les sous-dossiers ne posent aucun problème. Je viens d'avoir le dossier mal nommé (un signe certain que je travaille trop tard LOL). Pour remplacer une partie de modèle, il suffit d'un fichier du même nom dans le même chemin d'accès chez l'enfant que dans le parent
Ashley G