Aktualizacja wtyczek WordPress
Teoretycznie wtyczki WP da się aktualizować jednym kliknięciem z poziomu Kokpitu, ale czy warto? W ten sposób nietrudno o konflikt między kilkoma pluginami… i w efekcie o błąd krytyczny całej strony. Poniżej wyjaśnimy, jak bezpiecznie aktualizować WordPressa, aby uniknąć tego problemu.
- Nie aktualizuj wszystkich wtyczek naraz na działającej stronie. Przy sklepie, serwisie leadowym albo stronie z formularzami jeden konflikt po update'cie może zablokować sprzedaż, wysyłkę zapytań lub dostęp do panelu.
- Przed aktualizacją sprawdź changelog, wersję PHP i stan plików. Dopiero później rób backup, aktualizuj wtyczki pojedynczo i przejdź przez najważniejsze funkcje serwisu.
- Procedura bezpiecznej aktualizacji obejmuje backup, testy na stagingu, kontrolę wersji zmian, wdrożenie poza godzinami największego ruchu i monitoring logów po publikacji.
- W większych projektach WordPress aktualizacje możesz przeprowadzić także przez WP-CLI, Composer, Git oraz pipeline wdrożeniowy, co ułatwia kontrolę wersji, testy oraz wycofywanie zmian.
- SLA ma znaczenie wtedy, gdy coś pójdzie nie tak. Zamiast szukać pomocy po awarii, masz zespół, który zna stronę, może szybko wejść na serwer i przywrócić działanie serwisu.
Dlaczego „Aktualizuj wszystko” na produkcji to ryzyko biznesowe?
Dlaczego „Aktualizuj wszystko” na produkcji to ryzyko biznesowe?
WordPress bardzo mocno zachęca do aktualizowania pluginów z poziomu panelu administracyjnego. W zakładce Wtyczki możesz pobrać i zainstalować update’y dla wszystkich rozszerzeń zbiorczo, a nawet – od wersji 5.5 – ustawić dla nich automatyczne aktualizacje.
Dla małego bloga albo prostej strony-wizytówki to bardzo wygodne. Ale już dla e-sklepu generującego dziesiątki tysięcy złotych dziennie? Ryzyko, że coś pójdzie nie tak, jest zbyt duże. Przy automatycznych aktualizacjach nie masz kontroli nad tym, w jakiej kolejności będą instalowane update’y, nie możesz też przetestować ich przed wdrożeniem na stronę. Poza tym, update update’owi nierówny; inaczej powinno się traktować łatki bezpieczeństwa, które naprawiają pojedyncze luki w kodzie – je należy instalować jak najszybciej – a inaczej duże aktualizacje, które potrafią czasem zupełnie zmienić logikę działania wtyczki.
Główny problem tkwi jednak w tym, że wtyczki WordPressa nie działają w próżni. Każdy plugin wchodzi w interakcje z motywem, innymi wtyczkami i samym core systemu. Twórcy wtyczek oczywiście testują je przed wydaniem kolejnego update’u… ale nie ma takiej możliwości, aby sprawdzili każdą możliwą konfigurację. Jeśli więc aktualizacja pluginu, przykładowo, zmienia hooki albo modyfikuje sposób ładowania skryptów, istnieje ryzyko, że wywoła konflikt z innymi elementami „ekosystemu” strony – najczęściej chodzi po prostu o inną wtyczkę. Ale nie zawsze; trzeba uważać też m.in. na zależności między wtyczkami a customowym kodem pisanym pod konkretny projekt albo na to, jak pluginy mogą współdziałać z integracjami. Tu zasada jest prosta: im większy projekt, tym większe też pole do konfliktu.
Konflikt między skryptami PHP, nawet najmniejszy, skończy się niestety błędem krytycznym… co oznacza tyle, że cała strona przestanie działać. I dlatego do aktualizacji wtyczek trzeba podejść bardzo ostrożnie i traktować je tak samo, jak każdą inną zmianę w kodzie.
Wystarczy jedna nieprzemyślana aktualizacja, żeby sklep z kilkudziesięcioma wtyczkami padł na kilka godzin – a w e-commerce to realna strata w przychodach. Dlatego u naszych klientów każdą aktualizację najpierw sprawdzamy na stagingu i robimy testy regresji, zanim trafi na produkcję.
Aktualizacja z panelu, WP-CLI czy Composer – czym różnią się te podejścia?
Same aktualizacje można wdrażać na kilka sposobów.
Najprościej będzie to zrobić z poziomu panelu administracyjnego WordPressa – wcale nie trzeba ich pobierać zbiorczo ani korzystać z automatycznych update’ów, można je instalować pojedynczo. Jednak nawet wtedy nie masz kontroli nad tym, jaką konkretnie wersję danej wtyczki pobierasz, bo WP zawsze będzie instalował tę najnowszą, a to może być ważne w kwestii kompatybilności np. z wersją PHP, którą obecnie masz na serwerze. Poza tym WordPress sam nigdzie nie dokumentuje historii zmian w kodzie… i dlatego przy większych projektach raczej nie przeprowadza się update’ów w ten sposób.
Lepszym rozwiązaniem – i tę drogę wybrałaby chyba większość administratorów – będzie instalowanie update’ów za pomocą WP-CLI, czyli interfejsu wiersza poleceń. Aby zaktualizować wtyczkę, wystarczy wpisać komendę typu wp plugin update woocommerce --version=8.5.1, nowe pliki zostaną od razu pobrane z biblioteki WP; co ważne, tutaj już możesz określić, którą konkretnie wersję wtyczki instalujesz. Jest też opcja, aby pobrać jednocześnie wszystkie dostępne aktualizacje (wp plugin update --all) albo – i to chyba największa zaleta – wyłącznie te pomniejsze. Wtedy do komendy dodajesz --patch, dla aktualizacji np. z wersji 1.3.3 do 1.3.4 albo --minor, dla update’ów rzędu z wersji 1.3 na 1.4.
Alternatywnie można też korzystać z Composera, czyli menedżera pakietów i zależności dla języka PHP – tutaj jednak panuje zupełnie inne podejście. Zamiast pobierać update’y bezpośrednio z biblioteki WP, korzystasz z zewnętrznych repozytoriów (WP Packages lub WPackagist), w których wtyczki mają format pakietów dostosowanych stricte pod Composera. Aby zainstalować aktualizacje, wystarczy w pliku composer.json zadeklarować, które wtyczki i w jakich wersjach mają wchodzić w skład projektu, uruchomić komendę composer update – Composer sam pobierze odpowiednie pakiety i zaktualizuje zależności w kodzie PHP strony. Dużym plusem jest to, że w osobnym pliku – composer.lock – Composer od razu zapisuje, co dokładnie zainstalował, więc całą historię aktualizacji można przechowywać w repozytorium Git i łatwo odtwarzać na wszystkich środowiskach.
Bezpieczny standard: procedura aktualizacji krok po kroku
Bezpieczny standard: procedura aktualizacji krok po kroku
Każdy administrator stron na WP powinien mieć swoją procedurę, przez którą zawsze przechodzi przy okazji aktualizacji wtyczek – obojętnie, czy tych pluginów jest pięć, czy piętnaście. Zazwyczaj wygląda ona tak, jak poniżej; warto się jej trzymać.
8 kroków przy aktualizacji wtyczek WP
- Sprawdzamy changelog wtyczki przed aktualizacją – przede wszystkim pod kątem zmian w hookach, filtrach albo strukturze bazy danych. Jeśli takie zmiany się pojawiają, to ryzyko konfliktu z innymi wtyczkami lub motywem strony będzie wyższe. Changelog dla każdej wtyczki można znaleźć na jej stronie lub w zakładce Wtyczki w Kokpicie, klikając numer nowej wersji. Zmian będzie oczywiście więcej przy update’cie z wersji, powiedzmy, 4.5 na 4.6 niż z 4.5.7 na 4.5.8, natomiast changelog sprawdzić powinno się zawsze, nawet przy drobnych łatkach. Dla większych update’ów warto też zajrzeć na… forum wsparcia danej wtyczki; jeśli jest jakiś problem z nową wersją, to po kilku dniach od wydania prawdopodobnie ktoś o tym napisze.
- Sprawdzamy, czy nowa wersja wtyczki jest kompatybilna z naszym środowiskiem – przede wszystkim z wersją PHP zainstalowaną na serwerze oraz z aktualną wersją WordPressa; w opisie każdej wtyczki powinna być informacja o minimalnej i testowanej wersji PHP oraz WordPressa, także warto jeszcze przed pobraniem zestawić je z tym, co mamy u siebie. Czasami w dokumentacji wtyczki da się też znaleźć informacje o tym, czy i jak współpracuje z innymi pluginami, choć to dotyczy raczej tych najpopularniejszych wtyczek, np. WooCommerce.
- Weryfikujemy integralność plików strony – niektórzy ten krok pomijają, co jest błędem; zawsze warto sprawdzić, czy pliki nie zostały wcześniej przez kogoś zmodyfikowane. Najłatwiej to zrobić przez WP-CLI: dla core’u WordPressa komendą wp core verify-checksums, a dla wtyczek – wp plugin verify-checksums --all.
- Wykonujemy pełny backup plików strony – robimy to przy każdej aktualizacji. Kopia zapasowa powinna obejmować pliki strony (katalog wp-content z motywem, wtyczkami i przesłanymi plikami, plus wp-config.php i .htaccess) oraz zrzut bazy danych w formacie SQL. Tu także można wspomóc się wtyczką; UpdraftPlus lub Duplicator przygotuje taką kopię w moment i od razu prześle ją do bezpiecznego środowiska poza serwerem strony.
- Instalujemy update’y wtyczek na stagingu wybraną metodą: z panelu administracyjnego WP, przez WP-CLI lub z pomocą Composera – niezależnie od tego, którą metodę wybierzemy, dwóch zasad trzeba się trzymać. Po pierwsze, zawsze zaczynamy na stagingu, aby w razie wystąpienia konfliktu (albo innych problemów, np. ze spadkami wydajności) nie dotknęło to wersji strony dostępnej dla użytkowników. I po drugie, wtyczki aktualizujemy jedna po drugiej, ewentualnie w małych grupach. Dzięki temu, jeśli po którymś update'cie pojawi się błąd krytyczny, od razu będzie wiadomo, która wtyczka go wywołała, bez potrzeby zaglądania do logów. Dlatego też w WP-CLI raczej powinno się unikać komendy wp plugin update --all, chyba że do zainstalowania są tylko pomniejsze aktualizacje – wtedy można skorzystać z opcji --patch lub --minor. W projektach opartych na Composerze też bezpieczniej jest aktualizować zależności w composer.json pojedynczo – nawet jeśli Composer daje ten komfort, że wszystkie zmiany możemy łatwo zapisać w Gitcie i w razie potrzeby je cofnąć.
- Testujemy stronę na stagingu – niezależnie od wybranej metody aktualizacji, po pobraniu update’ów trzeba sprawdzić, czy strona faktycznie działa. Nawet jeśli WordPress nie wyrzuca błędu krytycznego, może okazać się, że któraś z funkcji obsługiwanych przez wtyczki ma problemy – dlatego jeśli, powiedzmy, aktualizujemy wtyczkę formularza, to wysyłamy zgłoszenie i sprawdzamy, czy dotarło na maila. A jeśli WooCommerce – przechodzimy przez całą ścieżkę zakupową. Oczywiście warto też spojrzeć na stronę bardziej „ogólnie”, na przykład przyjrzeć się wskaźnikom wydajności i czasom ładowania (pluginy potrafią mieć na to ogromny wpływ).
- Dokumentujemy zmiany i przygotowujemy możliwość rollbacku – zanim update trafi na produkcję, koniecznie zapisujemy wszystkie wprowadzone zmiany: które pluginy zostały zaktualizowane, z jakiej wersji na jaką i kiedy. Jeśli korzystamy z WP-CLI, warto zachować też listę wykonanych komend, dzięki czemu całą operację będzie można w razie potrzeby powtórzyć jeden do jednego. Z Composerem natomiast jest o tyle łatwiej, że rolę dokumentacji może pełnić po prostu historia plików composer.json i composer.lock. Od razu należy też przygotować plan rollbacku, czyli jak w razie problemów wrócimy do ostatniej działającej konfiguracji. W zależności od tego, jak utrzymujemy projekt, takim planem awaryjnym może być przywrócenie poprzedniej wersji samej wadliwej wtyczki, przywrócenie całej strony z backupu albo powrót do wcześniejszego commita w Gitcie; ważne, aby tak ścieżka istniała i była wcześniej sprawdzona.
- Wdrażamy aktualizacje na środowisku produkcyjnym, czyli na „żywej” stronie – na produkcji wdrażamy zmiany w takim samym zakresie, jak podczas testów oraz tą samą metodą, ponieważ wtedy możemy faktycznie odtworzyć całą operację jeden do jednego. Z doświadczenia, najlepiej zaplanować to na noc albo na wczesne godziny poranne, gdy ruch na stronie jest najmniejszy. A co po wdrożeniu? W pierwszej kolejności trzeba jeszcze raz przejść przez wszystkie funkcje obsługiwane przez aktualizowane wtyczki, tak samo, jak na stagingu. Potem, przez pierwsze 2-3 dni warto też uważnie monitorować logi błędów PHP na serwerze oraz logi aktywności wtyczki (np. przy pomocy WP Activity Log), żeby jak najszybciej wychwycić ewentualne anomalie; niektóre błędy wychodzą na wierzch dopiero przy prawdziwym ruchu na stronie.
Środowisko stagingowe (testowe) jako podstawa działania
Środowisko stagingowe (testowe) jako podstawa działania
Z tych siedmiu kroków chyba najważniejszym są testy na stagingu.
Staging to odizolowana kopia Twojej strony z identyczną konfiguracją, wtyczkami, motywem i bazą danych, ale niedostępna dla użytkowników. Tworzy się ją po to, aby móc przetestować wszelkie zmiany w bezpieczny sposób, a nie na żywym organizmie.
Środowisko testowe dla WordPressa można przygotować na trzy sposoby:
- niektórzy hostingodawcy pozwalają to zrobić jednym kliknięciem z panelu hostingu; wtedy kopia strony pojawi się na tym samym serwerze, co wersja dostępna dla użytkowników, tyle że w osobnym katalogu i pod innym adresem URL;
- w bibliotece WordPressa dostępnych jest sporo wtyczek, które zrobią dokładnie to samo; taką opcję ma np. WP Staging albo Duplicator;
- można też ręcznie wykonać kopię strony na serwerze przez FTP i uruchomić na nim drugą instalację WordPressa.
Ważne, żeby środowisko stagingowe wyglądało identycznie jak produkcyjne – testowanie aktualizacji na kopii sprzed trzech miesięcy, gdy baza danych zdążyła przez ten czas urosnąć, mija się z celem. Dlatego kopię strony powinno się wykonywać przed testami za każdym razem od zera.
A co testujemy? Całą stronę, także te obszary, których aktualizacje teoretycznie nie dotyczą: wszystkie ścieżki użytkownika, działanie integracji z systemami zewnętrznymi, warto przyjrzeć się nawet warstwie wizualnej, ponieważ i tu czasem pojawiają się błędy. Chodzi o to, aby upewnić się, że po aktualizacji wtyczek nie ma żadnych „skutków ubocznych”; na tym, w skrócie, polegają testy regresji.
Błąd krytyczny po aktualizacji. Jak szybko przywrócić działanie strony?
Błąd krytyczny po aktualizacji. Jak szybko przywrócić działanie strony?
Jednak nawet jeśli przejdziesz przez aktualizację wtyczek krok po kroku zgodnie ze sztuką, i tak można trafić na błąd krytyczny. Co zrobić w takiej sytuacji?
- Na początek sprawdź, czy działa WordPress Recovery Mode. Od wersji 5.2 WordPress ma wbudowany mechanizm ochrony przed błędami krytycznymi (Fatal Error Protection). Gdy taki błąd się pojawia, system próbuje wysłać na adres e-mail administratora wiadomość z linkiem uruchamiającym tryb odzyskiwania. Przez niego dostaniesz się do panelu WP – wadliwa wtyczka powinna być oznaczona, wtedy możesz ją dezaktywować jednym kliknięciem. Niestety, nie przy każdym błędzie ta ścieżka będzie w ogóle dostępna.
Sprawdź logi błędów. Jeśli nie możesz rozwiązać problemu z pomocą Recovery Mode, musisz znaleźć przyczynę samemu. Radzilibyśmy zacząć od trybu debugowania WordPressa; aby go włączyć, musisz dostać się do plików strony na serwerze (przez FTP, np. FileZillę albo przez menedżera plików na hostingu), znaleźć plik wp-config.php, a w nim linię define('WP_DEBUG', false). Zastąp ją wpisem:
define( 'WP_DEBUG', true ); define( 'WP_DEBUG_LOG', true ); define( 'WP_DEBUG_DISPLAY', false ).W folderze wp-content znajdziesz potem plik debug.log – od tej pory po każdej próbie wejścia na stronę w pliku tym będzie pojawiać się informacja, w jakim folderze, na jakim pliku i na której konkretnie linijce kodu występuje błąd krytyczny. To już wystarczy, żeby zidentyfikować wadliwą wtyczkę. Przy okazji, od razu warto też porównać wpisy z debug.log z logami błędów PHP (serwera). W panelu hostingu powinna znajdować się sekcja typu „Logi”, „Dziennik błędów” albo „Error Log”; przejrzyj ją, aby upewnić się, że źródło błędu leży tylko we wtyczkach, a nie np. w konfiguracji serwera.
- Cofnij ostatnie zmiany najbezpieczniejszą dostępną metodą. Jeżeli widzisz, że problem pojawił się bezpośrednio po aktualizacji wtyczek, pora na rollback do wersji strony sprzed update’u, tak aby przynajmniej użytkownicy odzyskali do niej dostęp. Opcji znów jest kilka; możesz przywrócić całą stronę z backupu, cofnąć się do poprzedniej konfiguracji wtyczek w composer.lock, zapisanej w Gitcie (jeśli korzystasz z Composera) lub ręcznie cofnąć wersje wadliwych wtyczek.
- Dezaktywuj problematyczną wtyczkę przez WP-CLI. Jeśli wtyczka nie jest absolutnie niezbędna do działania strony, możesz ją po prostu wyłączyć. Najprościej zrobić to przez WP-CLI, komendą wp plugin deactivate nazwa-wtyczki.
- W ostateczności możesz dezaktywować wtyczkę również przez zmianę nazwy folderu w plikach strony na serwerze. W tym celu przejdź do katalogu wp-content, a następnie do folderu plugins; znajdź podfolder wadliwej wtyczki i zmień jego nazwę (np. z wtyczka na wtyczka.disabled). WordPress uruchomi wtedy stronę bez niej. Ale to jest tylko metoda „na wszelki wypadek”, lepiej korzystać z WP-CLI albo Composera.
- Po przywróceniu strony nie zostawiaj problemu samemu sobie. Gdy strona znów działa, możesz na spokojnie przeanalizować, z czego konkretnie wynika konflikt w kodzie. Na pewno warto byłoby odtworzyć konfigurację wywołującą błąd krytyczny na stagingu, jeszcze raz prześledzić logi oraz cały stack trace. Być może jesteś w stanie rozwiązać ten konflikt samemu, a być może trzeba będzie poczekać na kolejny update od twórców wtyczki. W najgorszym scenariuszu trzeba będzie zastanowić się nad jakąś alternatywą dla wadliwych pluginów; na szczęście tych w bibliotece WordPressa nie brakuje. Na pewno odradzamy korzystanie ze starszych wersji wtyczek dłużej niż to konieczne.
- Wyłącz tryb debugowania po zakończeniu diagnostyki. Bardzo ważna rzecz – gdy skończysz pracę z logami na głównej wersji strony (na produkcji), koniecznie wróć do wp-config.php i przywróć wpisom debugowania wartości false (albo po prostu usuń dodane linie).
SLA w WordPressie: zabezpieczenie przed kosztami nieudanych aktualizacji
SLA w WordPressie: zabezpieczenie przed kosztami nieudanych aktualizacji
Regularne update’y wtyczek, poprzedzone testami na stagingu, są jednym z podstawowych zadań w ramach każdej usługi stałej opieki technicznej WordPress. Jeżeli myślisz o tym, aby powierzyć swoją stronę specjalistom właśnie pod kątem aktualizacji, koniecznie zadbaj o to, aby częścią umowy było SLA. Przy wdrażaniu update’ów, zwłaszcza w witrynach, które mają po kilkadziesiąt wtyczek, błędy zdarzają się dosyć często. Dobrze sformułowane SLA zabezpieczy Cię przed kosztami ich naprawy i zapewni, że zespół software house’u zareaguje na problem w krótkim czasie, nawet w ciągu godziny.
Takie wsparcie otrzymasz w Smartbees – jeśli potrzebujesz pomocy przy aktualizacji wtyczek WordPress, skontaktuj się z nami. Porozmawiajmy, jakiej opieki potrzebuje Twoja strona!
