Cum să incluzi un fișier folosind get_template_part() într-un plugin?
O întrebare foarte simplă poate, dar mă chinui. În dezvoltarea temelor, am lucrat cu get_template_part()
de multe ori și înțeleg elementele sale de bază. Dar când dezvolt un plugin, folosirea acesteia îmi arată câteva erori:
Notice: Use of undefined constant STYLESHEETPATH - assumed 'STYLESHEETPATH' in
...\wp-includes\template.php
on line 407
și
Notice: Use of undefined constant TEMPLATEPATH - assumed 'TEMPLATEPATH' in
...\wp-includes\template.php
on line 410
Căutând problema pe Google am găsit o soluție de suport:
Dar asta pare o soluție ocolitoare mare - mă îndoiesc. Cred că nu ar trebui să fie atât de complicat. Am verificat acest Răspuns WPSE și am găsit această linie de cod:
if ( '' === locate_template( 'loop-mycustomposttype.php', true, false ) )
include( 'loop-mycustomposttype.php' );
Unde există funcția PHP include()
. Conform cunoștințelor mele despre WordPress am învățat să prefer get_template_part()
în loc de include()
PHP. Atunci cum pot folosi exact un simplu get_template_part()
în plugin-ul meu.
Nu folosesc niciun loop sau altceva, doar separ (sau puteți spune organizez) codul plugin-ului meu în diferite fișiere astfel încât în anumite cazuri, le voi comenta pur și simplu pentru a le elimina acolo unde nu sunt necesare. Am încercat:
get_template_part( 'my', 'special-admin' );
și apoi după eroare, l-am schimbat în:
get_template_part( 'my', 'specialadmin' );
Dar știți că nu asta e problema. Sunt pe server local, folosind WAMP.

get_template_part
este o funcție specifică temelor. Nu poți încărca fișiere de plugin cu această funcție. Dacă examinezi codul sursă, vei observa că procesul este realizat de locate_template
. Uită-te la codul sursă și vei vedea că întotdeauna încarcă din directoarele temelor.
Oricât ai dori să folosești get_template_part
, aceasta nu este funcția potrivită.
Va trebui să folosești include
pentru fișierele tale.
Motivul, după cum mi se pare, pentru existența funcției get_template_part
este de a permite extinderea temelor - adică, pentru a ușura crearea temelor copil. Pluginurile nu sunt concepute să fie extinse în acest mod, deci nu există nevoie de get_template_part
sau de vreun echivalent pentru pluginuri.

@s_ha_dum are dreptate că get_template_part
este o funcție pentru teme, dar greșește afirmând că plugin-urile nu sunt concepute pentru a fi extinse în acest fel. Este pur și simplu mai complicat.
Acest articol scris de Pippin, descrie cum să utilizezi o funcție care va lua rolul de a încărca șabloanele plugin-ului tău, permițând în același timp utilizatorilor să le suprascrie în tema lor.
În esență, funcția va căuta într-un folder special din temă, iar dacă nu le găsește acolo, va căuta în folderul de șabloane al plugin-ului.

După cum s-a menționat anterior, nu poți folosi get_template_part
în plugin-uri, dar există o clasă utilă pe Github (creată de Gary Jones) care imită funcționalitatea get_template_part
în plugin-uri, adăugând plugin-ul în ierarhia de căutare (tema copil > tema părinte > plugin).
În acest fel, poți suprascrie „părțile de template” ale plugin-ului tău în cadrul unei teme copil sau a unei teme părinte.
Mod de utilizare (preluat din instrucțiunile repo-ului Github):
- Copiază
class-gamajo-template-loader.php
în plugin-ul tău. Poate fi într-un fișier în rădăcina plugin-ului sau, mai bine, într-un directorincludes
. - Creează un fișier nou, cum ar fi
class-your-plugin-template-loader.php
, în același director. - Creează o
class
în acel fișier care extindeGamajo_Template_Loader
. - Suprascrie proprietățile clasei pentru a se potrivi cu plugin-ul tău. Poți suprascrie și metoda
get_templates_dir()
dacă nu este potrivită pentru tine. - Acum poți instanția clasa ta personalizată de încărcare a șabloanelor și să o folosești pentru a apela metoda
get_template_part()
. Acest lucru poate fi în cadrul unui callback de shortcode sau al unui element pe care dorești să-l includă dezvoltatorii de teme în fișierele lor.
Exemplu de cod:
// Template loader instanțiat în altă parte, cum ar fi fișierul principal al plugin-ului.
$meal_planner_template_loader = new Meal_Planner_Template_Loader;
// Folosește-l pentru a apela metoda get_template_part(). Acest lucru poate fi în cadrul
// unui callback de shortcode sau al unui element pe care dorești să-l includă
// dezvoltatorii de teme în fișierele lor.
$meal_planner_template_loader->get_template_part( 'recipe' );
// Dacă dorești să transmiți date către șablon, apelează metoda set_template_data()
// cu un array înainte de a apela get_template_part().
// set_template_data() returnează obiectul loader pentru a permite înlănțuirea metodelor.
$data = array( 'foo' => 'bar', 'baz' => 'boom' );
$meal_planner_template_loader
->set_template_data( $data );
->get_template_part( 'recipe' );
// Valoarea lui bar este acum disponibilă în interiorul șablonului recipe ca $data->foo.
// Dacă dorești să folosești un alt nume de variabilă, adaugă un al doilea parametru
// la set_template_data():
$data = array( 'foo' => 'bar', 'baz' => 'boom' );
$meal_planner_template_loader
->set_template_data( $data, 'context' )
->get_template_part( 'recipe', 'ingredients' );
// Valoarea lui bar este acum disponibilă în interiorul șablonului recipe ca $context->foo.
