Łącza jednorazowe mogą być używane w różnych sytuacjach: w celu zapewnienia tymczasowego dostępu do pliku lub strony albo w celu potwierdzenia rejestracji. W tym samouczku pokażemy, jak generować i osadzać jednorazowe adresy URL.
Tworzenie adresu URL
Załóżmy, że na naszej stronie mamy system uwierzytelniania użytkowników. Po rejestracji prosimy użytkownika o przejście przez procedurę weryfikacji adresu e-mail. Do tworzenia takich linków możemy wykorzystać specjalny parametr tokena. Przykład takiego linku:
Http: //example.com/activate? Token \u003d ee97780 ...
Nie możemy się tutaj obejść bez bazy danych, więc spójrzmy na tabelę, z którą będziemy pracować.
CREATE TABLE pending_users (token CHAR (40) NOT NULL, nazwa użytkownika VARCHAR (45) NOT NULL, tstamp INTEGER UNSIGNED NOT NULL, PRIMARY KEY (token));
W tabeli będziemy przechowywać 3 pola: token, nazwę użytkownika i czas. Aby wygenerować token, użyjemy funkcji sha1 (), która wyświetla 40-znakowy ciąg. Pole tstamp będzie przechowywać czas wygenerowania tokena, abyśmy mogli śledzić wygasłe linki.
Istnieje wiele sposobów generowania tokena, ale w tym samouczku użyjemy funkcji uniqid () i sha1 (). Niezależnie od sposobu generowania tokena upewnij się, że wygenerowane wartości są różne, a prawdopodobieństwo duplikatów jest minimalne.
$ token \u003d sha1 (uniqid ($ username, true));
Funkcja uniqid () przyjmuje ciąg jako parametr i generuje unikalny identyfikator w oparciu o przekazany argument i bieżący czas. Ponadto, jako drugi argument, ta funkcja przyjmuje wartość logiczną, która sygnalizuje uniqid dodanie kilku dodatkowych znaków, aby zwiększyć prawdopodobieństwo, że wartość jest unikalna. Funkcja sha1 przyjmuje unikalny identyfikator i tworzy skrót.
Po zadziałaniu tych dwóch funkcji będziemy mieć unikalny token, którego możemy użyć do wygenerowania adresów URL. Teraz musimy dodać go do bazy danych:
$ zapytanie \u003d $ db-\u003e przygotuj ("INSERT INTO pending_users (nazwa użytkownika, token, znacznik) VALUES (?,?,?)"); $ query-\u003e execute (array ($ username, $ token, $ _SERVER ["REQUEST_TIME"]));
Abyśmy wiedzieli, który użytkownik powinien zostać aktywowany, w tabeli zostanie również zapisana nazwa użytkownika. W przykładzie bardziej dostosowanym do prawdziwej witryny możesz użyć identyfikatora użytkownika.
Teraz, gdy mamy wszystkie potrzebne informacje, możemy utworzyć tymczasowy adres URL:
$ url \u003d "http://example.com/activate.php?token\u003d$token";
$ wiadomość \u003d<< Teraz potrzebujemy skryptu, dzięki któremu przeprowadzimy kontrolę. Wszystko, co musimy zrobić, to porównać token z adresu URL i token z bazy danych. Jeśli istnieje, a jego życie nie upłynęło, to wszystko jest w porządku. // pobierz token if (isset ($ _ GET ["token"]) && preg_match ("/ ^ (40) $ / i", $ _GET ["token"])) ($ token \u003d $ _GET ["token"] ;) else (throw new Exception ("token jest nieprawidłowy.");) // sprawdź token $ query \u003d $ db-\u003e ready ("SELECT nazwa użytkownika, tstamp FROM pending_users WHERE token \u003d?"); $ query-\u003e execute (array ($ token)); $ row \u003d $ query-\u003e fetch (PDO :: FETCH_ASSOC); $ query-\u003e closeCursor (); if ($ row) (extract ($ row);) else (throw new Exception ("token jest nieprawidłowy.");) // aktywuj konto użytkownika // ... // usuń token z bazy danych $ query \u003d $ db- \u003e przygotuj ("USUŃ Z Pending_users WHERE username \u003d? AND token \u003d? AND tstamp \u003d?",); $ query-\u003e execute (array ($ username, $ token, $ tstamp)); Musimy również zapewnić weryfikację tokenów, których żywotność wygasła: // 1 dzień w sekundach \u003d 60 sekund * 60 minut * 24 godziny $ delta \u003d 86400; // sprawdź, czy ($ _SERVER ["REQUEST_TIME"] - $ tstamp\u003e $ delta) (throw new Exception ("token has expired.");) // aktywuj konto użytkownika // ... W ten sposób będziemy mieć dwie kontrole: jedną na ważność tokena, drugą na czas jego istnienia. Ta metoda może być używana nie tylko do aktywacji kont użytkowników, ale także do innych potrzeb: na przykład, aby zapewnić jednorazowy lub tymczasowy dostęp do jakiegoś zasobu lub usługi. Oprócz tego możesz stworzyć skrypt, który usunie tokeny, których nigdy nie używałeś. Możesz od czasu do czasu uruchomić ten skrypt samodzielnie lub użyć do tego crona. Motywy zwykle nie są funkcjonalne, ale czasami my, programiści, musimy zaimplementować pewne funkcje w naszym motywie, aby był trochę lepszy i bardziej przyjazny dla użytkownika. W tym samouczku poznamy termin „terytorium wtyczek”, a także nauczymy się, jak używać fantastycznego narzędzia napisanego przez Thomasa Griffina: biblioteki aktywacji wtyczek TGM. Motywy mają na celu zmianę wyglądu witryny WordPress. Idealnie, temat powinien dotyczyć tylko aspektu wizualnego. Jednak w naszym „złotym wieku” WordPressa, twórcy wtyczek często zawierają funkcje w swoich motywach, aby pozostać konkurencyjnymi na rynku. To jest inwazja na terytorium wtyczek. Możemy myśleć o „terytorium wtyczek” jako o funkcjonalnym fragmencie kodu. Każdy fragment kodu, który zmienia funkcjonalność Twojej witryny, powinien być prezentowany jako wtyczka, chyba że określony kod jest osadzony w rdzeniu WordPress. W jednym z moich artykułów sformułowałem praktyczną zasadę dotyczącą „terytorium wtyczek: Jeśli funkcja jest związana z wizualną prezentacją witryny, powinna zostać uwzględniona w motywie; jeśli jest to związane z funkcjonalnością, to powinno być prezentowane jako osobna wtyczka. Całkiem prosta zasada. Ludzie nadal próbują kodować funkcjonalne fragmenty w swoich motywach, ale katalogi motywów (takie jak WordPress.org lub ThemeForest) nie akceptują motywów, które atakują terytorium wtyczek. Dlatego oferowanie funkcjonalności w motywach stało się zdecydowanym wyzwaniem. Na szczęście istnieje proste rozwiązanie, które nie jest sprzeczne z regułą dotyczącą terytorium wtyczki. Zwróć uwagę na funkcję tgmpa () z dwoma parametrami na samym końcu kodu. Drugim parametrem jest zmienna $ config, która jest również tablicą, podobnie jak $ plugins. Jak sugeruje nazwa, możesz dostosować bibliotekę aktywacji wtyczek TGM za pomocą tej tablicy. Zmienna akceptuje również własny zestaw opcji: Jak widać, możliwe jest oferowanie funkcjonalności w motywach WordPress - wystarczy pomyśleć najpierw o użytkownikach, którzy mogą przełączać się z jednego motywu na inny. Biblioteka TGM Plugin Activation oferuje naprawdę sprytny sposób na zrobienie tego. Co myślisz o tym narzędziu? Czy kiedykolwiek go używałeś, czy planujesz używać go w przyszłości? Podziel się swoimi przemyśleniami! Tworzymy własną stronę rejestracji dla wielu witryn zamiast standardowego wp-signup.php. W typowej instalacji WordPress na stronie rejestracji (autoryzacji, resetowania hasła) jest wyświetlany plik wp-login.php. Istnieją oddzielne warunki dla wielu lokalizacji w wp-login.php. Tak więc, podążając za linkiem /wp-login.php?action\u003dregister na multisite, WordPress przekieruje do strony /wp-signup.php. W wielu motywach strona nie wygląda zbyt atrakcyjnie, więc stworzymy własną. Domyślnie WordPress otwiera stronę rejestracji (wp-signup.php) w \u200b\u200bdomenie głównej (witrynie) sieci. Możesz jednak utworzyć osobną stronę rejestracji dla każdej witryny w sieci, nawet jeśli mają one różne motywy. Rozważymy przypadek, w którym wszystkie witryny w sieci mają własną stronę rejestracyjną, ale używany jest ten sam motyw, a witryny różnią się tylko językiem. Jeśli używane są różne motywy, trzeba będzie napisać więcej kodu. Nie. Wydaje się, że nazwa tego pliku jest wymieniana w każdym artykule WordPress. W naszym przypadku, biorąc pod uwagę, że funkcja rejestracji jest przeznaczona dla kilku witryn, sensowne jest przeniesienie jej do wtyczek MU, które są ładowane podczas otwierania dowolnej witryny. Warto zauważyć, że wtyczki MU są ładowane wcześniej niż zwykłe wtyczki i zanim rdzeń WordPress zostanie w pełni załadowany, więc wywołanie niektórych funkcji może prowadzić do fatalnych błędów w PHP. To „wczesne” ładowanie ma również swoje zalety. Na przykład w żadnym motywie nie możesz trzymać się niektórych akcji, które są uruchamiane nawet przed załadowaniem pliku functions.php z motywu. Przykładem tego są akcje z wtyczki Jetpack w postaci jetpack_module_loaded_related-posts (related-posts - nazwa modułu), za pomocą których można śledzić aktywność modułów w Jetpack. Nie można „przylgnąć” do tej akcji z pliku motywu, ponieważ akcja zadziałała już przed załadowaniem motywu - wtyczki są ładowane przed motywami. Ogólny obraz kolejności ładowania WordPressa można znaleźć na stronie Action Reference w kodeksie. Wtyczki MU mogą zawierać dowolną liczbę plików i dowolną strukturę, która wydaje Ci się logiczna. Trzymam się czegoś takiego jak ta hierarchia: | -mu-plugins | - | -load.php | - | - | -selena-network | - | - | - | -signup | - | - | - | - | -plugin.php | - | - | - | - | -... | - | - | - | -jetpack | - | - | - | - | -plugin.php Wszystkie potrzebne "wtyczki" do naszej sieci są połączone w pliku load.php: // Załaduj Traslates dla wszystkich dodatków load_muplugin_textdomain ("selena_network", "/ selena-network / languages \u200b\u200b/"); // Rejestracja w sieci wymaga WPMU_PLUGIN_DIR. „/selena-network/signup/plugin.php”; // Kolejne wtyczki // wymagają WPMU_PLUGIN_DIR ... Wewnątrz folderu selena-network znajdują się foldery wtyczek, każdy ma swój własny plugin.php, który umieszczamy w load.php. Zapewnia to elastyczność i możliwość szybkiego włączania i wyłączania. Aby określić adres strony rejestracji, używany jest filtr wp_signup_location. Można go znaleźć w pliku wp-login.php i jest on odpowiedzialny za przekierowanie do wp-signup.php. Case "register": if (is_multisite ()) (wp_redirect (apply_filters ("wp_signup_location", network_site_url ("wp-signup.php"))); exit; Dodajmy naszą funkcję do mu-plugins / selena-network / signup / plugin.php, która zwróci adres strony rejestracyjnej w bieżącej witrynie: Funkcja selena_network_signup_page ($ url) (return home_url (). "/ Rejestracja /";) add_filter ("wp_signup_location", "selena_network_signup_page", 99); selena_network to prefiks, którego używam w nazwach wszystkich funkcji we wtyczkach MU na mojej stronie, aby uniknąć kolizji, należy go zastąpić własnym unikalnym prefiksem. Filtr ma priorytet 99, ponieważ niektóre wtyczki, takie jak bbPress i BuddyPress, mogą nadpisać ten adres URL własnym (wtyczki MU ładują się wcześniej niż zwykłe wtyczki, patrz wyżej). Zauważ, że home_url () jest używane zamiast network_site_url (), aby utrzymać gościa w tej samej domenie. Jako adresu można użyć dowolnego adresu URL. Teraz stwórzmy stronę z adresem site.com/signup/ za pośrednictwem zwykłego interfejsu, aw folderze motywów potomnych szablon naszej nowej strony to page-signup.php. Zamiast słowa „rejestracja” można użyć unikalnego identyfikatora. Wewnątrz nowego szablonu należy wywołać funkcję selena_network_signup_main (), która wyświetli formularz rejestracyjny. Warto zauważyć, że cały proces z szablonami nie jest wymagany, a zamiast tego możesz utworzyć własny shortcode, który będzie również wywoływał funkcję selena_network_signup_main (). Teraz zacznijmy tworzyć funkcję, która wyświetli formularz rejestracyjny. Aby to zrobić, skopiuj pliki wp-signup.php i wp-activ.php z katalogu głównego WordPress do mu-plugings / selena-network / signup / (i nie zapomnij podłączyć ich do mu-plugins / selena-network / signup / plugin.php) ... Dalsze manipulacje plikami są niezwykle trudne i czasochłonne do opisania, więc będziesz musiał je wykonać samodzielnie. Po prostu opiszę, co dokładnie należy zrobić i opublikuję pliki źródłowe mojego projektu: Wewnątrz wp-activ.php musisz zrobić coś podobnego: Plik wp-activ.php jest odpowiedzialny za stronę aktywacji konta. Podobnie jak w przypadku strony rejestracji, musisz utworzyć dla niej osobny szablon, w którym wywołasz funkcję z pliku wp-activ.php. Strona rejestracji wysyła odwiedzającemu wiadomość e-mail z linkiem do aktywacji konta. Domyślnie robi to funkcja wpmu_signup_user_notification () z pliku ms-functions.php. Jego funkcjonalność można wypożyczyć na potrzeby swojej funkcji. Powodem zaprzestania korzystania z tej funkcji jest wysłanie linku aktywacyjnego konta z wp-activ.php. Możesz "wyłączyć" tę funkcję za pomocą filtru wpmu_signup_user_notification, podając na niej fałsz (jeśli tego nie zrobisz, list aktywacyjny zostanie wysłany dwa razy, w rzeczywistości dwie różne litery). Funkcja armyofselenagomez_wpmu_signup_user_notification ($ user, $ user_email, $ key, $ meta \u003d array ()) (// ... // Kod z funkcji wpmu_signup_user_notification () wp_mail ($ user_email, wp_specialchars_decode ($ message_headers), $ message) ; return false;) add_filter ("wpmu_signup_user_notification", "armyofselenagomez_wpmu_signup_user_notification", 10, 4); W rezultacie strona rejestracyjna w motywie Selena wygląda na znacznie czystszą i dokładniejszą. Istnieje wiele innych niezbyt poprawnych sposobów w Internecie, aby zrobić to samo - przekierowania Apache, formularze AJAX, które nie będą działać bez Java Script itp. Nie podobało mi się to wszystko, więc starałem się to zrobić tak poprawnie, jak to możliwe na moim własna strona internetowa. Pamiętaj, że powinieneś ostrożnie edytować pliki i starać się nie odbiegać zbytnio od oryginału, aby w przyszłości, jeśli WordPress zmienił pliki wp-signup.php i wp-activ.php, łatwiej będzie je porównać w celu znalezienia zmian. Nie zapomnij zajrzeć do kodu źródłowego wszystkich opisanych powyżej funkcji, aby w pełni zrozumieć, co i jak dzieje się w kodzie. Nawet najmniejsze witryny WordPress są często rejestrowane jako spam. Możesz pisać nieskończone warunki do filtrowania botów, często bardziej jak próby stworzenia sztucznej inteligencji 🙂 W przypadku multisite, zwykłe przekierowanie w Apache bardzo mi pomogło, z pomocą którego przy otwieraniu /wp-signup.php i /wp-acitvate.php poprosiłem o 404 (Nie jestem ekspertem w konfiguracji Apache, więc moje reguły mogą nie być zbyt poprawne). RewriteEngine On RewriteBase / RewriteRule ^ wp-signup \\ .php - RewriteRule ^ wp-activ \\ .php - # BEGIN WordPress # Nie dotykaj reguł WordPress domyślnie :) # ... # END WordPress P. S. Staram się opisać jak najdokładniej niektóre rzeczy osób trzecich, ponieważ kiedy zaczynałem, czasami nie było nikogo, kto podpowiadałby i wyjaśniał wiele rzeczy. Wierzę też, że takie drobne wskazówki dotyczące innych materiałów skłonią kogoś do nauczenia się czegoś nowego i poszerzenia swojej dziedziny wiedzy. Wyrażenia regularne są używane we wpisach RewriteRule, wcale nie są złożone, na przykład znak ^ oznacza początek wiersza. Rejestruje funkcję do uruchomienia, gdy wtyczka jest aktywowana. Ta funkcja dołącza określoną funkcję zwrotną do zaczepu activ_ (wtyczka) i jest opakowaniem wokół tego zaczepu. (wtyczka) w zaczepie activ_ (plugin) jest zastępowana nazwą wtyczki względnej w głównym pliku wtyczki. Na przykład, jeśli wtyczka jest zlokalizowana: wp-content / plugins / sampleplugin / sample.php, nazwa hooka będzie miała postać: activ_sampleplugin / sample.php. Od wersji 3.1.0 Hak jest uruchamiany tylko wtedy, gdy wtyczka jest aktywowana i nie uruchamia się, gdy wtyczka jest automatycznie aktualizowana. Wtyczka jest aktywowana przez funkcję activ_plugin (), w której wyzwalany jest zaczep activ_ (plugin). Funkcja activ_plugin () w jądrze jest wywoływana po załadowaniu środowiska VI. Ta funkcja zawiera główny plik wtyczki (i wszystko, co jest w nim określone), a następnie aktywuje określoną funkcję zwrotną za pośrednictwem zaczepu. Z tego powodu wszystkie funkcje i klasy wtyczki są dostępne w naszej funkcji wywołania zwrotnego. Ale ponieważ wszystkie główne punkty zaczepienia WP zostały już wyzwolone podczas ładowania środowiska VI, żadne zdarzenia wtyczek zawieszone na zaczepach, na przykład plugins_loaded, nie będą już uruchamiane, gdy główny plik wtyczki jest podłączony. Oznacza to, że nasza wtyczka zostanie podłączona, ale nie do końca: nie tak, jak powinna być podłączona, gdy jest już aktywowana. Na przykład, jeśli wtyczka zrobi coś podczas zdarzenia plugins_loaded, wszystkie te działania po prostu nie będą miały miejsca, gdy wtyczka zostanie aktywowana. Na przykład, jeśli podłączy plik tłumaczeniowy, to plik tłumaczenia nie zostanie połączony w momencie wywołania funkcji zwrotnej określonej dla register_activation_hook (). Z reguły po wyzwoleniu funkcji zwrotnej występują 2 zdarzenia, na których można zawiesić funkcje: active_plugin i shutdown. Aby zrobić coś niezwykłego podczas aktywacji wtyczki, zobacz przykład 5. Funkcja nie zadziała, jeśli wywołasz ją w momencie wyzwalania hooka, na przykład plugins_loaded, init. Funkcję należy wywołać bezpośrednio z głównego pliku wtyczki. Zasady aktywacji: register_activation_hook () należy wywołać z głównego pliku wtyczki, w którym znajduje się dyrektywa Plugin Name: ..., i nie należy go wywoływać z żadnego podpięcia, takiego jak plugins_loaded lub init. Funkcja przechwytywania musi znajdować się w tym samym pliku co punkt zaczepienia lub być wcześniej zawarta w innym pliku. W funkcji hook, wyjście do ekranu (echo) nie działa. Ponieważ istnieje przekierowanie i nie zobaczysz echa. Ale można użyć funkcji die (). Kiedy wtyczka jest aktywowana, główny plik wtyczki nie jest objęty zakresem globalnym, ale znajduje się w funkcji activ_plugin (). Dlatego zmienne, które są uważane za globalne w normalnym działaniu wtyczki, nie będą globalne. Na przykład funkcja używana w register_activation_hook () może nie widzieć zmiennych globalnych, nawet jeśli zadeklarowałeś je jako globalne wewnątrz tej funkcji. Przykład: $ myvar \u003d "coś"; register_activation_hook (__ FILE__, "myplugin_activate"); function myplugin_activate () (global $ myvar; echo $ myvar; // Zmienna nie jest równa „coś”) Z tego powodu zmienne globalne zawsze muszą być jawnie określone. Wszystkie zmienne globalne muszą być zdefiniowane jako globalne, nawet jeśli zmienna jest określona w treści wtyczki. Tylko w takim przypadku będzie do nich dostęp w dowolnym miejscu. Przykład: Global $ myvar; // wyraźnie wskazuje, że jest to zmienna globalna $ myvar \u003d "coś"; register_activation_hook (__ FILE__, "myplugin_activate"); function myplugin_activate () (global $ myvar; echo $ myvar; //\u003e coś) Nie ma haczyków. zero. Nic nie zwraca. Nazwa funkcji zwrotnej. W przypadku klas użyj tablicy: array ($ this, "nazwa_funkcji"); ... Funkcja otrzyma zmienną boolowską $ network_wide - czy wtyczka jest aktywowana dla całej sieci witryn w przypadku wielu witryn. Załóżmy, że mamy funkcję my_plugin_activate () w głównym pliku wtyczki: wp-content / plugins / myplugin / myplugin.php, a następnie, aby uruchomić tę funkcję podczas aktywacji wtyczki, użyj następującego kodu: Register_activation_hook (__ FILE__, "my_plugin_activate"); function my_plugin_activate () (// Kod aktywacyjny ...) Jeśli wtyczka używa klasy PHP, kod aktywacyjny jest dodawany w następujący sposób: Register_activation_hook (__ FILE__, array ("My_Plugin", "install")); class My_Plugin (static function install () (// Nie twórz tutaj żadnych danych wyjściowych ...)) Jeśli klasa zawierająca funkcję aktywacji znajduje się w osobnym pliku, zarejestruj funkcję aktywacji w następujący sposób: Uwzględnij_once __DIR__. "/class-My_Plugin.php"; register_activation_hook (__ FILE__, array ("My_Plugin", "on_activate_function")); Jeśli jesteś w środku __construct (). Co ważne, __FILE__ musi „spojrzeć” na główny plik wtyczki: Register_activation_hook (__ PLIK__, tablica ($ this, "NAZWA_TWOJEGO_METODU")); Po aktywacji wtyczki wyzwalane są tylko dwa zaczepy: active_plugin i shutdown. Kiedy musisz coś zrobić od razu po aktywacji wtyczki, możesz dołączyć do niej funkcję. Gdy takie rozwiązanie nie działa, możesz skorzystać z opcji WP: zapisz dane do opcji, a następnie sprawdź opcję i zrób coś, jeśli opcja jest: // Główny plik wtyczki. ... function my_plugin_activate () (// dodaj opcję, aby później, jeśli jest ktoś, kto może coś zrobić. add_option ("Activated_Plugin", "Plugin-Slug"); // Oto kod aktywacyjny ...) register_activation_hook (__ FILE__, " my_plugin_activate "); function load_plugin () (if (is_admin () && get_option ("Activated_Plugin") \u003d\u003d "Plugin-Slug") (// usuń dodaną opcję, aby przestała działać // i zrób to, czego potrzebujemy ... delete_option ("Activated_Plugin "); // Zrób coś raz, po aktywacji wtyczki // Na przykład: add_action (" init "," my_init_function ");)) add_action (" admin_init "," load_plugin "); Inną opcją zrobienia czegoś podczas aktywacji wtyczki jest utworzenie wydarzenia w następujący sposób: Funkcja my_plugin_activate () (// Zainstaluj nasz własny hook, abyś mógł się do niego podłączyć z plików samej wtyczki do_action ("my_plugin_activate");) register_activation_hook (__ FILE__, "my_plugin_activate"); Mała wtyczka pokazująca, jak korzystać z funkcji: / * Nazwa wtyczki: A Opis testu: Test * / require_once dirname (__ FILE__). „/my_other_file.php”; / * Ten kod nie będzie działał. Zaczep aktywacyjny należy wywołać z pliku głównego. register_activation_hook (dirname (__ FILE__). "/my_other_file.php", "my_other_function"); * / // To działa kod. register_activation_hook (__ FILE__, "test_activated"); / * To jest poprawny sposób deklarowania zmiennych globalnych i uzyskiwania do nich dostępu. Zmienne globalne muszą być jasno zadeklarowane. Bez tego nie będziesz miał do nich dostępu. * / global $ some_var; $ some_var \u003d "hej"; // Funkcja aktywacji test_activated () (// tutaj $ some_var nie będzie równe hey global $ some_var; // A tutaj $ some_var będzie równe hey // Ta funkcja jest zdefiniowana w pliku "my_other_file.php" my_other_function (); / * To to nie zadziała. Jeśli chcesz zapisać dzienniki do pliku tymczasowego, użyj fopen / fwrite. Jeśli chcesz sprawdzić, czy hak aktywacji działa, użyj exit () wewnątrz funkcji przechwytującej. * / echo "test_activated nazwane!";) Umożliwia korzystanie z jednej instalacji WordPress dla wielu witryn jednocześnie. Ponadto każda witryna otrzymuje w bazie danych własne tabele z unikalnym prefiksem. Tabele z danymi zarejestrowanych użytkowników są wspólne dla wszystkich witryn w sieci. To zdecydowany plus i rejestrując się raz można uzyskać dostęp do kilku stron. Ponadto w każdej witrynie to samo konto może mieć różne uprawnienia. Na przykład w jednej witrynie użytkownik może być redaktorem, a na innej administratorem. W typowej instalacji WordPressa strona rejestracji, logowania i resetowania hasła wyświetla plik wp-login.php. W trybie wielu witryn rdzeń WordPress zaczyna zachowywać się nieco inaczej i po kliknięciu linku wp-login.php? Action \u003d register nastąpi przekierowanie do wp-signup.php. To jest strona rejestracji Twojej sieci, którą WordPress ma domyślnie. Oprócz rejestracji zwykłych kont użytkowników możesz utworzyć na niej nową witrynę internetową, jeśli superadministrator włączył tę funkcję w ustawieniach sieci (Administrator sieci → Ustawienia → Ustawienia sieciowe). W większości motywów strona rejestracyjna nie wygląda dobrze. Wiele skórek używa frameworków CSS, takich jak Bootstrap, i własnych, specyficznych klas, aby nadać styl różnym elementom na stronach, więc trudno jest napisać jeden kod HTML, który działa dla wszystkich. Ale nie rozpaczaj, jeśli strona wygląda nieporządnie. Plik wp-signup.php jest na początku świetny, gdy nie masz czasu na przeanalizowanie każdego szczegółu witryny - możesz skupić się na innych, ważniejszych stronach i treściach. Kiedy będziesz gotowy do stworzenia własnej strony rejestracji, wp-signup.php będzie dobrym przykładem i przykładem, aby łatwo zrozumieć zakres funkcji, które oferuje WordPress do obsługi i sprawdzania poprawności danych wejściowych użytkownika oraz tworzenia nowych kont. Domyślnie WordPress otwiera stronę rejestracji (wp-signup.php) w \u200b\u200bgłównej domenie (witrynie) sieci. Możesz jednak utworzyć strony rejestracyjne dla każdej witryny w sieci, nawet jeśli mają one motywy. Rozważymy przypadek, gdy wszystkie witryny w sieci używają tego samego motywu, ale każda z nich ma stronę rejestracji. Witryny różnią się językiem (angielski i rosyjski), więc strona rejestracyjna będzie wyświetlana w „ojczystym” języku witryny. Jeśli witryny używają różnych motywów, wszystko będzie zależeć od tego, jakiego rodzaju są to motywy, od tego, czy odpowiada im ten sam układ (doskonała sytuacja, która może zmusić Cię do ujednolicenia wszystkich motywów), czy też warto opracować strony indywidualnie. Wtyczki MU mogą zawierać dowolną liczbę plików i strukturę, która wydaje się logiczna. Trzymam się czegoś takiego jak ta hierarchia: | mu-pluginy | | load.php | | selena-network | | | rejestracja | | | | plugin.php | | | ... | | | plecak odrzutowy | | | | plugin.php Plik load.php zawiera tłumaczenia i wszystkie niezbędne „wtyczki”: // Załaduj tłumaczenia dla wtyczek MU load_muplugin_textdomain ("selena_network", "/ selena-network / languages \u200b\u200b/"); // Funkcjonalne dla strony rejestracji wymaga WPMU_PLUGIN_DIR. „/selena-network/signup/plugin.php”; // Inna wtyczka // wymaga WPMU_PLUGIN_DIR ... Foldery wtyczek są przechowywane w katalogu selena-network. Każdy ma swój własny plugin.php, który umieszczamy w load.php. Daje to elastyczność i możliwość natychmiastowego wyłączania i włączania poszczególnych komponentów w działającym projekcie w nagłych przypadkach. Po ustaleniu, gdzie i jak napiszemy kod, możemy przystąpić do tworzenia strony rejestracyjnej. Utwórzmy stronę z adresem example.org/signup/ za pomocą zwykłego interfejsu. Jako adres możesz użyć dowolnego adresu URL, który wydaje się odpowiedni dla Twojego projektu. Aby WordPress wiedział o naszej nowej stronie rejestracji i przekierował do niej, po kliknięciu linku „Zarejestruj się”, używany jest filtr wp_signup_location. Można go znaleźć w wp-login.php i domyślnie odpowiada za przekierowanie do wp-signup.php. Case "register": if (is_multisite ()) (wp_redirect (apply_filters ("wp_signup_location", network_site_url ("wp-signup.php"))); exit; // ... Jak pamiętasz, strona rejestracji domyślnie otwiera się na głównej domenie sieci. Z tego powodu używana jest tutaj network_site_url (). Dodaj naszą obsługę do filtra w mu-plugins / selena-network / signup / plugin.php, co zwróci adres strony rejestracji w bieżącej witrynie: Funkcja selena_network_signup_page ($ url) (return home_url ("rejestracja");) add_filter ("wp_signup_location", "selena_network_signup_page", 99); selena_network to prefiks, którego używam w nazwach wszystkich funkcji we wtyczkach MU na mojej stronie, aby uniknąć kolizji, należy go zastąpić własnym unikalnym prefiksem. Filtr ma priorytet 99, ponieważ niektóre wtyczki, takie jak bbPress i BuddyPress, mogą nadpisać ten adres URL własnym (wtyczki MU ładują się wcześniej niż zwykłe wtyczki, patrz wyżej). Zauważ, że używana jest home_url (), która w przeciwieństwie do network_site_url () zwraca adres bieżącej witryny, a nie głównej witryny sieci. Plik wp-signup.php zawiera wiele funkcji i kodu. Aby zobaczyć większy obraz, możesz użyć zwijania kodu. W języku angielskim jest to zwykle nazywane „składaniem kodu”. Na samym początku pliku od 1 do 80 linii (w wersji 4.1.1) różne sprawdzenia i wyjście "początku" strony są wykonywane za pomocą funkcji get_header (). Następnie deklarowanych jest wiele metod i zanim zaczniemy z nimi pracować, warto zrozumieć, co robi każda funkcja. Wielu z nich często używa innych funkcji z prefiksem wpmu_ wewnątrz, z których wszystkie są zadeklarowane w pliku wp-include / ms-functions.php. Ta sekcja jest trudna do zrozumienia bez samodzielnego zobaczenia kodu. Poniżej znajduje się krótki opis głównych funkcji w przypadku problemów. Na samym dole pliku wp-signup.php (z linii 646 w wersji 4.1.1), główna logika strony rejestracji, która używa wszystkich powyższych metod. Ta część kodu nie jest zawarta w funkcji. Na koniec wywoływana jest get_footer (). Następnie opiszemy procedurę kopiowania wp-signup.php do wtyczek MU i dokonywania zmian w „rozwidleniu”. Może to nie wydaje się właściwe. Zamiast tego możesz napisać własną walidację formularzy i wyświetlać od podstaw funkcje, używając klas zamiast zwykłych funkcji. Moim zdaniem wp-signup.php ma już całą niezbędną logikę dla naszej strony, pozostaje tylko wprowadzić małe zmiany. Kiedy aktualizujesz WordPress, wp-signup.php zmienia się od czasu do czasu, ale nie oznacza to, że będziesz musiał zsynchronizować widelec z każdym wydaniem. Funkcje wewnątrz wp-signup.php są zasadniczo zaangażowane tylko w wyjście HTML, walidację danych, tworzenie kont i witryn, w tym metody z prefiksem wpmu_, zadeklarowane w ms-functions.php. Zacznijmy tworzyć funkcję, która wyświetli formularz rejestracyjny na stronie. Aby to zrobić, skopiuj wp-signup.php z katalogu głównego WordPressa do mu-plugings / selena-network / signup /. Połączmy go wewnątrz mu-plugins / selena-network / signup / plugin.php). Wymagaj WPMU_PLUGIN_DIR. „/selena-network/signup/wp-signup.php”; Usuń wszystkie wymagane i niepotrzebne sprawdzenia od samego początku kopiowanego pliku. W wersji 4.1.1 jest to cały kod od 1 do 80 linii. Jesteśmy teraz gotowi do stworzenia głównej funkcji do wyświetlania formularza rejestracyjnego. Aby to zrobić, przenieś całą logikę z wiersza 646 na sam koniec pliku do funkcji o nazwie selena_network_signup_main. Na samym końcu usuniemy dwa dodatkowe zamknięciaCzek
Wynik
Funkcjonalność motywu: inwazja na terytorium wtyczki
Wprowadzenie do biblioteki aktywacji wtyczek TGM
Konfigurowanie aktywacji wtyczki TGM
"mytheme-tgmpa", // twój unikalny identyfikator TGMPA "default_path" \u003d\u003e get_stylesheet_directory (). "/ lib / plugins /", // domyślna ścieżka bezwzględna "menu" \u003d\u003e "mytheme-install-required-plugins", // menu slug "has_notices" \u003d\u003e true, // Pokaż powiadomienia administratora "discissable" \u003d\u003e false , // powiadomień NIE można odrzucić "dismiss_msg" \u003d\u003e "Naprawdę, naprawdę potrzebuję, abyś zainstalował te wtyczki, ok?", // ta wiadomość zostanie wyświetlona na początku nag "is_automatic" \u003d\u003e true, // automatycznie aktywuj wtyczki po instalacji "message" \u003d\u003e "", // wiadomość do wyprowadzenia bezpośrednio przed tabelą wtyczek" strings "\u003d\u003e array (); // Tablica ciągów komunikatów, których używa TGM Plugin Activation);?\u003e Wniosek
Strona główna sieci
functions.php?
Liryczna dygresja
Zamów w plikach
Adres strony rejestracji
Utwórz stronę
wp-signup.php i wp-activ.php
Wysyłamy listy aktywacyjne
Wniosek
Premia. Ochrona przed spamem
Jak to działa
Warunki korzystania
Uwaga na temat zmiennego zakresu
Zwroty
Za pomocą
register_activation_hook (plik $, funkcja $); $ plik (ciąg) (wymagane) Ścieżka do głównego pliku php wtyczki, w tym nazwa samej wtyczki. Zwykle używana jest magiczna stała PHP __FILE__. Funkcja $ (ciąg / tablica / lambda) (wymagane)
Przykłady
# 1. Uruchamianie funkcji podczas aktywacji wtyczki
# 2. Uruchamianie metody klasowej
# 3. Uruchamianie metody klasy z osobnego pliku
# 4. Uruchamianie metody klasy z samej klasy
# 5 Zrób coś zaraz po aktywacji wtyczki
# 6 Kolejna demonstracja użycia funkcji
Strona główna sieci
Alternatywa dla functions.php
Zamów w plikach
Strona rejestracji
Przekieruj na wymaganą stronę rejestracji
Funkcjonalność wp-signup.php
Skopiuj funkcjonalność wp-signup.php