webentwicklung-frage-antwort-db.com.de

Wie binde ich eine Datei mit get_template_part () in ein Plugin ein?

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.

9
Mayeenul Islam

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.

8
s_ha_dum

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

5
benklocek

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

  1. Kopiere class-gamajo-template-loader.php in dein Plugin. Es kann sich um eine Datei im Plugin-Stammverzeichnis oder besser um ein Includes-Verzeichnis handeln.
  2. Erstellen Sie im selben Verzeichnis eine neue Datei, z. B. class-your-plugin-template-loader.php.
  3. Erstellen Sie eine class in dieser Datei, die den Gamajo_Template_Loader erweitert.
  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 Vorlagenladeprogrammklasse instanziieren und damit die Methode 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.
1
Marcio Duarte