Eine sehr einfache Frage mag sein, aber ich kämpfe. In der Themenentwicklung habe ich viele Male mit get_template_part()
gearbeitet und ich verstehe die Grundlagen. Aber als ich ein Plugin entwickle, habe ich mich gefragt, ob ich es verwenden soll, um mir einige Fehler anzuzeigen:
Hinweis: Verwendung der undefinierten Konstante STYLESHEETPATH - unter der Annahme 'STYLESHEETPATH' in
...\wp-includes\template.php
in Zeile 407
und
Hinweis: Verwendung der undefinierten Konstante TEMPLATEPATH - unter der Annahme 'TEMPLATEPATH' in
...\wp-includes\template.php
in Zeile 410
Beim Googeln des Problems wurde ein Support-Fix angezeigt:
Aber das scheint eine große Umgehung zu sein - ich bezweifle es. Ich denke, das sollte nicht sehr kompliziert sein. Ich habe diese WPSE-Antwort überprüft und diese Codezeile gefunden:
if ( '' === locate_template( 'loop-mycustomposttype.php', true, false ) )
include( 'loop-mycustomposttype.php' );
Wo gibt es eine Funktion PHP include()
. Nach meinem WordPress-Wissen habe ich gelernt, get_template_part()
vor PHP include()
zu bevorzugen. Wie genau kann ich dann eine einfache get_template_part()
in meinem Plugin verwenden?.
Ich verwende keine Schleife oder ähnliches. Ich teile meinen Plugin-Code lediglich in verschiedene Dateien auf (oder Sie können sagen, dass Sie ihn organisieren), sodass ich sie in einigen Fällen einfach auskommentiere, um sie dort abzulegen, wo sie nicht erforderlich sind. Ich habe es versucht:
get_template_part( 'my', 'special-admin' );
und dann nach dem Fehler geändert in:
get_template_part( 'my', 'specialadmin' );
Aber Sie wissen, dass das nicht das Problem ist. Ich arbeite auf einem lokalen Server mit WAMP.
get_template_part
ist eine theme Funktion. Sie können mit dieser Funktion keine Plugin-Dateien laden. Werfen Sie einen Blick auf die Quelle und Sie werden feststellen, dass die Arbeit von locate_template
erledigt wird. Schauen Sie sich diese Quelle an und Sie werden sehen, dass sie immer aus den Verzeichnissen theme geladen wird.
Wie oft Sie auch get_template_part
verwenden möchten, es ist die falsche Funktion.
Sie müssen include
Ihre Dateien.
Der Grund, so scheint es mir, für get_template_part
ist, dass Themen erweitert werden können - auch bekannt als, um die Erstellung von untergeordneten Themen zu vereinfachen. Plugins sind nicht dazu gedacht, auf diese Weise erweitert zu werden, sodass kein get_template_part
oder ein entsprechendes Plugin erforderlich ist.
@s_ha_dum ist richtig, dass get_template_part
eine Theme-Funktion ist, aber er ist falsch, dass Plugins nicht dazu gedacht sind, auf diese Weise erweitert zu werden. Es ist einfach komplizierter.
In diesem Beitrag von Pippin wird beschrieben, wie Sie eine Funktion verwenden, mit der Sie Ihre Plugin-Vorlagen laden können, während Benutzer Ihre Plugin-Vorlagen innerhalb ihres Themas überschreiben können.
Im Wesentlichen sucht es in einem speziellen Ordner im Design. Wenn es dort nicht gefunden wird, sucht es im Vorlagenordner nach dem Plugin.
Wie bereits erwähnt, können Sie get_template_part
nicht in Plugins verwenden, aber es gibt eine handy class in Github (erstellt von Gary Jones), die die get_template_part
-Funktionalität in Plugins nachahmt und das Plugin dem Fallback hinzufügt (child theme> parent) Theme> Plugin).
Auf diese Weise können Sie den "Template Part" Ihres Plugins innerhalb eines untergeordneten oder übergeordneten Themas überschreiben.
Verwendung (entnommen aus der Github-Repo-Anleitung):
class-gamajo-template-loader.php
in dein Plugin. Es kann sich um eine Datei im Plugin-Stammverzeichnis oder besser um ein Includes-Verzeichnis handeln.class-your-plugin-template-loader.php
.class
in dieser Datei, die den Gamajo_Template_Loader
erweitert.get_templates_dir()
-Methode auch überschreiben, wenn sie für Sie nicht geeignet ist.get_template_part()
aufrufen. Dies kann innerhalb eines Shortcode-Rückrufs erfolgen oder etwas, das Theme-Entwickler in ihre Dateien aufnehmen sollen.Beispielcode:
// 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.