Używanie haków WordPress do czyszczenia kodu, aktywacji i odinstalowywania

Opublikowany: 2015-01-23

Twórcy wtyczek poświęcają tyle czasu i energii na główną funkcjonalność swoich produktów, że pozwalają odejść mniej ważnym rzeczom.

Weźmy na przykład aktywację i dezaktywację. Chociaż podpięcia aktywacji są szeroko rozpowszechnione – wiele wtyczek wymaga dodania pewnych opcji, opróżnienia reguł przepisywania, może utworzenia tabeli bazy danych lub sprawdzenia różnic wersji podczas instalacji – podpięcia dezaktywacji i deinstalacji są znacznie mniej powszechne.

O co tu chodzi? Wielu autorów wtyczek nie poświęca czasu na sprzątanie po sobie. Czy instalacja WordPressa naprawdę potrzebuje niestandardowej tabeli, którą utworzyłeś po usunięciu wtyczki? Dlaczego nie wyczyścić kilku opcji, które są wyłączne dla wtyczki, zanim ją wyrzucisz?

W tym artykule pokażę, jak używać haków aktywacji, dezaktywacji i dezinstalacji, aby zainicjować wtyczkę i łatwiej wyczyścić wszystko po tym, jak użytkownicy skończą z produktem.

  • Hak aktywacyjny
    • Sekwencja instalacji
    • Flushing Rewrite Rules
    • Tworzenie tabel bazy danych
    • Kontrole zależności
  • Hak dezaktywacyjny
  • Hak dezinstalacyjny
  • Dodatkowe zabezpieczenia
  • Czas posprzątać

Uwaga: jeśli planujesz przejrzeć ten artykuł, zdecydowanie sugeruję zajrzeć do sekcji „Dodatkowe zabezpieczenia” na końcu, która uzupełnia kod o kilka cennych kontroli bezpieczeństwa. Ponadto, jeśli potrzebujesz pomocy z hakami wtyczek WordPress, oto krótkie przypomnienie o korzystaniu z haków WordPress i jak aktywować funkcję w WordPress.

Hak aktywacyjny

Chociaż hak aktywacji jest dość prosty, jego instalacja jest trochę szczególnym przypadkiem, więc musimy zwrócić uwagę na kolejność zdarzeń. Zanim przejdziemy do tego wszystkiego, oto prosty przykład:

Ładowanie treści f356a899b7f009d136644383339db4f6

Kluczem do tego wszystkiego jest funkcja register_activation_hook() . Pierwszy parametr to ścieżka do głównego pliku wtyczki; drugi parametr definiuje funkcję do uruchomienia. Wewnętrznie funkcja register_activation_hook() jest opakowaniem dla akcji „activate_[nazwa_wtyczki]”, ale ponieważ jest nieco łatwiejsza w użyciu, rzadko można zobaczyć zaczep we wtyczkach.

Sekwencja instalacji

Zrozumienie kolejności instalacji jest ważne, ponieważ zapobiega używaniu metod, do których możesz być przyzwyczajony. register_activation_hook() jest wywoływana pomiędzy kliknięciem przez użytkownika linku aktywacyjnego i wyświetleniem powiadomienia o aktywacji. Działa na stronie pośredniczącej, która przekierowuje bezpośrednio przed uruchomieniem jakichkolwiek podpięć.

Spójrzmy na przykład, aby zobaczyć, dlaczego jest to ogromny błąd:

Flushing Rewrite Rules

Wiele wtyczek tworzy niestandardowe typy postów. Opróżnienie reguł przepisywania przy aktywacji, aby upewnić się, że użytkownicy nie otrzymają błędu 404 podczas odwiedzania wpisu z nowego niestandardowego typu wpisu, jest mądrym posunięciem.

Poniższy kod wydaje się logiczny, ale nie powiedzie się.

Ładowanie treści 7c656623608efd1785437ebe7cdb7350

Wydaje się, że jest w porządku. Tworzony jest niestandardowy typ posta, a po aktywacji usuwamy reguły przepisywania. Problem polega na tym, że niestandardowe typy postów nie zostały jeszcze utworzone, gdy opróżniamy reguły przepisywania.

Oto jak wygląda przebieg procesu:

  1. Użytkownik instaluje wtyczkę.
  2. Użytkownik klika link aktywacyjny.
  3. Strona pośrednia uruchamia tylko hak aktywacyjny, nic więcej. To opróżnia zasady przepisywania.
  4. Wtyczka jest aktywna, a kod działa normalnie. Zarejestrowano niestandardowy typ poczty.

Rozwiązanie zamieszczone na Stack Overflow, oficjalnie zatwierdzonym przez WordPress Codex, rozwiązuje nasz mały problem. Rozwiązanie polega na dodaniu opcji wskazującej, że wtyczka została właśnie zainstalowana.

Jeśli ta opcja istnieje, wykonujemy naszą aktywację, a następnie ją usuwamy.

Coś takiego:

Ładowanie treści 6f0927b3bf9807e426c8778a3bf3a797

Osobiście nie przepadam za tym rozwiązaniem. Problem polega na tym, że sprawdzanie w wierszu ósmym jest uruchamiane przy każdym załadowaniu strony. Nie ma się czym martwić, ponieważ nie spowoduje to dużego obciążenia serwerów i nie spowolni działania witryny dla użytkowników. To bardzo szybkie sprawdzenie, które ma znikomy wpływ na wydajność. W 99,9% przypadków jest to jednak niepotrzebne.

Jest lepsze rozwiązanie wspomniane w Kodeksie w dokumentacji funkcji flush_rewrite_rules() . W tym rozwiązaniu wykorzystujemy modułowość naszych funkcji, aby osobno zarejestrować niestandardowy typ postu przy aktywacji:

Ładowanie treści b44bf08bf511277184a49de53c0c3ed8

Zamiast polegać na sprawdzaniu, które musi być uruchamiane przez cały czas, używamy funkcji aktywacji, aby zarejestrować nasze typy postów. Zauważ, że gdy nasza wtyczka zostanie aktywowana, typy postów będą zawsze rejestrowane z haka init .

To smutny przykład tego, że Kodeks jest wszędzie. Ogólnie rzecz biorąc, WordPress ma dobrą dokumentację, ale jeśli coś wydaje się marnotrawne lub nielogiczne, nie bój się przeprowadzić własnych badań.

Tworzenie tabel bazy danych

Innym zadaniem, które wykonują niektóre wtyczki, jest tworzenie tabel bazy danych. Najczęściej jest to niepotrzebne, ale istnieją pewne uzasadnione przypadki użycia.

Ten przykład z artykułu Codex na temat tworzenia tabel pokazuje, jak można użyć wielu wywołań aktywacji:

Ładowanie treści 9a1d4757d023f2442093a9a158cdb6b4

Pierwsza funkcja, jal_install() , tworzy nową tabelę bazy danych. Druga funkcja, jal_install_data , dodaje początkowe dane do tabeli. Zamiast używać register_activation_hook() do dodania jednej funkcji zawierającej cały ten kod, możemy wielokrotnie użyć register_activation_hook .

To świetna praktyka modułowości. Z jednej strony nie musisz dodawać początkowych danych testowych – to tak proste, jak usunięcie haka aktywacyjnego – dzięki czemu możesz zachować funkcję nienaruszoną. Z drugiej strony możesz ponownie używać tych funkcji w dowolnym miejscu, ponieważ są one oddzielne.

Kontrole zależności

Innym częstym zadaniem funkcji aktywacji jest sprawdzenie zależności. Twoja wtyczka może polegać na określonej wersji WordPressa, innej wtyczce, a nawet określonej wersji PHP.

Poniższy kod sprawdza minimalną wersję WP i PHP i w razie potrzeby przekierowuje użytkownika (bez aktywacji wtyczki):

Ładowanie treści 79a2c5414969291ec90cac11c38b7522

Hak dezaktywacyjny

Podpięcia dezaktywacji działają, gdy użytkownik dezaktywował wtyczkę, ale przed jej odinstalowaniem (usunięciem). Haki dezaktywacyjne są używane w taki sam sposób jak haki aktywacyjne:

Wczytuję treść 6ed9bb66ee1863ab3e84db1f9f753792

Dezaktywacja oznacza, że ​​użytkownik dezaktywował tylko twoją wtyczkę, więc nie będziesz chciał robić tak dużo, jak podczas dezinstalacji. Być może będziesz chciał opróżnić reguły przepisywania, ale na tym etapie nie będziesz chciał pozbyć się wszystkich opcji i tabeli bazy danych (jeśli ją masz).

Jest to dość proste, ale zwrócę szczególną uwagę na opróżnianie reguł przepisywania, ponieważ po raz kolejny są one problematyczne.

Kodeks zaleca wykonanie ich w sposób pokazany poniżej, ale to nie działa :

Ładowanie treści 4440a0178b4e34506530e13d0ead8958

Powód, dla którego to nie działa, jest taki sam jak wcześniej. Uruchomienie dezaktywacji wykonuje zaczep init , co oznacza, że ​​gdy dezaktywujemy naszą wtyczkę, rejestrujemy również nasz niestandardowy typ postu. Reguły przepisywania są opróżniane, ale uwzględniają niestandardowy typ posta.

Bilet Traca jest na miejscu, aby rozwiązać ten problem, ale do tego czasu nie mogę dać ci bardzo dobrego sposobu na zrobienie tego. Jedynym sposobem, w jaki znalazłem, że działa, jest całkowite usunięcie reguł przepisywania:

Wczytuję tekst 98b496826278084a2f7a5ea27994f781

Chociaż działało to dla mnie w przeszłości, nie polecam tego. Wprowadza to większą niepewność niż problem posiadania kilku dodatkowych reguł przepisywania. Wolałbym wyświetlać notatkę użytkownikom z prośbą o odwiedzenie ustawień permalink po dezaktywacji, co spowodowałoby usunięcie reguł przepisywania. Dopóki nie zostanie wdrożone lepsze rozwiązanie, utkniemy z tym… przepraszam!

Hak dezinstalacyjny

Istnieją dwa sposoby uruchamiania kodu podczas odinstalowywania wtyczki. Możesz użyć haka dezinstalacyjnego poprzez register_uninstall_hook() lub możesz użyć dedykowanego pliku uninstall.php w swojej wtyczce. Pokażę ci oba, ale preferowaną metodą jest użycie pliku odinstalowującego.

Główny problem z hakiem dezinstalacji polega na tym, że „uniemożliwia uruchamianie głównego pliku wtyczki podczas deinstalacji, co może być problematyczne, jeśli wtyczka uruchamia kod w przestrzeni globalnej. Lepsze jest również to, że kod dezinstalacyjny jest scentralizowany”. – Scott Riley

Poniższy kod pokazuje proces deinstalacji przy użyciu podstawowego haka:

Ładowanie treści 040847db4739148900b1ee29d227d71d

Jak wspomniano, nie jest to najlepsze rozwiązanie. O wiele lepszym sposobem obsługi dezinstalacji jest użycie pliku uninstall.php . Wszystko, co musisz zrobić, to go utworzyć i będzie używany, jeśli będzie dostępny.

Ładowanie treści 44dde25dcb57b4239be8586f4d04c765

Jak widać, jest to właściwie prostsze rozwiązanie. A co najlepsze, jest samowystarczalny.

Dodatkowe zabezpieczenia

Nie chciałem nadmiernie komplikować pokazanych dotąd przykładów kwestiami związanymi z bezpieczeństwem, ale naprawdę powinieneś podjąć pewne kroki, aby upewnić się, że tylko ci, którzy są do tego uprawnieni, mogą wykonywać te działania.

Użyj poniższego fragmentu kodu podczas aktywacji i dezaktywacji:

Ładowanie treści 357037989065f89c15f049314e9831bf

Ten blok kodu zapewnia, że ​​użytkownik ma uprawnienia do wykonania tej akcji i że akcja pochodzi z odpowiedniej strony. Powinno to chronić przed większością złośliwych prób.

Proces dezinstalacji jest wyjątkowy, więc będziemy musieli użyć nieco innego kodu:

Ładowanie treści 541c93cfa9b89e1e6c7b48b06732d31f

Czas posprzątać

Jeśli twoja wtyczka dodaje coś do WordPressa, Twoim obowiązkiem jako programisty jest usunięcie go, gdy użytkownik zdecyduje się usunąć wtyczkę.

Korzystanie z opisanych powyżej metod aktywacji, dezaktywacji i dezinstalacji pozwoli Ci zbudować system, który robi to bezpiecznie i bezpiecznie. Gorąco polecam również przeczytanie tego wątku Stackexchange, który opisuje te procesy w środowiskach OOP.

Jeśli nie jesteś jeszcze członkiem WPMU DEV, zarejestruj się już dziś, aby uzyskać bezpłatną wersję próbną, całkowicie bez ryzyka. Jako członek uzyskasz dostęp do wszystkich naszych wspaniałych wtyczek i niesamowicie szybkiej usługi hostingowej, a także specjalistyczną pomoc techniczną 24/7 w przypadku wszystkich pytań i problemów związanych z WordPressem.

Czy uważasz, że wtyczki pozostawiają w Twojej bazie bałagan po ich usunięciu? Daj nam znać, co myślisz w komentarzach poniżej.
Tagi: