Une question très simple peut-être, mais je me bats. En développement de thèmes, j'ai travaillé plusieurs fois avec get_template_part()
et je comprends ses bases. Mais lorsque je développais un plugin, je me demandais de l'utiliser en me montrant des erreurs:
Remarque: Utilisation de la constante non définie STYLESHEETPATH - supposée 'STYLESHEETPATH' dans
...\wp-includes\template.php
à la ligne 407
et
Remarque: Utilisation de la constante non définie TEMPLATEPATH - supposée 'TEMPLATEPATH' dans
...\wp-includes\template.php
à la ligne 410
Googler le problème a montré un correctif de support:
Mais cela semble une solution de contournement énorme - j'en doute. Je pense que cela ne devrait pas être trop compliqué. J'ai vérifié ceci Réponse de WPSE et trouvé cette ligne de code:
if ( '' === locate_template( 'loop-mycustomposttype.php', true, false ) )
include( 'loop-mycustomposttype.php' );
Où il y a une fonction PHP include()
. D'après mes connaissances sur WordPress, j'ai appris à préférer get_template_part()
à PHP include()
. Alors comment exactement je peux utiliser une simple get_template_part()
dans mon plugin.
Je n'utilise pas de boucle ou quelque chose, je sépare (ou vous organisez peut-être) mon code de plug-in en différents fichiers afin que, dans certains cas, je les commente simplement pour les supprimer là où ils ne sont pas nécessaires. J'ai essayé:
get_template_part( 'my', 'special-admin' );
et après l'erreur, l'a modifiée en:
get_template_part( 'my', 'specialadmin' );
Mais vous savez que ce n'est pas le problème. Je suis sur le serveur local, en utilisant WAMP.
get_template_part
est un theme fonction. Vous ne pouvez pas charger de plug-in avec cette fonction. Regardez la source et vous remarquerez que le travail est fait par locate_template
. Regardez cette source et vous verrez qu'elle se charge toujours à partir des répertoires theme .
Cependant, autant que vous souhaitiez utiliser get_template_part
, c'est la mauvaise fonction.
Vous devrez include
vos fichiers.
La raison, semble-t-il, de get_template_part
est de permettre l’extension des thèmes - c’est-à-dire, de faciliter la création de thèmes enfants. Les plugins ne sont pas conçus pour être étendus de cette manière, il n'y a donc pas besoin de get_template_part
ni de plug-in équivalent.
@s_ha_dum a raison de dire que get_template_part
est une fonction de thème, mais il est faux de dire que les plugins ne sont pas conçus pour être étendus de cette manière. C'est simplement plus compliqué.
Cet article de Pippin explique comment utiliser une fonction permettant de charger vos modèles de plug-in, tout en permettant aux utilisateurs de remplacer ceux-ci dans leur thème.
Essentiellement, il recherche dans un dossier spécial du thème, puis s’il ne figure pas dans le dossier des modèles du plug-in.
Comme cela a été dit précédemment, vous ne pouvez pas utiliser get_template_part
dans les plugins, mais il existe une classe handy class sur Github (créée par Gary Jones) qui imite la fonctionnalité get_template_part
dans les plugins, en ajoutant le plugin à la solution de secours (thème enfant> parent thème> plugin).
De cette manière, vous pouvez remplacer le "composant de modèle" de votre plugin dans un thème enfant ou un thème parent.
Utilisation (extraite des instructions de dépôt Github):
class-gamajo-template-loader.php
dans votre plugin. Cela peut être dans un fichier à la racine du plugin, ou mieux, dans un répertoire includes.class-your-plugin-template-loader.php
, dans le même répertoire.class
dans ce fichier qui étend Gamajo_Template_Loader
.get_templates_dir()
si elle ne vous convient pas.get_template_part()
. Cela peut être dans un rappel de shortcode ou quelque chose que les développeurs de thèmes doivent inclure dans leurs fichiers.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.