Jak dołączyć plik za pomocą get_template_part () do wtyczki?

13

Może być bardzo proste pytanie, ale walczę. Przy tworzeniu motywów pracowałem get_template_part()wiele razy i rozumiem jego podstawy. Ale kiedy opracowuję wtyczkę, zastanawiałem się, czy mogę jej użyć, pokazując kilka błędów:

Uwaga: Użycie niezdefiniowanej stałej STYLESHEETPATH - przyjęto „STYLESHEETPATH” w ...\wp-includes\template.phplinii 407

i

Uwaga: Użycie niezdefiniowanej stałej TEMPLATEPATH - przyjęto „TEMPLATEPATH” w ...\wp-includes\template.phplinii 410

Googlowanie problemu wykazało poprawkę pomocy technicznej:

Ale to wydaje się ogromnym obejściem - wątpię w to. Myślę, że nie powinno to być zbyt skomplikowane. Sprawdziłem tę odpowiedź WPSE i znalazłem następujący wiersz kodu:

if ( '' === locate_template( 'loop-mycustomposttype.php', true, false ) )
    include( 'loop-mycustomposttype.php' );

Gdzie jest include()funkcja PHP . Zgodnie z moją wiedzą na temat WordPress nauczyłem się preferować get_template_part()PHP include(). Jak dokładnie mogę użyć prostego get_template_part()w mojej wtyczce.

Nie używam żadnej pętli ani czegoś takiego, po prostu dzielę (lub można powiedzieć, organizując) mój kod wtyczki na różne pliki, więc w niektórych przypadkach po prostu je skomentuję, aby upuścić tam, gdzie nie są konieczne. Próbowałem:

get_template_part( 'my', 'special-admin' );

a następnie po błędzie zmieniłem go na:

get_template_part( 'my', 'specialadmin' );

Ale wiesz, że to nie jest problem. Jestem na serwerze lokalnym, używając WAMP.

Mayeenul Islam
źródło

Odpowiedzi:

11

get_template_partjest funkcją motywu . Za pomocą tej funkcji nie można załadować plików wtyczek. Spójrz na źródło, a zauważysz, że praca została wykonana przez locate_template. Spójrz na to źródło, a zobaczysz, że zawsze ładuje się ono z katalogów motywów .

Niezależnie od tego, jak bardzo chcesz z get_template_partniego korzystać , jest zła funkcja.

Będziesz potrzebował includeswoich plików.

Wydaje mi się, że powodem get_template_partjest umożliwienie rozszerzenia motywów, czyli ułatwienie tworzenia motywów potomnych. Wtyczki nie są przeznaczone do rozszerzania w ten sposób, więc nie ma potrzeby get_template_partani żadnych odpowiedników wtyczek.

s_ha_dum
źródło
6

@ s_ha_dum ma rację, get_template_partto jest funkcja motywu, ale nie ma racji , że wtyczki nie powinny być rozszerzane w ten sposób. To jest po prostu bardziej skomplikowane.

W tym poście Pippin opisano, jak korzystać z funkcji, która wykona ładowanie szablonów wtyczek, jednocześnie umożliwiając użytkownikom zastąpienie szablonów wtyczek w obrębie ich motywu.

Zasadniczo wygląda w specjalnym folderze w motywie, a jeśli go nie ma, szuka w folderze szablonów wtyczki.

benklocek
źródło
4

Jak powiedziano wcześniej, nie można używać get_template_partwtyczek, ale na Github (stworzonej przez Gary'ego Jonesa) znajduje się przydatna klasa, która naśladuje get_template_partfunkcjonalność wtyczek, dodając wtyczkę do zastępczej (motyw potomny> motyw nadrzędny> wtyczka).

W ten sposób możesz zastąpić „część szablonu” wtyczki wewnątrz motywu podrzędnego lub motywu nadrzędnego.

Sposób użycia (wzięty z instrukcji repozytorium Github):

  1. Skopiuj class-gamajo-template-loader.phpdo swojej wtyczki. Może to być plik znajdujący się w katalogu głównym wtyczki lub, lepiej, w katalogu zawierającym.
  2. Utwórz nowy plik, na przykład class-your-plugin-template-loader.phpw tym samym katalogu.
  3. Utwórz classw tym rozszerzonym pliku Gamajo_Template_Loader.
  4. Zastąp właściwości klasy, aby pasowały do ​​wtyczki. Możesz również zastąpić get_templates_dir()metodę, jeśli nie jest dla Ciebie odpowiednia.
  5. Możesz teraz utworzyć instancję niestandardowej klasy modułu ładującego szablony i użyć jej do wywołania get_template_part()metody. Może to być wywołanie zwrotne krótkiego kodu lub coś, co twórcy motywów chcieliby dołączyć do swoich plików.

Przykładowy kod:

// 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
źródło