Jak pozbyć się nieistniejących shortcode z treści wpisów

Każdy, kto korzysta z WordPressa, na pewno nie raz używał shortcode. Są to specjalne znaczniki wstawiane do treści wpisów, które generują fragmenty kodu HTML. Sam WordPress posiada kilka wbudowanych shortcode (np. `[gallery]` do wstawiania galerii czy `[video]` do osadzania filmów), ale wtyczki i motywy mogą rejestrować własne.

Oczywiście po usunięciu wtyczki lub motywu wszystkie dodane przez nie shortcode przestają działać i w treści wpisów zamiast na przykład efektownego przycisku zobaczymy znacznik w stylu `[super-przycisk]`. Problem nie jest wielki jeśli nasza strona ma kilka lub kilkanaście wpisów, ale jeśli pozbywamy się jakiejś wtyczki lub zmieniamy motyw na blogu, którego prowadzimy od kilku lat, to wyszukanie i usunięcie takich „osieroconych” shortcode może stanowić nie lada wyzwanie. Na szczęście istnieje kilka narzędzi, które mogą nam w tym pomóc.

Wyszukiwanie nieistniejących shortcode

Warto zacząć od znalezienia wszystkich nieistniejących shortcode w treści naszych stron i wpisów. Użyjemy do tego darmowej wtyczki Shortcodes In Use.

Po instalacji i aktywacji rozszerzenia w menu Narzędzia panelu administracyjnego znajdziemy nową sekcję Shortcodes In Use, gdzie możemy wyszukiwać shortcode w treści naszej strony w oparciu o różne kryteria.

Shortcodes In Use

W polu Search Shortcode Tag możemy wpisać nazwę shortcode, którego chcemy znaleźć. Jeśli zostawimy to pole puste, wtyczka wyszuka wszystkie shortcode.

Opcja Filter by Provider/Tag pozwala na filtrowanie wyszukiwanych shortcode według ich „pochodzenia”. Możemy na przykład wybrać tylko shortcode wbudowane w WordPressa lub tylko shortcode zarejestrowane przez wybrane aktywne wtyczki lub aktywny motyw. Opcja ta jest szalenie przydatna gdy chcemy pozbyć się jakiejś wtyczki, ale najpierw chcemy zaktualizować lub usunąć wszystkie zarejestrowane przez nią shortcode, tak aby nawet przez chwilę na naszej stronie nie były wyświetlane ich znaczniki. Tę samą operację możemy chcieć wykonać przed zmianą używanego motywu na inny.
Wybranie opcji Unknown spowoduje wyszukanie nieistniejących shortcode, czyli takich, które nie są zarejestrowane przez żadną z aktywnych wtyczek ani przez używany motyw. Właśnie dzięki tej opcji możemy znaleźć „osierocone” shortcode, wyświetlane na naszej stronie w formie znaczników, których chcemy się pozbyć.

Opcja Filter by Location pozwala na przeszukiwanie tylko wybranych elementów stron i wpisów. Post Title przeszukuje tytuły stron i wpisów, Post Content przeszukuje ich treść, Post Excerpt przeszukuje wypisy, Post Meta przeszukuje dodatkowe dane powiązane z wpisami, a Widget pozwala na przeszukiwanie treści umieszczonych w widżetach. W większości przypadków wystarczy zaznaczenie opcji Post ContentWidget, ewentualnie dodatkowo Post Excerpt.
Jeśli nie wybierzemy żadnej opcji, wtyczka przeszuka wszystkie wszystkie elementy naszej strony.

Opcja Filter Posts by Type pozwala na przeszukiwanie tylko wybranych typów wpisów. Na pewno koniecznie musimy wybrać page (strony) i post (wpisy). Moim zdaniem nie warto przeszukiwać biblioteki mediów (attachment), bo tam raczej nie umieszczamy shortcode. Na zamieszczonym wyżej zrzucie ekranu widać jeszcze typ wpcf7_contact_form, czyli formularze wtyczki Contact Form 7 – gdybym wiedział, że w kodzie tych formularzy używałem jakichś shortcode, to zaznaczyłbym również ten typ wpisu. Jeśli na liście pojawi się typ wpisu, który nic nam nie mówi, to na wszelki wypadek powinniśmy go zaznaczyć.
Jeśli nie wybierzemy żadnej opcji, wtyczka przeszuka wszystkie typy wpisów.

Kliknięcie przycisku Find Shortcodes rozpocznie przeszukiwanie treści naszej strony zgodnie z wybranymi kryteriami. Po chwili (być może dłuższej) zobaczymy wynik wyszukiwania.

Shortcodes In Use - wyniki wyszukiwania

Na powyższym zrzucie ekranu widać cztery znalezione shortcode. Pierwszy z nich jest zarejestrowany przez wtyczkę Quiz And Survey Master, która jest aktywna, tak więc ten shortcode powinien działać i nie musimy nic z nim robić. Trzy kolejne są oznaczone jako Unknown Provider, co oznacza, że nie są zarejestrowane przez żadną z aktywnych wtyczek ani przez używany motyw – czyli po prostu nie istnieją i należy je usunąć lub zastąpić innymi.

Niestety, wtyczka nie pozwala na masowe usuwanie „osieroconych” shortcode. Możemy jedynie ręcznie edytować każdy ze znalezionych wpisów klikając na jego tytuł. Taka ręczna edycja nie będzie problemem gdy mamy do czynienia z kilkunastoma wpisami, ale jeśli wpisów jest już kilkadziesiąt, to taka operacja może nam zająć nawet kilka godzin. Poszukajmy więc jakiegoś bardziej efektywnego sposobu na pozbycie się nieistniejących shortcode z treści wpisów.

Ukrywanie nieistniejących shortcode

Najprostszym sposobem na rozwiązanie problemu nieistniejących shortcode jest ich ukrycie. Możemy do tego celu wykorzystać bezpłatną wtyczkę Remove Orphan Shortcodes – wystarczy ją zainstalować i aktywować. Trzeba jednak pamiętać, że wtyczka ta nie usuwa „osieroconych” shortcode z treści naszych wpisów, a jedynie ukrywa je, tak aby nie były widoczne na stronie.

Nieco bardziej zaawansowaną opcją ukrywania nieistniejących shortcode jest wtyczka Hide Unwanted Shortcodes, która pozwala na ukrycie tylko wybranych shortcode, w tym również istniejących, których po prostu nie chcemy wyświetlać na naszej stronie.

Usuwanie nieistniejących shortcode z treści wpisów i stron

Niestety, nie istnieje (a przynajmniej nic mi o tym nie wiadomo) wtyczka umożliwiająca automatyczne usunięcie „osieroconych” shortcode z bazy danych. Mimo że jest to technicznie wykonalne, to moim zdaniem jest dość ryzykowne i znacznie bezpieczniejszym sposobem jest ręczna modyfikacja treści w panelu administracyjnym. Bezpośrednie grzebanie w bazie danych zawsze jest obarczone ryzykiem, a jedynym sposobem na cofnięcie wykonanych w ten sposób zmian jest odtworzenie bazy z wykonanej uprzednio kopii.

Dodatkowym problemem jest mnogość sposobów, na jakie można zapisać shortcode:

[nasz_shortcode]
[nasz_shortcode /]
[nasz_shortcode parametr="wartosc"]
[nasz_shortcode parametr="wartosc" /]
[nasz_shortcode]Jakaś treść[/nasz_shortcode]
[nasz_shortcode parametr="wartosc"]Jakaś treść[/nasz_shortcode]

Jeśli mimo to jesteśmy zdecydowani na fizyczne usunięcie nieistniejących shortcode bezpośrednio z bazy danych, to możemy do tego celu wykorzystać wtyczkę Search Regex, dzięki której możemy wyszukiwać i zamieniać w bazie danych ciągi znaków używając wyrażeń regularnych.

Uwaga! Przed wykonaniem operacji opisanych w dalszej części wpisu należy bezwzględnie wykonać kopię bazy danych!

Pierwszym krokiem będzie znalezienie wyrażenia regularnego, które wyszuka wszystkie wystąpienia shortcode na naszej stronie. Jak widać na zamieszczonych wyżej przykładach, wariantów jest kilka, dlatego zwykłe wyszukiwanie nie zda tutaj egzaminu.

WordPress posiada funkcję `get_shortcode_regex()`, która zwraca wyrażenie regularne używane do parsowania danego shortcode. Wygląda ono tak:

/\[(\[?)(nasz_shortcode)(?![\w-])([^\]\/]*(?:\/(?!\])[^\]\/]*)*?)(?:(\/)\]|\](?:([^\[]*+(?:\[(?!\/\2\])[^\[]*+)*+)\[\/\2\])?)(\]?)/s

Oczywiście te wyrażenie może zmienić się w kolejnych wersjach WordPressa, tak więc najbezpieczniejszym sposobem jest skorzystanie ze wspomnianej funkcji. Można to zrobić używając wtyczki Shortcode Regex Finder, która jest dostępna na GitHubie. Po jej instalacji i aktywacji wystarczy w panelu administracyjnym przejść do sekcji Ustawienia → Shortcode Regex Finder, wpisać nazwę interesującego nas shortcode i kliknąć przycisk Create the shortcode regex.

Shortcode Regex Finder

Gdy mamy już wyrażenie regularne dla naszego shortcode, instalujemy i aktywujemy wtyczkę Search Regex, a następnie przechodzimy do sekcji Narzędzia → Search Regex.

Search Regex

Przede wszystkim musimy zaznaczyć opcję Regex, dzięki czemu wyszukiwanie będzie korzystało z wyrażeń regularnych. W polu Search pattern wklejamy znalezione wcześniej wyrażenie, a w polu Replace pattern wpisujemy `\5`, dzięki czemu nie stracimy tekstu znajdującego się wewnątrz shortcode (piąty i szósty przykład w zamieszczonej wyżej ramce z przykładami formatów shortcode). Jeśli chcemy usunąć również ten tekst, to pole Replace pattern powinniśmy zostawić puste.

Aby sprawdzić jaki efekt wywoła nasze wyrażenie klikamy przycisk Replace (nie Replace & Save!).

Search Regex - wyniki

Jak widać na tym przykładzie, shortcode `[nasz_shortcode]Jakaś treść[/nasz_shortcode]` zostanie zastąpiony tekstem `Jakaś treść` (dzięki użyciu parametru `\5` w polu Replace pattern). Gdybyśmy tego parametru nie użyli, cały shortcode zostałby po prostu usunięty.

Search Regex - wyniki

Jeśli wszystko wygląda zgodnie z naszymi oczekiwaniami, możemy dokonać masowej zmiany klikając przycisk Replace & Save.

Na zakończenie mała uwaga. W internecie można znaleźć mnóstwo artykułów podających zapytania SQL, którymi (według autorów) można usunąć niepotrzebne shortcode z treści wpisów. Przestrzegam mniej zaawansowanych użytkowników przed korzystaniem z tego typu rozwiązań, bo o pomyłkę naprawdę nie jest trudno. Na dodatek zapytania te nie są w pełni skuteczne – zwykle usuwają tylko najprostsze znaczniki, bez żadnych parametrów.

Bezpośredni link