web-dev-qa-db-fra.com

Comment inclure un fichier en utilisant get_template_part () dans un plugin?

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.

9
Mayeenul Islam

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.

8
s_ha_dum

@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.

5
benklocek

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):

  1. Copiez 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.
  2. Créez un nouveau fichier, tel que class-your-plugin-template-loader.php, dans le même répertoire.
  3. Créez un class dans ce fichier qui étend Gamajo_Template_Loader.
  4. Remplacez les propriétés de la classe en fonction de votre plugin. Vous pouvez également remplacer la méthode get_templates_dir() si elle ne vous convient pas.
  5. Vous pouvez maintenant instancier votre classe de chargeur de modèles personnalisée et l'utiliser pour appeler la méthode 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.
1
Marcio Duarte