Cum să incluzi un fișier folosind get_template_part() într-un plugin?

28 nov. 2013, 17:38:59
Vizualizări: 51.7K
Voturi: 29

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.

0
Toate răspunsurile la întrebare 3
0
19

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.

28 nov. 2013 17:56:19
0
15

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

24 iun. 2015 22:04:03
0

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

  1. 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 director includes.
  2. Creează un fișier nou, cum ar fi class-your-plugin-template-loader.php, în același director.
  3. Creează o class în acel fișier care extinde Gamajo_Template_Loader.
  4. 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.
  5. 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.
7 mai 2017 23:34:05