DZWONEK

Są tacy, którzy czytają tę wiadomość przed tobą.
Zapisz się, aby otrzymywać najnowsze artykuły.
E-mail
Nazwa
Nazwisko
Jak chcesz przeczytać The Bell
Bez spamu

Łą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<<

Czek

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.

Wynik

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.

Funkcjonalność motywu: inwazja na terytorium wtyczki

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.

Wprowadzenie do biblioteki aktywacji wtyczek TGM

Konfigurowanie aktywacji wtyczki TGM

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:

  • id (string) - unikalny identyfikator biblioteki TGM Plugin Activation w Twoim motywie. Jest to bardzo ważne: jeśli inne wtyczki również używają aktywacji wtyczki TGM, różne identyfikatory zapobiegną możliwym konfliktom.
  • default_path (string) - domyślna ścieżka bezwzględna do wtyczek w Twoim motywie. Po zainstalowaniu możesz użyć nazwy pliku zip jako wartości parametru źródłowego dla wtyczki.
  • menu (string) - slug menu dla strony instalacji wtyczki.
  • has_notices (boolean) - jeśli ustawione na true, powiadomienia administratora będą wysyłane dla wymaganych / zalecanych wtyczek.
  • odrzucalne (boolean) - jeśli ustawione na true, użytkownik może „zamknąć” powiadomienia.
  • dismiss_msg (string) - jeśli opcja odrzucenia jest ustawiona na false, ta wiadomość zostanie pokazana nad powiadomieniem administratora.
  • is_automatic (boolean) - jeśli ustawione na true, wtyczki będą aktywowane po wyrażeniu zgody przez użytkownika na ich instalację.
  • message (string) - dodatkowy kod HTML wyświetlany przed tabelą wtyczek.
  • strings (array) - tablica zawierająca komunikaty do wyświetlenia. Możesz zdefiniować je jako przetłumaczone ciągi. Spójrz na plik example.php, aby uzyskać pełną listę wszystkich postów.
"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

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.

  • /wp-login.php - autoryzacja
  • /wp-login.php?action\u003dregister - rejestracja
  • /wp-login.php?action\u003dlostpassword - resetowanie hasła

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

Strona główna sieci

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.

functions.php?

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.

Liryczna dygresja

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.

Zamów w plikach

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.

Adres strony rejestracji

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.

Utwórz stronę

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 ().

wp-signup.php i wp-activ.php

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:

  1. Na początku pliku usuń wszystkie wymagania, wywołania funkcji i inny kod poza funkcjami.
  2. Zmień nazwy wszystkich funkcji, dodając do nazw unikalne przedrostki.
  3. Owiń dolną część kodu wp-signup.php w funkcji selena_network_signup_main i na samym początku napisz global $ active_signup; ...
  4. Zastąp układ własnym w odpowiednich miejscach.

Wewnątrz wp-activ.php musisz zrobić coś podobnego:

  1. Usuń cały kod poza funkcjami, zawiń układ w osobną funkcję.
  2. Zmień układ w miejscach, w których jest to konieczne.

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.

Wysyłamy listy aktywacyjne

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

Wniosek

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.

Premia. Ochrona przed spamem

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.

Jak to działa

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.

Warunki korzystania

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 ().

  1. Zmienne globalne (jeśli istnieją) muszą być zdefiniowane jawnie, aby można było uzyskać do nich dostęp z funkcji hook.

Uwaga na temat zmiennego zakresu

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.

Zwroty

zero. Nic nie zwraca.

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)

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.

Przykłady

# 1. Uruchamianie funkcji podczas aktywacji wtyczki

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

# 2. Uruchamianie metody klasowej

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

# 3. Uruchamianie metody klasy z osobnego pliku

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"));

# 4. Uruchamianie metody klasy z samej klasy

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"));

# 5 Zrób coś zaraz po aktywacji wtyczki

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");

# 6 Kolejna demonstracja użycia funkcji

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.

  • wp-login.php - autoryzacja
  • wp-login.php? action \u003d register - rejestracja
  • wp-login.php? action \u003d lostpassword - resetowanie hasła

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.

Strona główna sieci

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.

Alternatywa dla functions.php

Zamów w plikach

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.

Strona rejestracji

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.

Przekieruj na wymaganą stronę rejestracji

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.

Funkcjonalność wp-signup.php

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.

  • wpmu_signup_stylesheet () - Wyświetla dodatkowy kod CSS na stronie rejestracji.
  • show_blog_form () - pola do rejestracji serwisu (adres, nazwa, widoczność dla wyszukiwarek).
  • validate_blog_form () - sprawdź poprawność wprowadzonego adresu i nazwy witryny za pomocą wpmu_validate_blog_signup ().
  • show_user_form () - pola do rejestracji użytkownika (login i adres e-mail).
  • validate_user_form () - walidacja wprowadzonego loginu i adresu e-mail. poczta za pomocą wpmu_validate_user_signup ().
  • signup_another_blog () - pola do rejestracji nowych witryn za pomocą funkcji show_blog_form () dla użytkowników, którzy są już zarejestrowani w serwisie.
  • validate_another_blog_signup () - sprawdza poprawność adresu URL i tytułu witryny za pomocą validate_blog_form ().
  • signup_user () to główna funkcja służąca do wyświetlania pól strony rejestracji.
  • validate_user_signup () - sprawdza nazwę użytkownika i adres e-mail. poczta przy użyciu validate_user_form ().
  • signup_blog () - pola do wpisania adresu, nazwy i widoczności strony (drugi krok rejestracji) przy pomocy show_blog_form ().
  • validate_blog_signup () - weryfikuje login, adres e-mail. poczta, adres i nazwa witryny.

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 ().

Skopiuj funkcjonalność wp-signup.php

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ęcia

(linie 722 i 723), a także wywołanie get_footer ().

W nowo utworzonej selena_network_signup_main () na samym początku deklarujemy zmienną globalną active_signup, która jest używana przez wszystkie inne metody z tego pliku. Dodajmy też wywołanie do zdarzenia before_signup_form, które usunęliśmy na samym początku pliku.

Funkcja selena_network_signup_main () (globalna $ active_signup; do_action ("before_signup_form"); // ...)

Teraz pozostaje tylko zmienić układ we wszystkich miejscach, w których jest to konieczne, a strona rejestracyjna jest gotowa.

Wyjście formularza rejestracyjnego

Istnieją co najmniej dwie opcje. Wygodniejszym sposobem jest utworzenie shortcode i umieszczenie go na stronie przy użyciu zwykłego edytora.

// Utwórz krótki kod network_signup add_shortcode ("network_signup", "selena_network_signup_main");

Drugą opcją jest utworzenie szablonu strony page-signup.php w podrzędnym folderze motywów. Zamiast słowa „rejestracja” możesz użyć unikalnego identyfikatora przypisanego do strony. Wewnątrz szablonu dodaj wymagany układ i wywołaj selena_network_signup_main () we właściwym miejscu.

W rezultacie moja strona rejestracyjna wygląda o wiele lepiej i bardziej czytelnie.

Strona aktywacji

Domyślnie WordPress tradycyjnie dzieli proces rejestracji w Multisite na dwa etapy - wypełnienie formularza w serwisie i aktywację konta po kliknięciu w link przesłany w mailu. Po wypełnieniu formularza utworzonego w poprzedniej sekcji WordPress wyśle \u200b\u200bwiadomość e-mail z krótką instrukcją i linkiem do aktywacji konta.

Za wyświetlanie strony aktywacyjnej odpowiada plik wp-activ.php znajdujący się w katalogu głównym WordPressa. wp-activ.php można również całkowicie zmienić. Proces jest podobny do tego, co już zrobiliśmy dla wp-signup.php.

Utwórzmy stronę example.org/activate/ za pomocą zwykłego interfejsu. Użyj dowolnego adresu URL, który uważasz za odpowiedni dla adresu.

Skopiujmy plik wp-activ.php do naszych wtyczek MU i połączmy go z mu-plugins / selena-network / signup / plugin.php.

Wymagaj WPMU_PLUGIN_DIR. „/selena-network/signup/wp-activate.php”;

Wewnątrz nie ma zbyt wiele treści, w przeciwieństwie do wp-signup.php. Plik wykonuje tylko jedną operację - aktywuje konto po odebraniu prawidłowego klucza i wyświetla komunikat o błędzie lub pomyślne zakończenie operacji.

Usuńmy wszystkie niepotrzebne kontrole i wymagamy - od 1 do 69 linii w WordPress 4.1.1. Na sam koniec usuńmy wywołanie get_footer (). Resztę treści przenieś do funkcji selena_network_activate_main ().

Warto zauważyć, że stała WP_INSTALLING została tutaj zadeklarowana przed załadowaniem WordPressa (wp-load.php). Jego obecność sprawia, że \u200b\u200bWordPress nie ładuje wtyczek.

Podobnie jak w przypadku strony rejestracyjnej, pozostaje tylko skorygować układ w razie potrzeby. Możesz także zmienić tekst wyświetlanych wiadomości (w tym przypadku nie zapomnij dodać domeny tekstowej swoich wtyczek MU do wszystkich funkcji tłumacza, domyślnie nie jest ona nigdzie instalowana).

Gotową funkcję można wykorzystać na wcześniej utworzonej stronie za pomocą shortcode lub osobnego szablonu w motywie potomnym.

E-maile aktywacyjne z poprawnymi linkami

Strona aktywacyjna jest gotowa do pracy, ale WordPress o tym nie wie i nadal będzie wysyłać e-maile aktywacyjne z linkiem do wp-activ.php. W przeciwieństwie do wp-signup.php, nie ma filtra do zmiany adresu. Zamiast tego musisz napisać własną funkcję, która będzie wysyłać e-maile z poprawnymi linkami.

W momencie wypełniania i przesyłania formularza na stronie rejestracyjnej WordPress wywołuje wpmu_signup_ użytkownik() lub wpmu_signup_ blog() w zależności od rodzaju rejestracji. Obie funkcje tworzą nowy rekord w tabeli wp_signups, wypełniając go niezbędną zawartością, w tym kluczem aktywacyjnym konta.

Następnie, w zależności od funkcji, wywoływana jest funkcja wpmu_signup_ użytkownik_notification () lub wpmu_signup_ blog_powiadomienie (). Obie funkcje mają podobną funkcjonalność - generują i wysyłają wiadomość e-mail z linkiem aktywacyjnym, ale akceptują różne argumenty. Oba mają filtry do „przechwytywania” zdarzenia.

Jeśli (! Apply_filters ("wpmu_signup_user_notification", $ user, $ user_email, $ key, $ meta)) return false;

Aby aktywować konta poprzez utworzenie bloga:

Jeśli (! Apply_filters ("wpmu_signup_blog_notification", $ domain, $ path, $ title, $ user, $ user_email, $ key, $ meta)) (return false;)

Pozostaje tylko napisać własne programy obsługi, w których wysyłasz e-maile przez wp_mail (), a na samym końcu podaj false, aby WordPress nie wysłał dwa razy e-maila aktywacyjnego - jeden jest Twój, drugi to domyślny e-mail z linkiem do wp-activ.php.

Funkcja selena_network_wpmu_signup_user_notification ($ user, $ user_email, $ key, $ meta \u003d array ()) (// Wygeneruj nagłówek, tekst i nagłówki wiadomości e-mail // ... // Wyślij wiadomość e-mail lub dodaj zadanie Cron, aby wysłać wiadomość e-mail wp_mail ($ user_email , wp_specialchars_decode ($ subject), $ message, $ message_headers); // Wyślij false, aby uniemożliwić WordPressowi wysłanie e-maila aktywacyjnego dwukrotnie zwróć false;) add_filter ("wpmu_signup_user_notification", "selena_network_wpmu_signup_user_notification", 10, 4);

Jeśli wysyłasz e-maile przez serwer SMTP lub liczba rejestracji jest bardzo duża, powinieneś rozważyć nie wysyłanie e-maili od razu. Zamiast tego możesz dodawać zadania Cron za pomocą WordPress Cron.

Zamknięcie dostępu do wp-signup.php i wp-activ.php

Po utworzeniu własnych stron rejestracji i aktywacji może być konieczne zamknięcie „oryginałów”. Na przykład, jeśli strona rejestracji zawiera dodatkowe pola, które należy wypełnić. Ponadto wiele witryn WordPress podlega rejestracji jako spam.

Aby rozwiązać dwa problemy w jednym kroku, możesz poprosić Apache o zwrot 404, jeśli spróbujesz otworzyć te strony. Aby to zrobić, wystarczy zarejestrować kilka dodatkowych reguł RewriteRules w pliku konfiguracyjnym lub .htaccess.

RewriteEngine On RewriteBase / # Znajomość wyrażeń regularnych nigdy nie będzie zbyteczna :) RewriteRule ^ wp-signup \\ .php - RewriteRule ^ wp-activ \\ .php - # BEGIN WordPress # Nie dotykaj reguł WordPress domyślnie :) # ... # KONIEC WordPress

Wniosek

Istnieje wiele rozwiązań tego i wielu innych „problemów” związanych z WordPressem w Internecie. Na przykład, aby utworzyć strony rejestracji i aktywacji, niektórzy sugerują przepisanie oryginalnego pliku wp-signup.php i wp-activ.php. Nie warto tego robić, ponieważ jeśli zaktualizujesz WordPress, stracisz wszystkie zmiany wprowadzone w plikach, a także nie będziesz w stanie sprawdzić integralności rdzenia za pomocą.

Podczas opracowywania dowolnego dodatku, motywu lub rozwiązania powinieneś poświęcić trochę czasu na zapoznanie się z tym, co dzieje się w WordPress. Jest do tego wiele przydatnych narzędzi do debugowania.

P.S.

Aby automatycznie przypisać różne role nowym użytkownikom, możesz użyć wtyczki Multisite User Management.

Jeśli po przeczytaniu artykułu masz jakieś pytania lub trudności podczas tworzenia stron rejestracyjnych i aktywacyjnych, zostaw komentarz, a na pewno odpowiemy.

27.03.2015 27.03.2015

Programista WordPress. Uwielbia porządek we wszystkim i rozumie nowe narzędzia. Zainspirowany architekturą komponentów Symfony.

  • DZWONEK

    Są tacy, którzy czytają tę wiadomość przed tobą.
    Zapisz się, aby otrzymywać najnowsze artykuły.
    E-mail
    Nazwa
    Nazwisko
    Jak chcesz przeczytać The Bell
    Bez spamu