W artykule:
Czy kiedykolwiek chciałeś stworzyć własne szablony stron, ale nie miałeś dostępu do samego motywu? Ja, jako autor wtyczki WordPress, odkryłem, że ten problem jest szczególnie irytujący podczas opracowywania moich wtyczek. Na szczęście rozwiązanie jest dość proste! Przeprowadzę Cię szybko przez kilka linii kodu, które będą potrzebne do dynamicznego tworzenia szablonów stron WordPress bezpośrednio przez PHP.
Inspiracją dla tego artykułu i geniuszem stojącym za rozwiązaniem kodu jest Tom McFarlin: używam edytowanej wersji jego oryginalnego kodu, którą można znaleźć na jego Githubie. Zachowałem jego komentowanie (a także dodawanie własnych), ponieważ uważam, że jest to bardzo pomocne w wyjaśnieniu, co się dzieje-sam nie mógłbym tego lepiej powiedzieć!
Możesz znaleźć kod w całości i przykładową wtyczkę na samym dole tego posta.
Zaczynamy?
Kodeks
Stworzymy naszą funkcję PHP używając klasy PHP. Dla tych z Was, którzy nie są dobrze zaznajomieni z klasami PHP, klasa jest zdefiniowana jako obiekt, który zawiera zbiór funkcji i zmiennych, które współpracują ze sobą. Sprawdź PHP.net wprowadzenie po więcej szczegółów na temat składni i teorii.
Nasz wrapper będzie potrzebował tylko 3 zmiennych:
- Plugin Slug: Jest to po prostu używany jako unikalny identyfikator dla wtyczki.
- Instancja Klasy: Ponieważ dodajemy instancję tej klasy do głowy WordPressa, lepiej ją przechowujemy.
- Tablica Szablonów: Jak zapewne się domyślasz, jest to tablica zawierająca nazwy i tytuły szablonów.
Oto one w kodzie:
class PageTemplater {
/**
* Niepowtarzalny Identyfikator
*/
protected $plugin_slug;
/**
* Odniesienie do instancji tej klasy.
*/
private static $ instance;
/**
* Tablica szablonów, które śledzi ta wtyczka.
*/
protected $templates;
Instancja Klasy Get
Jak powiedziałem wcześniej, będziemy dodawać instancję naszej klasy do nagłówka WordPress za pomocą add_filter() funkcja. Dlatego będziemy potrzebować metody, która zwróci (lub utworzy) dla nas tę instancję.
W tym celu będziemy potrzebować prostej metody, która będzie nazwana 'get_instance’. Sprawdź to poniżej;
/**
* Zwraca instancję tej klasy.
*/
public static function get_instance () {
if (null = = self::$instance) {
self::$instance = new PageTemplater();
}
return self:: $ instance;
}
Będzie to metoda wywołana, gdy nasza klasa zostanie dodana do głowicy WordPressa za pomocą 'add_action()’.
Filtry WordPress
Teraz mamy posortowane’ get_instance ’ metoda, musimy uporządkować, co się dzieje, gdy jest rzeczywiście instantiated.
Wykorzystamy wbudowany WordPress add_filter() funkcja dodawania instancji naszej klasy do kluczowych punktów wzdłuż osi czasu inicjalizacji WordPress. Za pomocą tej metody wstawimy dane naszych szablonów stron do odpowiednich miejsc, takich jak informowanie WordPressa, jakiego pliku użyć jako szablonu, gdy strona zostanie wywołana, i tytuł do wyświetlenia w rozwijanym menu w edytorze stron.
W tym celu musimy użyć ’__construct’ metoda (zostanie uruchomiona, gdy klasa zostanie utworzona).
/**
* Inicjalizuje wtyczkę, ustawiając filtry i funkcje administracyjne.
*/
private function _ _ construct () {
$this->templates = array();
// Dodaj filtr do atrybutów metabox, aby wstawić szablon do pamięci podręcznej.
if ( version_compare (floatval (get_bloginfo ('version' ) ), '4.7', '<' ) ) {
// 4.6 i starsze
add_filter(
'page_attributes_dropdown_pages_args',
array ($this, 'register_project_templates' )
);
} else {
// Dodaj filtr do wersji wp 4.7 atrybuty metabox
add_filter(
'theme_page_templates', array ($this, 'add_new_template' )
);
}
// Dodaj filtr do save post, aby wstrzyknąć szablon do pamięci podręcznej strony
add_filter(
'wp_insert_post_data',
array ($this, 'register_project_templates' )
);
// Dodaj filtr do szablonu include, aby określić, czy strona ma nasze
// template assigned and return it ' s path
add_filter(
'template_include',
array ($this, 'view_project_template')
);
// Dodaj swoje szablony do tej tablicy.
$this->templates = array(
"goodtobebad-template.php' = > 'dobrze być złym',
);
}
Dzieją się tu 4 różne rzeczy (ignorując ’ $this->templates = array ();’, który właśnie przygotowuje zmienną do użycia);
- Linie 9 – 13: Ten filtr dodaje’ register_project_templates 'do Hooka’ page_attributes_dropdown_pages_args’. To zapełnia pamięć podręczną WordPress naszymi nowymi szablonami, „oszukując” WordPressa, aby uwierzył, że pliki szablonów stron rzeczywiście istnieją w katalogu szablonów. Spowoduje to dodanie szablonów stron do listy rozwijanej w polu meta atrybuty strony w edytorze stron.
- Linie 16 – 20: Tutaj robimy zasadniczo to samo, co poprzedni blok kodu, z wyjątkiem tego, że tym razem dodajemy nasz szablon strony (jeśli jest zaznaczony)do zapisanych danych postu.
- Linie 23 – 28: Ten filtr dodaje’ template_include 'do Hooka’ view_project_template’. Jest to bardzo ważna funkcja; to mówi WordPress, gdzie faktycznie jest plik szablonu strony. WordPress użyje ścieżki dostarczonej przez to, aby renderować końcową stronę.
- Linie 31 – 34: Chociaż jest to proste, to jest bardzo ważne. W tym miejscu określasz szablony stron, które chcesz dodać, a ścieżka względem pliku gdzie znajduje się plik szablonu strony (np. 'coś.php”). Załączyłem jeden przykład (który będzie użyty w wtyczce example). Poniżej znajdziesz ogólny przykład:
$this->templates = array(
'FILE_PATH_AND_NAME' = > 'TEMPLATE_TITLE',
'awesome-template.php '= > 'Awesome',
"templates / organized-template.php '= > 'zorganizowane',
);
(Jeść, spać,) Kod, powtórz w razie potrzeby.
register_project_templates()
Wspomniałem o tej metodzie wcześniej; zobaczmy, co ona faktycznie robi.
Zasadniczo celem tej metody jest manipulowanie pamięcią podręczną WordPressa, wstawianie odpowiednich danych o naszych szablonach stron we właściwych miejscach. Najpierw spójrz na kod, a potem Cię o tym opowiem.
Public function register_project_templates ($atts ) {
// Create the key used for the themes cache
$cache_key = 'page_templates-' . md5( get_theme_root() . '/' . get_stylesheet() );
// Pobierz listę pamięci podręcznej.
// Jeśli nie istnieje lub jest pusta, przygotuj tablicę
$templates = wp_get_theme()->get_page_templates();
if (empty ($templates)) {
$templates = array();
}
// New cache, dlatego usuń stary
wp_cache_delete ($cache_key, 'themes');
// Teraz dodaj nasz szablon do listy szablonów łącząc nasze szablony
// z istniejącą tablicą szablonów z pamięci podręcznej.
$templates = array_merge ($templates, $this->templates );
// Dodaj zmodyfikowaną pamięć podręczną, aby umożliwić WordPressowi pobranie jej do aukcji
// dostępne szablony
wp_cache_add ($cache_key, $templates, 'themes', 1800 );
return $atts;
}
W porządku. Linia 4 jest pierwszym miejscem, aby spojrzeć. Jak można się domyślić, generujemy „klucz pamięci podręcznej”. Będzie to wykorzystywane jako niepowtarzalny identyfikator dla nasze dane szablonu strony. Użycie funkcji md5() po prostu tworzy unikalny identyfikator ciągu znaków, aby uniknąć konfliktów.
Następnie, w linii 8, szukamy i pobieramy Cache szablonu strony (jeśli już istnieje): zwróci to tablicę ścieżek i tytułów. Na liniach 9-11 sprawdzamy, czy nie było żadnego wyjścia z zapytania cache. Jeśli tak, świetnie. Jeśli nie, Utwórz lokalną tablicę do przechowywania danych, które będziemy scalać do pamięci podręcznej.
Kolejny krok ma kluczowe znaczenie. On line 14 we usunąć istniejący cache szablonu strony. Nie martw się, żadne dane nie są tracone-są przechowywane w zmiennej $templates.
W linii 18 łączymy istniejącą pamięć podręczną szablonów stron z naszymi nowymi wpisami, a w linii 22 ponownie wstawiamy całą pamięć podręczną szablonów stron do systemu WordPress.
Proste!
view_project_template ()
Jesteśmy teraz na naszej ostatecznej metody; to jest, gdzie mówimy WordPress, gdzie jest prawdziwy plik szablonu strony.
/**
* Sprawdza czy szablon jest przypisany do strony
*/
public function view_project_template ($template ) {
// Get global post
global $post;
// Return template if post is empty
jeśli ( ! $post) {
return $template;
}
// Return default template if we don ' t have a custom one defined
jeśli ( !isset ($this - >templates[get_post_meta(
$post - > ID, '_wp_page_template', true
)] ) ) {
return $template;
}
$file = plugin_dir_path(__FILE__). get_post_meta(
$post - > ID, '_wp_page_template', true
);
// Dla bezpieczeństwa najpierw sprawdzamy, czy plik istnieje
if (file_exists ($file)) {
return $ file;
} else {
echo $file;
}
// Return template
return $template;
}
Ok następnie, ta metoda będzie sprawdzać z globalną zmienną $post (linia 6). Sprawdza, czy szablon strony ( '_wp_page_template’ ) został ustawiony dla posta (co oznacza, że musi to być strona). Jeśli nie, to nieważne-Nie-strony nie mogą mieć szablonów stron.
Linia 16 określa lokalizację pliku szablonu strony. Jak określono powyżej, sprawdza określony plik szablonu strony w katalogu głównym wtyczki. (Można to jednak łatwo zmienić; patrz poniżej.)
// Tylko zmiana ścieżki szablonu strony
// WordPress będzie teraz szukać szablonów stron w podfolderze "szablony",
// zamiast korzenia
$file = plugin_dir_path(__FILE__). 'templates/'.get_post_meta(
$post - > ID, '_wp_page_template', true
);
Po tym, w wierszach 21 – 24, mamy tylko trochę walidacji, która sprawdza, czy plik rzeczywiście istnieje. Jeśli tak, Super! Jeśli nie, ojej … najprawdopodobniej otrzymasz komunikat o błędzie PHP, jeśli WordPress nie może znaleźć pliku szablonu, a nawet pusty ekran. Jeśli którykolwiek z tych objawów brzmi znajomo, po prostu sprawdź ścieżkę pliku szablonu, drukując zmienną $file na ekranie.
Jeśli planujesz używać tego kodu komercyjnie (co możesz zrobić za darmo – moja wersja kodu nie ma licencji, dlatego możesz z nim robić, co chcesz), naprawdę polecam zainwestować trochę czasu w obsługę błędów dla maksymalnej niezawodności.
To jest to. Po zakończeniu naszej klasy pozostało tylko jedno-dodać ją do głowy WordPressa.
add_action ('plugins_loaded', array( 'PageTemplater', 'get_instance' ) );
Gratulacje, jeśli udało ci się przejść przez całą drogę! Mam nadzieję, że to, co miałem do powiedzenia, okaże się przydatne i skorzystasz z tego w przyszłości!
Cały Kod
Poniżej znajduje się cały kod wtyczki do łatwego kopiowania i wklejania.
<?php
/*
Nazwa Wtyczki: Szablon Strony Wtyczka: 'Dobrze Być Złym'
Plugin URI: http://www.wpexplorer.com/wordpress-page-templates-plugin/
Wersja: 1.1.0
Autor: WPExplorer
Autor URI: http://www.wpexplorer.com/
*/
class PageTemplater {
/**
* Odniesienie do instancji tej klasy.
*/
private static $ instance;
/**
* Tablica szablonów, które śledzi ta wtyczka.
*/
protected $templates;
/**
* Zwraca instancję tej klasy.
*/
public static function get_instance () {
if (null = = self::$instance) {
self::$instance = new PageTemplater();
}
return self:: $ instance;
}
/**
* Inicjalizuje wtyczkę, ustawiając filtry i funkcje administracyjne.
*/
private function _ _ construct () {
$this->templates = array();
// Dodaj filtr do atrybutów metabox, aby wstawić szablon do pamięci podręcznej.
if ( version_compare (floatval (get_bloginfo ('version' ) ), '4.7', '<' ) ) {
// 4.6 i starsze
add_filter(
'page_attributes_dropdown_pages_args',
array ($this, 'register_project_templates' )
);
} else {
// Dodaj filtr do wersji wp 4.7 atrybuty metabox
add_filter(
'theme_page_templates', array ($this, 'add_new_template' )
);
}
// Dodaj filtr do save post, aby wstrzyknąć szablon do pamięci podręcznej strony
add_filter(
'wp_insert_post_data',
array ($this, 'register_project_templates' )
);
// Dodaj filtr do szablonu include, aby określić, czy strona ma nasze
// template assigned and return it ' s path
add_filter(
'template_include',
array ($this, 'view_project_template')
);
// Dodaj swoje szablony do tej tablicy.
$this->templates = array(
"goodtobebad-template.php' = > 'dobrze być złym',
);
}
/**
* Dodaje nasz szablon do rozwijanej strony dla v4. 7+
*
*/
public function add_new_template ($posts_templates ) {
$posts_templates = array_merge ($posts_templates, $this - >templates);
return $posts_templates;
}
/**
* Dodaje nasz szablon do pamięci podręcznej stron w celu oszukania WordPressa
* do myślenia, że plik szablonu istnieje tam, gdzie tak naprawdę nie istnieje.
*/
Public function register_project_templates ($atts ) {
// Create the key used for the themes cache
$cache_key = 'page_templates-' . md5( get_theme_root() . '/' . get_stylesheet() );
// Pobierz listę pamięci podręcznej.
// Jeśli nie istnieje lub jest pusta, przygotuj tablicę
$templates = wp_get_theme()->get_page_templates();
if (empty ($templates)) {
$templates = array();
}
// New cache, dlatego usuń stary
wp_cache_delete ($cache_key, 'themes');
// Teraz dodaj nasz szablon do listy szablonów łącząc nasze szablony
// z istniejącą tablicą szablonów z pamięci podręcznej.
$templates = array_merge ($templates, $this->templates );
// Dodaj zmodyfikowaną pamięć podręczną, aby umożliwić WordPressowi pobranie jej do aukcji
// dostępne szablony
wp_cache_add ($cache_key, $templates, 'themes', 1800 );
return $atts;
}
/**
* Sprawdza czy szablon jest przypisany do strony
*/
public function view_project_template ($template ) {
// Get global post
global $post;
// Return template if post is empty
jeśli ( ! $post) {
return $template;
}
// Return default template if we don ' t have a custom one defined
jeśli ( ! isset ($this - >templates[get_post_meta(
$post - > ID, '_wp_page_template', true
)] ) ) {
return $template;
}
$file = plugin_dir_path( __FILE__ ). get_post_meta(
$post - > ID, '_wp_page_template', true
);
// Dla bezpieczeństwa najpierw sprawdzamy, czy plik istnieje
if (file_exists ($file)) {
return $ file;
} else {
echo $file;
}
// Return template
return $template;
}
}
add_action ('plugins_loaded', array( 'PageTemplater', 'get_instance' ) );
Plugin
Możesz również pobrać Pełny kod jako wtyczkę na Github.
Edytor Post Zbliżenie
Oto zbliżenie wtyczki w akcji. Widzisz szablon strony dodany pod atrybutami strony?
