Umożliwia korzystanie z jednej instalacji WordPressa dla wielu witryn jednocześnie. W takim przypadku każda witryna otrzymuje własne tabele w bazie danych z unikalnym prefiksem.

Tabele z danymi zarejestrowanych użytkowników są wspólne dla wszystkich witryn sieci. To zdecydowany plus, a rejestrując się raz, można uzyskać dostęp do kilku stron. Co więcej, w każdej witrynie to samo konto może mieć różne uprawnienia. Na przykład użytkownik może być redaktorem w jednej witrynie, a administratorem w innej.

Normalnie instalacja WordPressa strona rejestracji, autoryzacji i resetowania hasła wyświetla plik wp-login.php.

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

W trybie Multisite rdzeń WordPressa zaczyna zachowywać się nieco inaczej, a po kliknięciu linku wp-login.php?action=register przekieruje do wp-signup.php . To jest strona rejestracji Twojej sieci, która jest domyślnie dostarczana z WordPress.

Oprócz rejestrowania zwykłych kont użytkowników, możesz również utworzyć na nim nową witrynę, jeśli superadministrator włączył tę funkcję w ustawieniach sieci (Administrator sieci → Ustawienia → Ustawienia sieci).

W większości motywów strona rejestracyjna nie wygląda zbyt dobrze. Wiele motywów używa struktur CSS, takich jak Bootstrap i ich własnych klas, do stylizowania różnych elementów na stronie, więc trudno jest napisać pojedynczy kod HTML, który pasuje do wszystkich.

Ale nie rozpaczaj, jeśli strona wygląda nieporządnie. Plik wp-signup.php jest świetny na początku, gdy nie masz czasu na przepracowanie każdego szczegółu witryny - możesz skupić się na innych ważniejszych stronach i treści.

Kiedy będziesz gotowy do stworzenia własnej strony rejestracji, wp-signup.php jest dobrym odniesieniem i przykładem, aby łatwo zrozumieć zakres funkcji, które WordPress zapewnia do przetwarzania i weryfikowania danych wprowadzanych przez użytkownika oraz tworzenia nowych kont.

Strona główna sieci

Domyślnie WordPress otwiera stronę rejestracji (wp-signup.php) w ​​głó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, w którym wszystkie witryny w sieci używają tego samego motywu, ale każda z nich ma stronę rejestracyjną. Witryny różnią się językiem (angielskim i rosyjskim), dlatego strona rejestracji będzie wyświetlana w „ojczystym” języku witryny. W przypadku, gdy witryny używają różnych motywów, wszystko będzie zależeć od tego, jakie są motywy, czy ten sam układ jest dla nich odpowiedni (świetna sytuacja, która może popchnąć Cię do ujednolicenia wszystkich motywów) lub czy warto tworzyć strony indywidualnie.

alternatywa functions.php

Kolejność plików

Wtyczki MU mogą zawierać dowolną liczbę plików i struktur, które wydają się logiczne. Stosuję hierarchię taką jak ta:

| wtyczki mu | | load.php | | sieć seleny | | | zarejestruj się | | | | plugin.php | | | ... | | | plecak odrzutowy | | | | plugin.php

W pliku load.php połączone są tłumaczenia i wszystkie niezbędne „wtyczki”:

// Załaduj tłumaczenia dla wtyczek MU load_muplugin_textdomain("selena_network", "/selena-network/languages/"); // Funkcjonalność strony rejestracji wymaga WPMU_PLUGIN_DIR . "/selena-network/signup/plugin.php"; // Kolejna wtyczka // wymaga WPMU_PLUGIN_DIR ...

Foldery wtyczek są przechowywane w katalogu selena-network. Każdy ma swój własny plugin.php , który dołączamy do load.php . Daje to elastyczność i możliwość natychmiastowego wyłączenia i włączenia Poszczególne komponenty w sprawie projektu roboczego w nagłych przypadkach.

Strona rejestracji

Po ustaleniu, gdzie i jak napiszemy kod, możemy przejść do tworzenia strony rejestracji.

Stwórzmy stronę o adresie example.org/signup/ przez zwykły interfejs. Jako adresu 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 przekierowywał na nią, 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.

Sprawa "rejestr" : if (is_multisite()) ( wp_redirect(apply_filters("wp_signup_location", network_site_url("wp-signup.php"))); exit; // ...

Jak pamiętasz, domyślnie strona rejestracji otwiera się na głównej domenie sieciowej. Dlatego właśnie tutaj użyto network_site_url().

Dodajmy nasz handler do filtra w mu-plugins/selena-network/signup/plugin.php , który poda adres strony rejestracji w bieżącej witrynie:

Funkcja selena_network_signup_page($url) ( return home_url("signup"); ) 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ć moim własnym unikalnym prefiksem. Dodaj priorytet filtra 99, ponieważ niektóre wtyczki, takie jak bbPress i BuddyPress, mogą nadpisać ten adres własnymi (wtyczki MU są ładowane przed normalnymi wtyczkami, patrz wyżej).

Zauważ, że używana jest funkcja 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ć pełny obraz, możesz użyć składania kodu. Z reguły w języku angielskim nazywa się to „składaniem kodu”.

Na samym początku pliku od linii 1 do 80 (w wersji 4.1.1) różne kontrole i wyświetlanie "początku" strony za pomocą get_header() .

Następnie deklarowanych jest wiele metod i zanim zaczniemy z nimi pracować, warto zrozumieć, co robi każda funkcja. Wiele z nich często używa innych funkcji poprzedzonych przedrostkiem wpmu_ , z których wszystkie są zadeklarowane w pliku wp-includes/ms-functions.php. Ta sekcja jest trudna do zrozumienia bez samodzielnego zapoznania się z kodem. Poniżej znajduje się krótki opis głównych funkcji na wypadek jakichkolwiek trudności.

  • wpmu_signup_stylesheet() - Wyświetla dodatkowe CSS na stronie rejestracji.
  • show_blog_form() - pola do rejestracji serwisu (adres, nazwa, widoczność dla wyszukiwarek).
  • validate_blog_form() — sprawdza poprawność wprowadzonego adresu i tytułu witryny za pomocą funkcji 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 z wpmu_validate_user_signup() .
  • signup_another_blog() - pola do rejestracji nowych witryn za pomocą show_blog_form() dla użytkowników, którzy są już zarejestrowani w serwisie.
  • validate_another_blog_signup() — weryfikuje adres i tytuł witryny za pomocą funkcji validate_blog_form() .
  • signup_user() jest główną funkcją wyświetlającą pola strony rejestracji.
  • validate_user_signup() — Sprawdza nazwę użytkownika i adres e-mail. poczta z validate_user_form() .
  • signup_blog() - pola do wpisania adresu, nazwy i widoczności strony (drugi krok rejestracji) za pomocą show_blog_form() .
  • validate_blog_signup() - waliduje login, adres e-mail. poczta, adres i nazwa witryny.

Na samym dole pliku wp-signup.php (od linii 646 w wersji 4.1.1) znajduje się główna logika strony rejestracji, która wykorzystuje wszystkie opisane powyżej metody. Ta część kodu nie jest przenoszona do funkcji. Na koniec wywoływana jest funkcja get_footer().

Skopiuj funkcjonalność wp-signup.php

Następnie zostanie opisana procedura kopiowania wp-signup.php do wtyczek MU i wprowadzania zmian w „forku”. Być może nie wydaje się to właściwą drogą. Zamiast tego możesz napisać własne funkcje do walidacji i wyświetlania formularzy od podstaw przy użyciu klas, a nie zwykłych funkcji. Moim zdaniem wp-signup.php ma już całą niezbędną logikę dla naszej strony, pozostaje tylko dokonać drobnych zmian.

Podczas aktualizacji WordPressa wp-signup.php również zmienia się od czasu do czasu, ale nie oznacza to, że będziesz musiał synchronizować swój „fork” z każdym wydaniem. Funkcje wewnątrz wp-signup.php zasadniczo nie robią nic poza wyświetlaniem HTML, walidacją danych, tworzeniem kont i witryn oraz metodami z prefiksem wpmu_ zadeklarowanymi w ms-functions.php .

Stwórzmy 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/ . Podłącz go do mu-plugins/selena-network/signup/plugin.php).

Wymagaj WPMU_PLUGIN_DIR . "/selena-network/signup/wp-signup.php";

Usuń wszystkie wymagane i niepotrzebne kontrole od samego początku kopiowanego pliku. W wersji 4.1.1 jest to cały kod od linii 1 do 80.

Teraz jesteśmy gotowi do tworzenia główna funkcja aby wyświetlić formularz rejestracyjny. W tym celu przeniesiemy całą logikę z wiersza 646 do samego końca pliku do funkcji o nazwie selena_network_signup_main . Na sam koniec 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 zadeklarujemy zmienną globalną active_signup , z której korzystają wszystkie inne metody z tego pliku. I dodaj wywołanie do zdarzenia before_signup_form, które usunęliśmy od samego 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

Są tu co najmniej dwie opcje. Wygodniejszym sposobem jest stworzenie shortcode i umieszczenie go na stronie za pomocą 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 folderze motywu potomnego. Zamiast słowa „zarejestruj się” możesz użyć unikalnego identyfikatora przypisanego do strony. Wewnątrz szablonu dodaj niezbędny układ i zadzwoń do selena_network_signup_main() we właściwym miejscu.

Dzięki temu moja strona rejestracyjna wygląda znacznie lepiej i czyściej.

Strona aktywacji

Za pomocą Domyślny WordPress warunkowo dzieli proces rejestracji w Multisite na dwa etapy – wypełnienie formularza w serwisie i aktywację konta po kliknięciu w link przesłany w wiadomości e-mail. Po wypełnieniu formularza utworzonego w poprzedniej sekcji, WordPress wyśle ​​wiadomość e-mail z instrukcjami i linkiem do aktywacji konta.

Za wyświetlenie strony aktywacji odpowiedzialny jest plik wp-activate.php znajdujący się w głównym katalogu WordPressa. wp-activate.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. Jako adres użyj dowolnego adresu URL, który wydaje Ci się odpowiedni.

Skopiuj plik wp-activate.php do naszych wtyczek MU i dołącz go do mu-plugins/selena-network/signup/plugin.php .

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

Wewnątrz nie ma dużo treści, w przeciwieństwie do wp-signup.php . Plik wykonuje pojedynczą operację - aktywuje konto, jeśli otrzyma poprawny klucz i wyświetla komunikat o błędzie lub powodzeniu.

Usuńmy wszystkie niepotrzebne kontrole i wymagania – wiersze od 1 do 69 w WordPress 4.1.1. Na samym końcu usuniemy wywołanie get_footer(). Pozostała zawartość zostanie przeniesiona do funkcji selena_network_activate_main().

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

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

Gotową funkcję można wykorzystać na gotowej stronie poprzez skrócony kod lub osobny szablon w motywie potomnym.

E-maile aktywacyjne z poprawnymi linkami

Strona aktywacyjna jest gotowa, ale WordPress nie wie o tym i nadal będzie wysyłać e-maile aktywacyjne z linkiem do wp-activate.php . W przeciwieństwie do wp-signup.php nie ma filtra, który pozwalałby na zmianę 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 Rejestracja WordPress dzwoni 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 ją niezbędną treścią, wśród której znajduje się klucz aktywacyjny konta.

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

Jeśli (! apply_filters("wpmu_signup_user_notification", $user, $user_email, $key, $meta)) zwróć false;

Aby aktywować konta z utworzeniem bloga:

If (! apply_filters("wpmu_signup_blog_notification", $domain, $path, $title, $user, $user_email, $key, $meta)) ( return false; )

Pozostaje tylko napisać własne handlery, wewnątrz których wysyłasz listy przez wp_mail() , a na sam koniec koniecznie podać false, żeby WordPress nie wysłał dwa razy listu aktywacyjnego – jeden jest Twój, drugi to domyślny list z link do wp-activate.php .

Funkcja selena_network_wpmu_signup_user_notification($user, $user_email, $key, $meta = array()) ( // Generuj nagłówek, treść i nagłówki wiadomości e-mail // ... // Wyślij e-mail lub dodaj zadanie Cron, aby wysłać e-mail wp_mail($user_email , wp_specialchars_decode($subject), $message, $message_headers); // Przekaż false, aby WordPress nie wysłał e-maila aktywacyjnego dwukrotnie zwraca 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 wysoka, powinieneś rozważyć nie wysyłanie e-maili od razu. Zamiast tego możesz dodać zadania Cron za pomocą WordPress Cron .

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

Po utworzeniu własnych stron rejestracyjnych i aktywacyjnych może być konieczne zamknięcie „oryginałów”. Na przykład, jeśli na stronie rejestracji znajdują się dodatkowe pola, które należy wypełnić. Ponadto wiele witryn WordPress podlega rejestracji spamu.

Aby rozwiązać dwa problemy w jednej akcji, możesz poprosić Apache o zwrócenie 404 w przypadku próby otwarcia tych stron. Aby to zrobić, wystarczy zarejestrować kilka dodatkowych reguł RewriteRule w swoim pliku konfiguracyjnym lub .htaccess .

RewriteEngine On RewriteBase / # Znajomość wyrażeń regularnych nigdy nie jest zbyteczna :) RewriteRule ^wp-signup\.php - RewriteRule ^wp-activate\.php - # POCZĄTEK WordPress # Zostaw domyślne reguły WordPressa :) # ... # KONIEC WordPress

Wniosek

Na ten i wiele innych „problemów” związanych z WordPressem istnieje wiele rozwiązań w Internecie. Na przykład, aby utworzyć strony rejestracji i aktywacji, niektórzy sugerują przepisanie oryginalnego wp-signup.php i wp-activate.php . Nie powinno się tego robić, ponieważ jeśli aktualizacje wordpress stracisz wszystkie zmiany dokonane w plikach, a także nie będziesz w stanie sprawdzić integralności jądra za pomocą .

Opracowując dowolny dodatek, motyw lub rozwiązanie, poświęć trochę czasu na zapoznanie się z tym, co dzieje się w WordPressie. Istnieje wiele przydatnych narzędzi do debugowania.

PS

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

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

27.03.2015 27.03.2015

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

  • --- Wybierz magazyn --- Buffalo Grove IL 60089 USA (Buffalo Grove IL 60089 USA)) Chicago USA USA Tamara (16677 SW Blanton street ALOHA. Oregon 97078) Highland Park (USA Highland Park, IL 60035 P.O Box 723 No.24 ) Istanbul(Istanbul,Gençturk Cad.15, Bırlik Han.k-5.d.55 No.1) Madryt 92200 Neuilly-sur-Seine) Republika Mołdawia , Falesti(s.Fagadau) South Kensington(Bute street) Adler(Quiet pas 2, dzielnica Kudepsta) Aktobe (ul. 47/2 Aktobe) Almetievsk(Almetievsk, ul. Lenina 13, biuro 306) Anapa (ul. Terskaja 88, 3 piętro) Astrachań (ul. Kommunisticheskaya 17, biuro 4) Atyrau (Atyrau, Azattyk Ave. 42, biuro 206) Berdiańsk (obwód zaporoski) Biszkek ( Biszkek, aleja Chui 32B, centrum handlowe "Izumrud" biuro C-5) Błagowieszczeńsk (50 Let Oktyabrya ul. 15. "Amur Fair" biuro 575) Buguruslan (Krasnoznamnaya Krasnaja, 61 (2 piętro) centrum miasta) Władywostok (ul. Svetlanskaya 147, biuro 2/4) olgograd (miasto Wołgograd autostrada Aviators 15 magazyn 23) Dyurtyuli (st. Agidel, 4 kv.2) Jejsk (ul. Pervomayskaya 56, biuro 308) Jekaterynburg (Mamin-Sibiryak 10, biuro 3) Iwanowo (prospekt Szeremietewski, 85G, Premium Plaza Business Center 2 piętro, biuro 212) Iżewsk (Lenina 21, biuro 304. Business Center "Forum") Izberbash (Chapaeva 4 osz. 368501) Irkuck (Irkuck, ul. Gornaja 4 (obok centrum handlowego Karamel) biuro 407) Ishimbay (Zorge, dom 18) Yoshkar-Ola (ul. Lenina 24v, biuro 318) Kazań ( pas 1 jednostronny dom Grivki 10, stacja metra „Kozya Sloboda” również ulica Dekabristov, 85 „B” Centrum biznesowe „Relita” biuro 411) Kamieńsk-Uralski (Prospekt Pobieda 56) Kemerowo (ul. Demyan Bedny, 1 biuro 401) Kijów (ul. Olewskaja) .9 kv.4 (przyjazd po wcześniejszym zgłoszeniu) Komsomolsk nad Amurem (ul. Szikhanova 10, biuro 1 wejście od Komsomolskiej od końca budynku.) Kostroma (Prospect Mira 51, biuro 15) .Krasnaya 124 biuro 302) Krasnojarsk (pr. Krasnojarsky pracownik, 120 centrum handlowe „Krasnoyarye”) Lwów (Plac Sobornaya 12A) Machaczkała (Akushkinogo 9v) Miass (ul. 30 let VLKSM 85) Mińsk (Korzhenevskogo, 26) Moskwa (metro :VDNH, ul. Jarosławskaja, 10, budynek 4, biuro 10 6) Moskwa (Simferopolsky Boulevard) Moskwa (Pas Glazovsky 5, wejście w łuku, drzwi po lewej stronie stacji metra: Smolenskaya-500m, Kropotkinskaya-1km., Park Kultury-1km.) Moskwa (m. Czechowskaja, Puszkinskaja, Twerskaja. Strastnoy Boulevard, 6, budynek 1, Business Center, biuro 421) Moskwa (Lobnya, Mayakovskogo st., 4A, TR1, 3 piętro, biuro 301) Moskwa (stacja metra Molodezhnaya, ulica Yartsevskaya, 27 budynek 9 Centrum poprawy zdrowia „Cztery Elementy”) Moskwa (Krasnaya Presnya 38-45) Moskwa (St. Moskwa m. Taganskaya promieniowe wyjście 3, 30 metrów od stacji metra. ul. Bolshiye Kamenshchiki 1, 4 piętro, biuro 30) Moskwa (stacja metra Leninsky Prospekt, Vavilova 9A, budynek 6, biuro 10 B, 3 piętro) Moskwa (stacja metra Novoslobodskaya, Mendeleevskaya, Mayakovskaya, Belorusskaya (promieniowa). Ulica Tverskaya 4 - Jamskaja , 24. Wejście przez łuk, PET SHOP) Moskwa (metro Belorusskaya (obwodnica), 5 metrów od wyjścia z metra. Tverskaya Zastava Square, 3, 3 piętro, biuro 321. W pobliżu dworca kolejowego Belorussky. ) Moskwa (M. ALTUFIEVO , ul. Pskowskaja, 6) Moskwa (Moskwa, ul. Radio, wejście 2, biuro 2) Nabereżnyje Czełny (ul. Sz.Usmanowa 122 kb. 111 1 piętro) Nalczyk (Nalczyk, ul. Kirowa 292a, 2 piętro, biuro 6 ) Nachodka (ul. Pogranicznaja 6, pokój 304) Niewinnomyssk (pl. 50 Let Oktiabria 8A) Nieftiejugańsk (12 osiedle 7) Niżniewartowsk (Niżniewartowsk, ul. Mira 31B) Niżny Nowogród (ul. Kominternu 139, biuro handlowe 603 (OREOL) centrum)) Niżny Nowogród (m. Gorkovskaya, st. Kostina, 3, BC „Nowy Plac”, 2. piętro, biuro 239) Niżny Tagil (at l. Krasnoarmeyskaya d.42a, 3 piętro biuro 4) Niżny Tagil (Niżny Tagil, ul. Papanina 5, biuro 1, Kuszwa, ul. Gorniakowa 4) Nowosybirsk (ulica, Oktiabrskaja 42 biuro 601, Centrum biznesowe w pobliżu Placu Lenina, Kino Majakowski) Nowosybirsk (ulica Gogol 33/1, 20 metrów od stacji metra Marszałek Pokryszkina, sklepy Gogol centrum.) Nowotroick (ul. Sowieckaja d. .144 kw. 26) Nowy Urengoj (mikrookręg Drużba, dom 4/3, m. 183) Norylsk (Prospekt Leninski 47a z. 79) Nur-Sultan (Astana) (Beibitshilik 14, BC Marden, biuro 708) Odessa (b-R francuskie 60 multidyscyplinarne sanatorium rehabilitacyjne „SARTUS”) Oktiabrski (Mikrodzielnica 32a, dom 6, m. 88) Omsk (ul. Severnaja 5 pierwsze piętro, prawy ganek) Orsk (al. Lenina 93) ) Pawłodar (ul. Satpaev 71 biuro 107) Perm (Sovietskaya d.52 biuro 1) Perm (ul. Drużby 34 biuro 305) Pyt-Yakh (Mikrookręg 5, dom 5) Piatigorsk (ul. 295 Dywizja Strzelców) i 13 k.2) Rostów nad Donem (Soborny pas 21 biuro 10 B) Salavat (ul. Lenina, budynek 3 biuro 209, 2 piętro) Samara (ul. Novo-Sadovaya 106, biuro 804, lewa winda, 8 piętro) ul. Petersburg (metro: Wasileostrowskaja, 13. linia Wyspy Wasiljewskiej, 78, biuro 182) Petersburg (stacja metra Dostojewskaja (5 metrów) i stacja metra Władimirskaja (300 metrów) PASAŻ WŁADIMIRSKI 3 piętro, wejście centralne PIERWSZA GALERIA, al. Vladimirsky 19) Sankt Petersburg (stacja metra Admiralteyskaya (10 metrów) Spasskaya 1 min spacerem ulica Efimova 1, piętro 2, biuro 4, centrum biznesowe „Sennaya 4”, wejście na lewo od kawiarni „Północ” , centrum „Plaza”, parter, biuro 29/2) Snieżyńsk (ul. Zababahina 19 a) Soczi (Soczi ko. Donskaya dom 15.) Soczi (ul. Sovetskaya 42 biuro 204) Stawropol (ul. Łomonosowa 21 biuro 18) Sterlitamak (ul. Khudaiberdina 85 , III piętro) Surgut (30 let Pobiedy 64) Tobolsk (Tobolsk, dzielnica 6, budynek 11, biuro 39 (wejście od Komsomolskiego Prospektu)) Togliatti (40 lat) Pobedy, 50, biuro 212a, Dom Handlowy Raduga I piętro ) Tomsk (Tomsk, ul. Sowieckaja 84) Tujmazy (ul. Michurina, biuro 15 2) Tiumeń (ul. Gerzen, biuro 214) Uljanowsk (ul. Riabikow, d 73) Ust-Kamenogorsk (ul. Gorkiego 57, biuro 213) Ufa (Verkhnetorgova Square, 6 (Business Center NESTEROV)) Chabarowsk (ul. Postysheva, biuro 16) s. 108) Chanty-Mansyjsk (G. Chanty-Mansyjsk, ul. Karola Marksa 15, 2. piętro.) Czelabińsk (al. Pobieda 168, 3. piętro, biuro 36.) Czerkiesk (ul. Lenina 101) Czyta (ul. Babuszkina 104, biuro 425) Czyszmy (obwodnica 17) Czyszmy (al. Przyjaźni. , 1B) Szwajcaria (Arosio przez Terra Sotto, 1 6939) Szymkent (ul. Kołchoznaja 47) Jużnosachalińsk (pas Angarski 21) Jakuck (ul. Dzierżyński 8 / 3b) Jakuck (Jakuck) Jałta (nabrzeże Lenina, 5a, SEC " Fontanna, 4 piętro) Yanaul (ulica Sowieckaja 23, biuro N 8 budynek Berezka) Jarosław (Salon wystawowy 57) Jarosław (ulica Czkalowa 2) Birsk Baszkiria () ?>

    Często pojawia się pytanie, jak umieścić jeden formularz na wszystkich stronach aplikacji Zend. Powiedzmy, że chcę umieścić formularz subskrypcji w pliku layout.phtml tak, aby znajdował się na każdej stronie. Komenda layout->content() działa z akcjami i kontrolerami... Jak więc zaimplementować to, czego potrzebujemy?

    Jednym z rozwiązań tego problemu jest stworzenie pomocnika akcji.

    Zacznijmy od skonfigurowania aplikacji ZF:

    $ zf utwórz formularz układu projektu $ formularz układu cd $ zf włącz układ

    Wyczyść plik application/views/scripts/index/index.phtml i wklej coś takiego:

    application/views/scripts/index/index.phtml:

    To jest strona główna

    Teraz możemy zacząć.

    Forma

    Stwórzmy Nowa forma:

    $ zf utwórz formularz rejestracji

    A także pola, których potrzebujemy:

    aplikacja/formularze/Signup.php:

    Klasa Application_Form_Signup rozszerza Zend_Form ( public $processed = false; public function init() ( $this->addElement("text", "name", array("label" => "Name", "required" => true, " validators" => array(array("StringLength", false, array("max"=>75)))),)); $this->addElement("text", "email", array("label" = > "Email", "required" => true, "validators" => array(array("StringLength", false, array("max"=>150)), "EmailAddress"),)); $this- >addElement("prześlij", "idź", array("etykieta" => "Zarejestruj się",)); ) )

    Mamy formularz. Pozostaje to wydobyć.

    Pomocnik akcji

    Używamy pomocnika akcji do inicjalizacji formularza.

    Dodaj linię do application.ini:

    application/configs/application.ini:

    Resources.frontController.actionhelperpaths.Application_Controller_Helper = APPLICATION_PATH "/controllers/helpers"

    Teraz system wie, gdzie szukać pomocników akcji, więc możemy przejść dalej:

    aplikacja/Bootstrap.php:

    bootstrap("frontController"); $signup = Zend_Controller_Action_HelperBroker::getStaticHelper("Zarejestruj się"); Zend_Controller_Action_HelperBroker::addHelper($rejestracja); ) )

    Pomocnik akcji będzie wyglądał tak:

    aplikacja/kontrolery/pomocnicy/Signup.php:

    getActionController()->widok; $form = nowy Application_Form_Signup(); $request = $this->getActionController()->getRequest(); if($request->isPost() && $request->getPost("submitsignup")) ( if($form->isValid($request->getPost())) ( $data = $form->getValues() ; // przetwarzanie danych $form->processed = true; ) ) $view->signupForm = $form; ) )

    Nie ma tu nic specjalnego. Po prostu zwróć uwagę na klasę rodzicielską.

    Wyświetl pomocnika

    Aby wyświetlić formularz, stwórzmy pomocnik widoku, który wygląda tak:

    aplikacja/widoki/pomocnicy/SignupForm.php:

    Zapisz się do naszego newslettera

    "; if($form->przetworzone) ( $html .= "

    Dziękujemy za rejestrację

    "; ) else ( $html .= $form->render(); ) return $html; ) )

    Pozostało nam tylko wyrenderować formularz w layout.phtml:

    application/layouts/scripts/layout.phtml:

    headMeta()->prependHttpEquiv("Typ-treści", "text/html; charset=UTF-8"); $this->headTitle("Test formularza układu"); echo $this->doctype(); ?> headMeta()->setIndent(4); ?>headTitle()->setIndent(4); ?>

    layout()->treść; ?>
    signupForm($this->signupForm); ?>

    Stało się

    To wszystko. Osiągnęliśmy funkcjonalność, jaką sobie wyobraziliśmy.

    Cm … Słownik synonimów

    BAINKI bez zmian. rozdz. (dziecinny). Spać. Chcesz cycków? Połóż bainki. Słownik wyjaśniający Uszakowa. D.N. Uszakow. 1935 1940 ... Słownik wyjaśniający Uszakowa

    Zrób / zrób bainki (do widzenia). Jarg. Mówią Czółenko. Spać. Maksimow, 21 lat … Duży słownik rosyjskich powiedzeń

    Orzekam. rozwijać się O stanie snu (w mowie dzieci lub w rozmowie dorosłych z dziećmi). II wewn. rozwijać się Używany jako składnik kołysanki. Słownik wyjaśniający Efremovej. T. F. Efremova. 2000... Nowoczesny słownik Język rosyjski Efremova

    bainki- ainki, niezmienność... Rosyjski słownik ortograficzny

    bainki- niezmienność ... Słownik ortografii języka rosyjskiego

    Międzyn., w funk. skaz. \u003d Bai Bai (znak II) ... słownik encyklopedyczny

    bainki- wewn.; w funkcji. skaz. = pa pa 2) … Słownik wielu wyrażeń

    bainki- ba / tusz / a między ... Morfemiczny słownik pisowni

    Książki

    • Bainki, Tokmakova IP W tej książce możesz czytać, a nawet śpiewać kołysanki dla swojego dziecka. Wytnij książkę...
    • Bainki (wyd. 2006), Irina Tokmakova. W tej książce możesz czytać, a nawet śpiewać kołysanki swojemu dziecku. Wytnij książkę. ISBN:5-9524-2404-X…

    Stwórzmy własną stronę rejestracji wielostanowiskowej zamiast standardowego wp-signup.php .

    W normalna instalacja strona wordpress rejestracja (autoryzacja, resetowanie hasła) wyprowadza plik wp-login.php.

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

    W wp-login.php istnieją osobne warunki dla wielu witryn. Tak więc, gdy klikniesz /wp-login.php?action=register w wielu witrynach, WordPress przekieruje do strony /wp-signup.php. W wielu motywach strona nie wygląda zbyt atrakcyjnie, dlatego stworzymy własną.

    Strona główna sieci

    Domyślnie WordPress otwiera stronę rejestracji (wp-signup.php) w ​​głównej domenie (witrynie) sieci. Istnieje jednak możliwość stworzenia osobnej strony rejestracyjnej dla każdej witryny w sieci, nawet jeśli mają one inną tematykę. 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, wymagany będzie więcej kodu.

    funkcje.php?

    Nie. Nazwa tego pliku wydaje się być wymieniona w każdym artykule WordPress. W naszym przypadku, biorąc pod uwagę fakt, że funkcja rejestracji jest przeznaczona dla kilku witryn, sensowne jest przeniesienie jej do wtyczek MU, które są ładowane po otwarciu dowolnej witryny.

    Dygresja liryczna

    Warto zauważyć, że wtyczki MU są ładowane przed normalnymi wtyczkami i zanim rdzeń WordPressa zostanie w pełni załadowany, więc wywoływanie niektórych funkcji może prowadzić do krytycznych błędów w PHP. To „wczesne” ładowanie ma swoje zalety. Powiedzmy, że wewnątrz dowolnego motywu nie można przylgnąć do niektórych akcji, które działają 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 to nazwa modułu), za pomocą której można śledzić aktywność modułów w Jetpack. Tej akcji nie można "dołączyć" do pliku motywu, ponieważ akcja została już uruchomiona przed załadowaniem motywu - wtyczki są ładowane przed motywami. Możesz rzucić okiem na ogólny obraz kolejności ładowania WordPressa na stronie Action Reference w kodeksie.

    Kolejność plików

    Wtyczki MU mogą zawierać dowolną liczbę plików i dowolną strukturę, która wydaje się logiczna. Stosuję hierarchię taką jak ta:

    |-mu-plugins |-|-load.php |-|-|-selena-network |-|-|-|-signup |-|-|-|-|-plugin.php |-|-|-| -|-... |-|-|-|-jetpack |-|-|-|-|-plugin.php

    W pliku load.php połączone są wszystkie niezbędne „wtyczki” dla naszej sieci:

    // Załaduj tłumaczenia dla wszystkich dodatków load_muplugin_textdomain("selena_network", "/selena-network/languages/"); // Rejestracja w sieci wymaga WPMU_PLUGIN_DIR . "/selena-network/signup/plugin.php"; // Kolejne wtyczki // wymagają WPMU_PLUGIN_DIR ...

    Foldery wtyczek są przechowywane w folderze selena-network, każdy ma swój własny plugin.php , który umieszczamy w load.php . Daje to elastyczność i możliwość szybkiego wyłączania i włączania pewnych rzeczy.

    URL strony rejestracji

    Filtr wp_signup_location jest używany do określenia adresu strony rejestracji. Można go znaleźć w pliku wp-login.php i odpowiada za przekierowanie do wp-signup.php .

    Sprawa "rejestr" : 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 poda adres strony rejestracji w bieżącej witrynie:

    Funkcja selena_network_signup_page ($url) ( return home_url () . "/signup/"; ) 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. Dodaj priorytet filtra 99, ponieważ niektóre wtyczki, takie jak bbPress i BuddyPress, mogą nadpisać ten adres własnymi (wtyczki MU są ładowane przed normalnymi wtyczkami, patrz wyżej). Zauważ, że home_url() jest używana zamiast network_site_url(), aby utrzymać odwiedzającego w tej samej domenie. Jako adres można użyć dowolnego adresu URL.

    Tworzenie strony

    Teraz utworzymy stronę z adresem site.com/signup/ poprzez zwykły interfejs, aw folderze motywu potomnego szablon dla naszego Nowa strona- page-signup.php . Zamiast słowa „zarejestruj się” możesz 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 jest opcjonalny i zamiast tego możesz stworzyć własny shortcode, który wywoła również funkcję selena_network_signup_main().

    wp-signup.php i wp-activate.php

    Teraz stwórzmy funkcję, która wyświetli formularz rejestracyjny. Aby to zrobić, skopiuj pliki wp-signup.php i wp-activate.php z katalogu głównego WordPressa do mu-plugings/selena-network/signup/ (i nie zapomnij dołączyć ich do mu-plugins/selena-network /signup/plugin.php) . Dalsze manipulacje plikami są niezwykle trudne i długie do opisania, więc będziesz musiał je wykonać samodzielnie. Opiszę tylko, co dokładnie trzeba zrobić i opublikuję pliki źródłowe Twojego 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. Zawiń dolną część kodu wp-signup.php w funkcję selena_network_signup_main i na samym początku napisz globalny $active_signup; .
    4. Zamień układ na własny w odpowiednich miejscach.

    Wewnątrz wp-activate.php musisz zrobić to samo:

    1. Usuń cały kod poza funkcjami, opakuj układ w osobną funkcję.
    2. W razie potrzeby zmień układ.

    Za stronę aktywacji konta odpowiada plik wp-activate.php. Podobnie jak w przypadku strony rejestracji, musisz stworzyć dla niej osobny szablon, wewnątrz którego musisz wywołać funkcję z pliku wp-activate.php.

    Wysyłanie e-maili aktywacyjnych

    Strona rejestracji wysyła do odwiedzającego wiadomość e-mail z linkiem do aktywacji konta. Domyślnie jest to obsługiwane przez funkcję wpmu_signup_user_notification() z pliku ms-functions.php. Jego funkcjonalność można wypożyczyć na swoją funkcję. Powodem, dla którego musisz przestać korzystać z tej funkcji, jest to, że wysyła ona link aktywacyjny konta z wp-activate.php . Możesz „wyłączyć” tę funkcję za pomocą filtra wpmu_signup_user_notification, podając jej wartość false (jeśli nie zostanie to zrobione, list aktywacyjny zostanie wysłany dwukrotnie, ok, właściwie dwie różne litery).

    Funkcja armyofselenagomez_wpmu_signup_user_notification($user, $user_email, $key, $meta = array()) ( // ... // Kod z funkcji wpmu_signup_user_notification() wp_mail($user_email, wp_specialchars_decode($subject), $message_headers, $mess) zwróć false;) add_filter ("wpmu_signup_user_notification", "armyofselenagomez_wpmu_signup_user_notification", 10, 4);

    W rezultacie strona rejestracyjna w motywie Selena stała się znacznie czystsza i schludniejsza.

    Wniosek

    Istnieje wiele innych niezbyt poprawnych sposobów w Internecie, jak 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 możliwe na mojej własnej stronie.

    Zwracam uwagę, że należy ostrożnie edytować pliki i starać się nie odbiegać zbytnio od oryginalnych, aby w przyszłości, jeśli WordPress zmieni pliki wp-signup.php i wp-activate.php, łatwiej będzie je porównać aby znaleźć zmiany.

    Nie zapomnij zajrzeć źródło wszystkie funkcje opisane powyżej, aby w pełni zrozumieć, co i jak dzieje się w kodzie.

    Premia. Ochrona przed spamerami

    Nawet najmniejsze witryny WordPress są często bombardowane rejestracją spamu. Można pisać nieskończone warunki filtrowania botów, często bardziej przypominające próbę stworzenia sztucznej inteligencji 🙂 W przypadku multisite’u bardzo pomogło mi zwykłe przekierowanie w Apache, z którym prosiłem o wydanie 404 przy otwieraniu /wp-signup.php i /wp-acitvate.php (nie jestem ekspertem od konfiguracji Apache, więc moje reguły mogą nie być zbyt poprawne).

    RewriteEngine On RewriteBase / RewriteRule ^wp-signup\.php - RewriteRule ^wp-activate\.php - # POCZĄTEK WordPress # Domyślne reguły WordPressa :) # ... # KONIEC WordPress

    PS Staram się opisywać niektóre rzeczy osób trzecich tak szczegółowo, jak to możliwe, ponieważ kiedy zaczynałem, czasami nie było nikogo, kto by podpowiadał i wyjaśniał wiele rzeczy. Wierzę też, że takie drobne wskazówki dotyczące innych materiałów popchną kogoś do nauczenia się czegoś nowego i poszerzenia obszaru wiedzy. Użyj wpisów RewriteRule wyrażenia regularne, nie są one wcale skomplikowane, np. symbol ^ oznacza początek wiersza.