Comment inclure un fichier en utilisant get_template_part () dans un plugin?
3 réponses
- votes
-
- 2013-11-28
get_template_part
est unefonction thème . Vousne pouvezpas charger lesfichiers deplug-in avec cettefonction. Jetez un œil à la sourceet vous remarquerez que letravailesteffectuéparlocate_template
. Regardez cette source et vous verrez qu'il se chargetoujours àpartir des répertoires theme .Même si vous voudrezpeut-être utiliser
get_template_part
,cen'estpas labonnefonction.Vous devrez
include
vosfichiers.La raison,me semble-t-il,pour
get_template_part
est depermettre l'extension desthèmes - c'est-à-direpourfaciliter la création dethèmesenfants. Lespluginsne sontpas destinés à être étendus de cettemanière,iln'y a doncpasbesoin deget_template_part
ou detout autre équivalent deplugin.get_template_part
is a theme function. You can't load plugin files with that function. Take a look at the source and you will notice the work is done bylocate_template
. Look at that source and you will see that it always loads from theme directories.However much you may want to use
get_template_part
it is the wrong function.You will need to
include
your files.The reason, so it seems to me, for
get_template_part
is to allow themes to be extended-- aka, to ease the creation of child themes. Plugins are not intended to be extended in that way so there is no need forget_template_part
or for any plugin equivalent. -
- 2015-06-24
@s_ha_dum a raison de dire que
get_template_part
est unefonction dethème,maisil atort de dire que lespluginsne sontpas destinés à être étendus de cettemanière.C'est simplementplus compliqué.Cemessage de Pippin,décrit comment utiliser unefonction quifera letravail de chargement de vosmodèles deplugins,touten permettant aux utilisateurs de remplacer vosmodèles deplugins dans leurthème.
Essentiellement,il regarde dans un dossier spécial duthème,puis s'iln'yestpastrouvé,il regarde dans le dossier desmodèlespour leplugin.
@s_ha_dum is correct that
get_template_part
is a theme function, but he is incorrect that plugins are not intended to be extended in this way. It is simply more complicated.This post by Pippin, describes how to use a function that will do the work of loading your plugin templates, while allowing users to override your plugin templates within their theme .
Essentially, it looks in a special folder in the theme, then if not found there, it looks within the templates folder for the plugin.
-
- 2017-05-07
Commeindiquéprécédemment,vousne pouvezpas utiliser
get_template_part
dans lesplugins,maisilexiste un classepratique sur Github (crééepar Gary Jones) quiimite lafonctionnalitéget_template_part
desplugins,en ajoutant leplugin auplugin de secours (thèmeenfant>thèmeparent>plugin).De cettemanière,vouspouvez remplacer la "partie demodèle" de votreplugin dans unthèmeenfant ou unthèmeparent.
Utilisation (tirée desinstructions du dépôt Github):
- Copiez
class-gamajo-template-loader.php
dans votreplugin. Celapeut être dans unfichier à la racine duplugin,oumieux,dans un répertoire d'inclusion. - Créez unnouveaufichier,tel que
class-your-plugin-template-loader.php
,dans lemême répertoire. - Créez une
class
dans cefichier qui étendGamajo_Template_Loader
. - Remplacez lespropriétés de la classeen fonction de votreplugin. Vouspouvez également remplacer laméthode
get_templates_dir()
siellene vous convientpas. - Vouspouvezmaintenantinstancier votre classe de chargeur demodèlepersonnaliséet l'utiliserpour appeler laméthode
get_template_part()
. Ilpeut s'agir d'un rappel de code court ou de quelque chose que les développeurs dethèmes doiventinclure dans leursfichiers.
Exemple de code:
// Template loader instantiated elsewhere, such as the main plugin file. $meal_planner_template_loader = new Meal_Planner_Template_Loader; // Use it to call the get_template_part() method. This could be within // a shortcode callback, or something you want theme developers // to include in their files. $meal_planner_template_loader->get_template_part( 'recipe' ); // If you want to pass data to the template, call the set_template_data() // method with an array before calling get_template_part(). // set_template_data() returns the loader object to allow for method chaining. $data = array( 'foo' => 'bar', 'baz' => 'boom' ); $meal_planner_template_loader ->set_template_data( $data ); ->get_template_part( 'recipe' ); // The value of bar is now available inside the recipe template as $data->foo. // If you wish to use a different variable name, add a second parameter // to set_template_data(): $data = array( 'foo' => 'bar', 'baz' => 'boom' ); $meal_planner_template_loader ->set_template_data( $data, 'context' ) ->get_template_part( 'recipe', 'ingredients' ); // The value of bar is now available inside the recipe template as $context->foo.
As was said before, you can't use
get_template_part
in plugins, but there's a handy class on Github (created by Gary Jones) that mimics theget_template_part
functionality in plugins, adding the plugin to the fallback (child theme > parent theme > plugin).In this way, you can override your plugin’s ”template part“ inside a child theme or a parent theme.
Usage (taken from the Github repo instructions):
- Copy
class-gamajo-template-loader.php
into your plugin. It can be into a file in the plugin root, or better, an includes directory. - Create a new file, such as
class-your-plugin-template-loader.php
, in the same directory. - Create a
class
in that file that extendsGamajo_Template_Loader
. - Override the class properties to suit your plugin. You could also override the
get_templates_dir()
method if it isn't right for you. - You can now instantiate your custom template loader class, and use it to call the
get_template_part()
method. This could be within a shortcode callback, or something you want theme developers to include in their files.
Example code:
// Template loader instantiated elsewhere, such as the main plugin file. $meal_planner_template_loader = new Meal_Planner_Template_Loader; // Use it to call the get_template_part() method. This could be within // a shortcode callback, or something you want theme developers // to include in their files. $meal_planner_template_loader->get_template_part( 'recipe' ); // If you want to pass data to the template, call the set_template_data() // method with an array before calling get_template_part(). // set_template_data() returns the loader object to allow for method chaining. $data = array( 'foo' => 'bar', 'baz' => 'boom' ); $meal_planner_template_loader ->set_template_data( $data ); ->get_template_part( 'recipe' ); // The value of bar is now available inside the recipe template as $data->foo. // If you wish to use a different variable name, add a second parameter // to set_template_data(): $data = array( 'foo' => 'bar', 'baz' => 'boom' ); $meal_planner_template_loader ->set_template_data( $data, 'context' ) ->get_template_part( 'recipe', 'ingredients' ); // The value of bar is now available inside the recipe template as $context->foo.
Une questiontrès simplepeut être,maisj'ai dumal. Dans le développement dethèmes,j'aitravailléplusieursfois avec
get_template_part()
et je comprends sesbases. Mais quandje développe unplugin,je me suis demandé de l'utiliseren memontrant quelqueserreurs:et
La recherche sur Google duproblème amontré un correctif d'assistance:
get_template_part()
dans unplugin - Assistance WordPressMais cela semble une énorme solution de contournement -j'en doute. Jepense que celane devraitpas êtretrès compliqué. J'ai vérifié cette réponse WPSE et j'aitrouvé cette ligne de code:
Oùil y a unefonction PHP
include()
. Selonmes connaissances WordPress,j'ai appris àpréférerget_template_part()
à PHPinclude()
. Alors commentexactementje peux utiliser un simpleget_template_part()
dansmonplugin.Jen'utilise aucuneboucle ou quelque chose dugenre,je sépare simplement (ou vouspouvez dire organiser) le code demonpluginen différentsfichiers afin que dans certains cas,je les commente simplementpour les déposer là oùilsne sontpasnécessaires . J'aiessayé:
et après l'erreur,l'a changéen:
Mais vous savez que cen'estpas leproblème. Je suis sur un serveur local,j'utilise WAMP.