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


13

Une question très simple peut être, mais je me bats. Dans le développement de thèmes, j'ai travaillé get_template_part()plusieurs fois et j'en comprends les bases. Mais quand je développe un plugin, je me suis demandé de l'utiliser en me montrant quelques erreurs:

Remarque: Utilisation de la constante STYLESHEETPATH ​​non définie - supposé «STYLESHEETPATH» à la ...\wp-includes\template.phpligne 407

et

Remarque: utilisation de la constante TEMPLATEPATH non définie - supposé «TEMPLATEPATH» ...\wp-includes\template.phpsur 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 très compliqué. J'ai vérifié cette réponse WPSE et trouvé cette ligne de code:

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

Où il y a une include()fonction PHP . Selon mes connaissances WordPress, j'ai appris à préférer get_template_part()PHP include(). Alors comment exactement je peux utiliser un simple get_template_part()dans mon plugin.

Je n'utilise pas de boucle ou quelque chose, je sépare juste (ou vous pouvez dire organiser) mon code de plugin dans 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' );

puis après l'erreur, changez-le en:

get_template_part( 'my', 'specialadmin' );

Mais vous savez que ce n'est pas le problème. Je suis sur un serveur local, en utilisant WAMP.

Réponses:


11

get_template_partest une fonction thématique . Vous ne pouvez pas charger des fichiers de plugin avec cette fonction. Jetez un œil à la source et vous remarquerez que le travail est effectué par locate_template. Regardez cette source et vous verrez qu'elle se charge toujours à partir des répertoires de thèmes .

Cependant, vous voudrez peut-être l'utiliser, get_template_partc'est la mauvaise fonction.

Vous aurez besoin de includevos fichiers.

La raison, me semble-t-il, get_template_partest de permettre l'extension des thèmes, c'est-à-dire de faciliter la création de thèmes enfants. Les plugins ne sont pas destinés à être étendus de cette manière, il n'y a donc pas besoin get_template_partni d'aucun équivalent de plugin.


6

@s_ha_dum est correct, c'est get_template_partune fonction de thème, mais il est incorrect que les plugins ne soient pas destinés à être étendus de cette façon. C'est tout simplement plus compliqué.

Ce post de Pippin, décrit comment utiliser une fonction qui fera le travail de chargement de vos modèles de plugins, tout en permettant aux utilisateurs de remplacer vos modèles de plugins dans leur thème.

Essentiellement, il regarde dans un dossier spécial du thème, puis s'il n'y est pas trouvé, il regarde dans le dossier des modèles pour le plugin.


4

Comme cela a été dit précédemment, vous ne pouvez pas l'utiliser get_template_partdans les plugins, mais il y a une classe pratique sur Github (créée par Gary Jones) qui imite la get_template_partfonctionnalité des plugins, ajoutant le plugin à la solution de repli (thème enfant> thème parent> plugin).

De cette façon, vous pouvez remplacer la «partie modèle» de votre plugin dans un thème enfant ou un thème parent.

Utilisation (tirée des instructions de dépôt Github):

  1. Copiez class-gamajo-template-loader.phpdans votre plugin. Il peut être dans un fichier à la racine du plugin, ou mieux, 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 classdans ce fichier qui s'étend Gamajo_Template_Loader.
  4. Remplacez les propriétés de classe en fonction de votre plugin. Vous pouvez également remplacer la get_templates_dir()méthode si elle ne vous convient pas.
  5. Vous pouvez maintenant instancier votre classe de chargeur de modèles personnalisés et l'utiliser pour appeler la get_template_part()méthode. Cela pourrait être dans un rappel de shortcode, ou quelque chose que vous souhaitez que les développeurs de thèmes incluent 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.
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.