Tworzę wtyczkę, w której chciałbym włączyć niestandardowe strony. W moim przypadku strona niestandardowa zawierałaby formularz podobny do formularza kontaktowego (nie dosłownie). Gdy użytkownik wypełni ten formularz i wyśle go, powinien być następny krok, który będzie wymagał więcej informacji. Powiedzmy, że pierwsza strona z formularzem będzie znajdować się w www.domain.tld/custom-page/
i po pomyślnym przesłaniu formularza, użytkownik powinien zostać przekierowany do www.domain.tld/custom-page/second
. Szablon z elementami HTML i kodem PHP powinien być również niestandardowy.
Myślę, że część problemu jest możliwa do osiągnięcia dzięki niestandardowym przepisywaniu adresów URL, ale pozostałe części nie są mi obecnie znane. Naprawdę nie wiem, gdzie powinienem zacząć szukać i jak poprawnie nazwać ten problem. Każda pomoc byłaby bardzo mile widziana.
źródło
Odpowiedzi:
Podczas odwiedzania strony frontonu WordPress wysyła zapytanie do bazy danych, a jeśli twoja strona nie istnieje w bazie danych, zapytanie to nie jest potrzebne i jest tylko marnotrawstwem zasobów.
Na szczęście WordPress oferuje sposób na obsługę żądań interfejsu użytkownika w niestandardowy sposób. Odbywa się to dzięki
'do_parse_request'
filtrowi.Wracając
false
do tego haka, będziesz mógł powstrzymać WordPressa od przetwarzania żądań i zrobić to na swój własny sposób.To powiedziawszy, chcę udostępnić sposób na zbudowanie prostej wtyczki OOP, która może obsługiwać wirtualne strony w łatwy w użyciu (i ponownym użyciu) sposób.
Czego potrzebujemy
Interfejsy
Przed budowaniem klas napiszmy interfejsy dla 3 wyżej wymienionych obiektów.
Najpierw interfejs strony (plik
PageInterface.php
):Większość metod to tylko osoby pobierające i ustawiające, bez potrzeby wyjaśniania. Do uzyskania
WP_Post
obiektu ze strony wirtualnej należy użyć ostatniej metody .Interfejs kontrolera (plik
ControllerInterface.php
):oraz interfejs modułu ładującego szablony (plik
TemplateLoaderInterface.php
):Komentarze phpDoc powinny być dość jasne dla tych interfejsów.
Plan
Teraz, gdy mamy interfejsy i przed napisaniem konkretnych klas, przejrzyjmy nasz przepływ pracy:
Controller
klasy (implementującControllerInterface
) i wstrzykujemy (prawdopodobnie w konstruktorze) instancjęTemplateLoader
klasy (implementującTemplateLoaderInterface
)init
przechwytywania wywołujemyControllerInterface::init()
metodę ustawiania kontrolera i wystrzeliwania zaczepu, którego kod konsumenta użyje do dodania stron wirtualnych.ControllerInterface::dispatch()
i tam sprawdzimy wszystkie dodane strony wirtualne i jeśli jedna z nich ma ten sam adres URL bieżącego żądania, wyświetl go; po ustawieniu wszystkich podstawowych zmiennych globalnych ($wp_query
,$post
). Użyjemy równieżTemplateLoader
klasy, aby załadować odpowiedni szablon.Podczas tego przepływu pracy będziemy wyzwalać pewne haczyki rdzeniowe, jak
wp
,template_redirect
,template_include
..., aby plugin bardziej elastyczne i zapewniają zgodność z rdzenia i innych wtyczek, albo przynajmniej z kilku dobrych z nich.Oprócz poprzedniego przepływu pracy będziemy również musieli:
the_permalink
aby w razie potrzeby zwracał właściwy adres URL strony wirtualnej.Klasy betonowe
Teraz możemy zakodować nasze konkretne klasy. Zacznijmy od klasy strony (pliku
Page.php
):Nic więcej niż implementacja interfejsu.
Teraz klasa kontrolera (plik
Controller.php
):Zasadniczo klasa tworzy
SplObjectStorage
obiekt, w którym przechowywane są wszystkie dodane obiekty stron.Na
'do_parse_request'
klasa kontrolera zapętla tę pamięć, aby znaleźć dopasowanie do bieżącego adresu URL na jednej z dodanych stron.Jeśli zostanie znaleziony, klasa robi dokładnie to, co zaplanowaliśmy: uruchamia niektóre przechwyty, ustawia zmienne i ładuje szablon poprzez rozszerzenie klasy
TemplateLoaderInterface
. Potem tylkoexit()
.Napiszmy więc ostatnią klasę:
Szablony przechowywane na stronie wirtualnej są scalane w tablicę z ustawieniami domyślnymi
page.php
iindex.php
przed uruchomieniem szablonu'template_redirect'
są uruchamiane, aby zwiększyć elastyczność i poprawić zgodność.Następnie znaleziony szablon przechodzi przez filtry niestandardowe
'virtual_page_template'
i podstawowe'template_include'
: ponownie dla elastyczności i kompatybilności.Wreszcie plik szablonu został właśnie załadowany.
Główny plik wtyczki
W tym momencie musimy napisać plik z nagłówkami wtyczek i użyć go, aby dodać haki, które spowodują nasz przepływ pracy:
W prawdziwym pliku prawdopodobnie dodamy więcej nagłówków, takich jak wtyczka i linki autora, opis, licencja itp.
Plugin Gist
Ok, skończyliśmy z naszą wtyczką. Cały kod można znaleźć w Gist tutaj .
Dodawanie stron
Wtyczka jest gotowa i działa, ale nie dodaliśmy żadnych stron.
Można to zrobić w samej wtyczce, w temacie
functions.php
, w innej wtyczce itp.Dodawanie stron to tylko kwestia:
I tak dalej. Możesz dodać wszystkie potrzebne strony, pamiętaj tylko o stosowaniu względnych adresów URL dla stron.
W pliku szablonu możesz używać wszystkich tagów szablonów WordPress, a także pisać wszystkie potrzebne PHP i HTML.
Globalny obiekt postu jest wypełniony danymi pochodzącymi z naszej wirtualnej strony. Do samej wirtualnej strony można uzyskać dostęp poprzez
$wp_query->virtual_page
zmienną.Aby uzyskać adres URL strony wirtualnej, wystarczy przejść do
home_url()
tej samej ścieżki, którą użyto do utworzenia strony:Zauważ, że w głównej pętli w załadowanym szablonie
the_permalink()
zwróci poprawny bezpośredni link do strony wirtualnej.Uwagi na temat stylów / skryptów dla stron wirtualnych
Prawdopodobnie po dodaniu stron wirtualnych pożądane jest także umieszczenie w kolejce niestandardowych stylów / skryptów, a następnie użycie ich
wp_head()
w niestandardowych szablonach.To bardzo łatwe, ponieważ strony wirtualne są łatwo rozpoznawalne na podstawie
$wp_query->virtual_page
zmiennych, a strony wirtualne można odróżnić od siebie na podstawie ich adresów URL.Tylko przykład:
Uwagi do OP
Przekazywanie danych ze strony na inną nie jest powiązane z tymi wirtualnymi stronami, ale jest jedynie ogólnym zadaniem.
Jeśli jednak masz formularz na pierwszej stronie i chcesz przenieść stamtąd dane na drugą stronę, po prostu użyj adresu URL drugiej strony we
action
właściwości formularza .Np. W pliku szablonu pierwszej strony możesz:
a następnie w pliku szablonu drugiej strony:
źródło
wordpress/virtual-page
a URL przyciętej strony tovirtual-page
.Kiedyś użyłem opisanego tutaj rozwiązania: http://scott.sherrillmix.com/blog/blogger/creating-a-better-fake-post-with-a-wordpress-plugin/
Właściwie, kiedy go używałem, rozszerzam rozwiązanie w taki sposób, że mogę zarejestrować więcej niż jedną stronę na raz (reszta kodu jest +/- podobna do rozwiązania, które łączę z powyższego akapitu).
Rozwiązanie wymaga, aby dozwolone były permalinki, które ...
źródło
content
w tablicy podczas rejestracji fałszywa strona jest wyświetlana w jej treści - może zawierać zarówno HTML, jak i prosty tekst, a nawet krótki kod.