Wie füge ich eine Datei mit get_template_part () in ein Plugin ein?

13

Eine sehr einfache Frage mag sein, aber ich kämpfe. In der Themenentwicklung habe ich get_template_part()viele Male gearbeitet und verstehe die Grundlagen. Aber als ich ein Plugin entwickelte, fragte ich mich, ob ich es verwenden konnte, was mir einige Fehler zeigte:

Hinweis: Verwendung der undefinierten Konstante STYLESHEETPATH - in ...\wp-includes\template.phpZeile 407 wird 'STYLESHEETPATH' angenommen

und

Hinweis: Verwendung der undefinierten Konstante TEMPLATEPATH - in ...\wp-includes\template.phpZeile 410 wird 'TEMPLATEPATH' angenommen

Beim Googeln des Problems wurde ein Support-Fix angezeigt:

Aber das scheint eine große Problemumgehung 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 PHP- include()Funktion. Nach meinen WordPress-Kenntnissen habe ich gelernt, get_template_part()PHP vorzuziehen include(). Wie genau kann ich dann ein einfaches get_template_part()in meinem Plugin verwenden.

Ich verwende keine Schleife oder ähnliches, ich trenne meinen Plugin-Code nur in verschiedene Dateien (oder Sie können sagen, sie 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 bin auf einem lokalen Server und verwende WAMP.

Mayeenul Islam
quelle

Antworten:

11

get_template_partist eine Themenfunktion . Mit dieser Funktion können Sie keine Plugin-Dateien laden. Werfen Sie einen Blick auf die Quelle und Sie werden feststellen, dass die Arbeit von erledigt ist locate_template. Schauen Sie sich diese Quelle an und Sie werden sehen, dass sie immer aus Themenverzeichnissen geladen wird.

Wie oft Sie es auch verwenden möchten, get_template_partes ist die falsche Funktion.

Sie müssen zu includeIhren Dateien.

Der Grund, so scheint es mir, get_template_partbesteht darin, die Erweiterung von Themen zuzulassen - auch bekannt als, um die Erstellung von untergeordneten Themen zu vereinfachen. Plugins sollen nicht auf diese Weise erweitert werden, sodass weder get_template_partein Plugin noch ein gleichwertiges Plugin erforderlich ist .

s_ha_dum
quelle
6

@s_ha_dum ist richtig, das get_template_partist eine Theme-Funktion, 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 wird es in einem speziellen Ordner im Design angezeigt. Wenn es dort nicht gefunden wird, sucht es im Vorlagenordner nach dem Plugin.

benklocek
quelle
4

Wie bereits erwähnt, können Sie keine get_template_partPlugins verwenden, aber es gibt eine praktische Klasse für Github (erstellt von Gary Jones), die die get_template_partFunktionalität von Plugins nachahmt und das Plugin zum Fallback hinzufügt (untergeordnetes Thema> übergeordnetes Thema> Plugin).

Auf diese Weise können Sie den „Vorlagenteil“ Ihres Plugins in einem untergeordneten oder einem übergeordneten Thema überschreiben.

Verwendung (entnommen aus den Github-Repo-Anweisungen):

  1. Kopieren Sie class-gamajo-template-loader.phpin Ihr Plugin. Es kann sich um eine Datei im Plugin-Stammverzeichnis oder besser um ein Includes-Verzeichnis handeln.
  2. Erstellen Sie eine neue Datei, z. B. class-your-plugin-template-loader.phpim selben Verzeichnis.
  3. Erstellen Sie eine classin dieser Datei, die erweitert wird Gamajo_Template_Loader.
  4. Überschreiben Sie die Klasseneigenschaften entsprechend Ihrem Plugin. Sie können die get_templates_dir()Methode auch überschreiben , wenn sie für Sie nicht geeignet ist.
  5. Sie können jetzt Ihre benutzerdefinierte Template-Loader-Klasse instanziieren und damit die get_template_part()Methode aufrufen . Dies kann innerhalb eines Shortcode-Rückrufs oder etwas sein, 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.
Marcio Duarte
quelle