Sprawdzanie szablonów dla WordPressa za pomocą Theme Check

Theme CheckWtyczka Theme Check to jedno z narzędzi używanych przez moderatorów oficjalnego repozytorium WordPressa do weryfikacji zgłaszanych szablonów. Służy ona do automatycznego wyszukiwania najczęstszych błędów i braków w motywach. Może się ona jednak przydać każdemu użytkownikowi tego CMSa do sprawdzania darmowych szablonów pobranych ze źródeł innych niż oficjalne repozytorium. Sens takiego sprawdzania jest bezdyskusyjny – darmowe motywy mogą nie tylko być niskiej jakości, ale również zawierać złośliwy kod lub ukryte linki reklamowe.

Pisząc o niskiej jakości niektórych bezpłatnych szablonów mam na myśli głównie kwestie związane ze zgodnością z oficjalnymi wytycznymi, kompatybilnością z wtyczkami, a także bezpieczeństwem. Lista rzeczy, na które trzeba uważać korzystając z darmowych szablonów, jest niestety długa.

Na szczęście wtyczka Theme Check jest w stanie wychwycić większość problemów, z jakimi możemy się spotkać. Na samym wstępie muszę jednak zaznaczyć, że nie należy traktować jej jak wyroczni – generowane przez nią raporty to tylko zbiór mniej lub bardziej istotnych sugestii, z których część jest tak naprawdę mało istotna, a niektóre mogą być wręcz mylące (chociaż z drugiej strony lepiej dmuchać na zimne).

Theme CheckPo aktywacji wtyczki w menu Wygląd znajdziemy nową sekcję Theme Check. Aby sprawdzić wybrany szablon wystarczy wybrać go z listy zainstalowanych motywów i nacisnąć przycisk Check it!. Opcjonalnie możemy zaznaczyć opcję Suppress INFO, co spowoduje usunięcie z raportu komunikatów o statusie INFO (informacje). Skanowanie szablonu może zająć dłuższą chwilę – czas trwania tego procesu jest zależny głównie od ilości i wielkości plików sprawdzanego motywu.

Po zakończeniu sprawdzania na stronie zostanie wyświetlony raport zawierający wszystkie znalezione problemy i sugestie usprawnień. Niestety, jego interpretacja nie jest prosta i wymaga podstawowej wiedzy technicznej na temat WordPressa.

Każdy z wyświetlanych przez Theme Check komunikatów posiada jeden z czterech statusów:

  • REQUIRED (wymagane) – problem, który musi zostać usunięty; trzeba pamiętać, że część z nich dotyczy tylko wymagań oficjalnego repozytorium (na przykład konieczność umieszczenia w nagłówku szablonu informacji o licencji), które najczęściej nie mają żadnego wpływu na działanie szablonu
  • WARNING (ostrzeżenie) – znaleziono coś, co może (ale wcale nie musi) być problemem i czemu trzeba się dokładniej przyjrzeć; do tej kategorii trafiają na przykład komunikaty o istnieniu niepotrzebnych plików lub katalogów czy używaniu potencjalnie niebezpiecznych funkcji (takich jak eval(), file_get_contents() czy base64_decode())
  • RECOMMENDED (zalecane) – komunikaty z tym statusem zawierają propozycje usprawnień lub poprawek, które możemy wprowadzić do szablonu; nie są wymagane, aczkolwiek zignorowanie niektórych z nich może prowadzić do problemów w przyszłości
  • INFO (informacja) – komunikaty mające charakter informacyjny; możemy się do nich zastosować dla świętego spokoju

Komunikaty Theme Check

Interpretacja raportu wygenerowanego przez wtyczkę Theme Check nie jest niestety jednoznaczna. Niektóre z komunikatów wskazują potencjalnie niebezpieczne miejsca, które w rzeczywistości niebezpieczne wcale nie są. Inne z kolei dotyczą tylko wymagań stawianych przed szablonami trafiającymi do oficjalnego repozytorium WordPressa. Poniżej znajdują się wyjaśnienia praktycznie wszystkich komunikatów, jakie mogą pojawić się w raporcie.

WARNING: User levels were deprecated in 2.0. Please see Roles_and_Capabilities.
Szablon używa poziomów użytkownika, które w WordPressie 2.0 zostały uznane za przestarzałe. Powinien korzystać z mechanizmu ról.

REQUIRED: Themes should use add_theme_page() for adding admin pages.
Szablon dodaje swoje elementy do menu panelu administracyjnego w nieprawidłowy sposób.

WARNING: This theme appears to have been auto-generated. Generated themes are not allowed in the themes directory.
Ten komunikat informuje nas, że szablon został wygenerowany automatycznie przez program Artisteer. Nie oznacza to, że nie możemy go używać – po prostu tego typu motywy nie są przyjmowane do oficjalnego repozytorium.

WARNING: eval() is not allowed.
W szablonie znaleziono wywołanie funkcji eval(), która wykonuje przekazany jej kod PHP. Jest to potencjalnie niebezpieczne, co nie oznacza, że zawsze należy to interpretować jako nieprawidłowość szablonu.

WARNING: PHP sytem calls should be disabled by server admins anyway!
Szablon zawiera wywołanie jednej z funkcji pozwalających na wykonywanie poleceń systemowych (popen, proc_open, exec, shell_exec, system, passthru). Może to być sygnał, że autor szablonu coś kombinuje, aczkolwiek funkcje te i tak powinny być zablokowane na serwerze.

WARNING: Themes should not change server PHP settings.
Szablon próbuje zmienić ustawienia PHP za pomocą funkcji ini_set(). Niezależnie od intencji autora, motywy nie powinny robić takich rzeczy.

WARNING: base64_decode() is not allowed / base64_encode() is not allowed
Funkcje base64_decode()base64_encode() są często wykorzystywane do ukrywania w kodzie szablonu różnych złośliwych elementów, na przykład linków, reklam czy przekierowań. Nie zawsze jest to robione złośliwie – czasem autor w ten sposób próbuje utrudnić użytkownikowi usunięcie linku zwrotnego z darmowego szablonu. W płatnych szablonach premium niektórzy autorzy przechowują w ten sposób domyślne opcje motywu albo domyślne obrazki. Osobom nie mającym wiedzy technicznej na temat programowania w PHP może być trudno ocenić, czy dane wywołanie jednej z tych funkcji jest dopuszczalne czy nie – w takim przypadku najlepiej poprosić o pomoc kogoś bardziej doświadczonego lub po prostu usunąć szablon.

WARNING: uudecode() is not allowed / str_rot13() is not allowed
Funkcje uudecode()str_rot13() są wykorzystywane w podobnym celu jak te wymienione wyżej. Mogą, ale wcale nie muszą, służyć do ukrycia złośliwego kodu.

WARNING: Google search code detected / Google advertising code detected
W szablonie umieszczony jest kod wyszukiwarki Google lub kod reklamowy Google AdSense. Najczęściej robione jest to po to, aby wyświetlać reklamy z identyfikatorem autora. Jeśli nie chcemy, aby nasza strona służyła za darmową powierzchnię reklamową, to powinniśmy ten kod usunąć lub po prostu nie korzystać z zawierającego go motywu.

REQUIRED: Could not find nazwa_elementu.
To cała seria komunikatów, które mówią o brakujących wymaganych elementach szablonu. Sprawdzane elementy to: DOCTYPE, language_attributes (atrybut lang w znaczniku html), charset (atrybut określający stronę kodową używaną w serwisie), wp_footer (funkcja WordPressa wymagana w stopce strony), wp_head (funkcja WordPressa wymagana w nagłówku), add_theme_support, register_sidebar (rejestracja paneli bocznych), dynamic_sidebar (wyświetlanie paneli bocznych), comments_template (szablon komentarzy), wp_list_comments (lista komentarzy), comment_form (formularz dodawania komentarza), body_class (klasy dla znacznika body), wp_link_pages (paginacja stron), post_class (klasy dla wpisów).
Elementy dotyczące komentarzy i paneli bocznych mogą zostać pominięte jeśli nie chcemy z nich korzystać. Pozostałe elementy powinny znaleźć się w szablonie, głównie przez wzgląd na kompatybilność z wtyczkami.

REQUIRED: Could not find the comment-reply script enqueued.
Szablon nie ładuje pliku comment-reply.js, niezbędnego do obsługi odpowiedzi w formularzu dodawania komentarza. Nie jest to niezbędne jeśli nie korzystamy z komentarzy lub używamy jakiegoś zewnętrznego rozwiązania (Disqus, komentarze Facebooka, Livefyre, Intense Debate).

REQUIRED: The theme doesn’t have comment pagination code in it. Use paginate_comments_links() or next_comments_link() and previous_comments_link() to add comment pagination.
W szablonie nie znaleziono wywołan funkcji odpowiedzialnych za stronicowanie komentarzy. Jak wyżej – nie jest to potrzebne jeśli nie korzystamy z komentarzy lub używamy zewnętrznego rozwiązania.

RECOMMENDED: STYLESHEETPATH was found in the file nazwa_pliku. Use get_stylesheet_directory() instead.
Motyw korzysta z przestarzałej stałej STYLESHEETPATH, a zamiast tego powinien korzystać z funkcji get_stylesheet_directory().

RECOMMENDED: TEMPLATEPATH was found in the file nazwa_pliku. Use get_template_directory() instead.
Motyw korzysta z przestarzałej stałej TEMPLATEPATH, a zamiast tego powinien korzystać z funkcji get_template_directory().

RECOMMENDED: PLUGINDIR was found in the file nazwa_pliku. Use WP_PLUGIN_DIR instead.
Motyw korzysta z przestarzałej stałej PLUGINDIR, a zamiast tego powinien korzystać z WP_PLUGIN_DIR.

RECOMMENDED: MUPLUGINDIR was found in the file nazwa_pliku. Use WPMU_PLUGIN_DIR instead.
Motyw korzysta z przestarzałej stałej MUPLUGINDIR, a zamiast tego powinien korzystać z WPMU_PLUGIN_DIR.

REQUIRED: No content width has been defined.
Zmienna $content_width określa szerokość treści we wpisach. Dzięki niej WordPress może na przykład automatycznie dostosowywać osadzane za pomocą oEmbed elementy. Jeśli szablon nie ustawia tej zmiennej, można to zrobić dodajć do pliku functions.php następujący kod:

if(!isset($content_width))
    $content_width = 900;

RECOMMENDED: No reference to add_theme_support( 'custom-header’ ) was found in the theme. It is recommended that the theme implement this functionality if using an image for the header.
Szablon nie korzysta z wbudowanej w WordPressa funkcji pozwalającej na edycję obrazka i koloru nagłówka strony (Wygląd → Nagłówek).

RECOMMENDED: No reference to add_theme_support( 'custom-background’ ) was found in the theme. If the theme uses background images or solid colors for the background, then it is recommended that the theme implement this functionality.
Szablon nie korzysta z wbudowanej w WordPressa funkcji pozwalającej na ustawianie koloru i obrazka dla tła strony (Wygląd → Tło).

REQUIRED / RECOMMENDED: nazwa_przestarzałego_elementu found in the file nazwa_pliku. Deprecated since version numer_wersji. Use nazwa_elementu instead.
W szablonie znaleziono wywołanie funkcji WordPressa (ewentualnie zaczepu – hook), która została oznaczona jako przestarzała. Oznacza to, że funkcja jest przeznaczona do usunięcia i korzystanie z niej nie jest zalecane. Problemy tego typu występują najczęściej w dawno nieaktualizowanych szablonach i są o tyle istotne, że gdy funkcja zostanie w końcu fizycznie usunięta z WordPressa, to motyw po prostu przestanie działać.
Komunikat ten może mieć status REQUIRED lub RECOMMENDED, w zależności od tego, w jakiej wersji WordPressa dana funkcja została oznaczona jako przestarzała. Jeśli miało to miejsce w wersji aktualnej lub poprzedniej, to komunikat otrzyma status RECOMMENDED; jeśli dawniej – REQUIRED. W większości przypadków komunikat zawiera informację o funkcji, której można użyć wzamian.

REQUIRED: Please remove any extraneous directories like .git or .svn from the ZIP file before uploading it.
Komunikat z prośbą o usunięcie z katalogu szablonu zbędnych folderów, takich jak .git czy .svn. Jest to wymóg pochodzący z oficjalnego repozytorium – istnienie tych katalogów na serwerze nie ma żadnego znaczenia.

WARNING: thumbs.db Windows thumbnail store found.
To cała seria komunikatów, zawierająca kilkanaście różnych plików, które są po prostu niepotrzebne. Podobnie jak w przypadku katalogów, nie ma to żadnego wpływu na działanie motywów.

RECOMMENDED: No reference to add_editor_style() was found in the theme.
WordPress umożliwia dodawanie do edytora wizualnego dodatkowych stylów, dzięki którym teksty mogą wyglądać w edytorze podobnie jak na stronie. Dobrze jest, gdy szablon to robi, ale nie jest to coś, bez czego nie można żyć.

WARNING: could not find the file index.php / comments.php / style.css in the theme.
Komunikat ten informuje o braku jednego z wymaganych przez WordPressa plików szablonu. Ma on raczej charakter informacyjny, bo wybrakowanego motywu i tak nie będzie się dało aktywować.

REQUIRED: This theme doesn’t seem to support the standard avatar functions.
Szablon nie posiada obsługi awatarów, a konkretnie wywołania funkcji get_avatar lub wp_list_comments. Jest to wymóg dla szablonów publikowanych w oficjalnym repozytorium, ale nie ma żadnego wpływu na działanie motywu.

RECOMMENDED: Possible variable nazwa_zmiennej found in translation function in nazwa_pliku. Translation function calls must NOT contain PHP variables.
Komunikat informuje o znalezieniu zmiennej w wywołaniu jednej z funkcji służącej do obsługi tłumaczeń w WordPressie. Jest to błąd, który będzie jednak problemem tylko gdy zechcemy przetłumaczyć szablon.

INFO: iframe was found in the file nazwa_pliku
Jeden z niewielu komunikatów o statusie INFO, na który warto zwrócić uwagę. Ramki iframe nie są niebezpieczne same w sobie, ale pozwalają na ładowanie zewnętrznych stron i wyświetlanie ich na naszej stronie, przez co często są wykorzystywane do umieszczania reklam na stronach (również przez złośliwe oprogramowanie). Jeśli szablon używa iframe, to należy bezwzględnie sprawdzić po co to robi.

INFO: The theme appears to use include or require. If these are being used to include separate sections of a template from independent files, then get_template_part() should be used instead.
Szablon do dołączania plików PHP używa funkcji include lub require, a powinien robić to za pomocą funkcji get_template_part(). Nie zawsze jest to możliwe, tak więc należy traktować ten komunikat zgodnie z jego statusem, czyli jako informację.

WARNING: Both DOS and UNIX style line endings were found in the file nazwa_pliku.
W jednym z plików znajdują się znaki końca linii w dwóch różnych formatach (DOS i UNIX). Nie powinno to stanowić żadnego problemu – poza tym, że jest irytujące podczas edycji pliku i świadczy o niechlujstwie autora.

INFO: Possible hard-coded links were found in the file nazwa_pliku.
Szablon może zawierać „zaszyte” linki. Mogą to być na przykład linki do strony autora motywu, w czym oczywiście nie ma żadnego problemu (poza tym, że powinny one zostać umieszczone tak, aby można je było usunąć lub zmodyfikować bez konieczności edycji plików szablonu).

WARNING: file_get_contents was found in the file nazwa_pliku.
Cała seria komunikatów, informująca o znalezieniu w kodzie szablonu jednej z funkcji pozwalających na operacje na plikach, w tym również na pobieranie plików z zewnętrznych serwerów (file_get_contents, curl_exec, curl_init, readfile, fopen, fsockopen, pfsockopen, fclose, fread, fwrite, file_put_contents). Z funkcji tych często korzysta złośliwe oprogramowanie, ale również na przykład skrypty do skalowania obrazków. Komunikatu tego nie należy jednak ignorować – zawsze trzeba sprawdzić do czego motyw wykorzystuje te funkcje.
Co ciekawe, reguła ta nie sprawdza wykorzystywania funkcji wp_remote_get, która również pozwala na pobieranie plików z zewnętrznych serwerów.

RECOMMENDED: No reference to nav_menu’s was found in the theme.
Szablon nie posiada wywołania funkcji służącej do wyświetlania menu. Nie jest to wymagane jeśli szablon nie ma menu.

INFO: Non-printable characters were found in the nazwa_pliku file. You may want to check this file for errors.
W jednym z plików szablonu znajdują się niewidoczne znaki. Najczęściej jest to wynik błędu podczas edycji lub zapisu pliku.

WARNING: Found PHP short tags in file nazwa_pliku.
W szablonie znajdują się skrócone znaczniki otwarcia kodu PHP (<? zamiast <?php). Używanie ich nie jest zalecane, ponieważ nie działają na wszystkich serwerach.

REQUIRED: add_theme_support( 'post-formats’ ) was found in the file nazwa_pliku. However get_post_format and/or has_post_format were not found, and no use of formats in the CSS was detected.
Szablon deklaruje obsługę formatów wpisów, ale nie znaleziono w nim wywołań funkcji odpowiedzialnych za ich wyświetlanie, przez co najprawdopodobniej wszystkie formaty wyświetlane są tak samo.

REQUIRED: The theme doesn’t have post pagination code in it.
Szablon nie wywołuje funkcji służących do wyświetlania stronicowania (linków do następnej i poprzedniej strony). Zdecydowanie wymaga to poprawienia.

RECOMMENDED: No reference to the_post_thumbnail() was found in the theme.
Oznacza to, że szablon nie używa funkcji the_post_thumbnail() do wyświetlania ikon wpisów. Może to oznaczać, że motyw nie obsługuje w ogóle ikon wpisów lub obsługuje je we własny sposób.

RECOMMENDED: No reference to post-thumbnails was found in the theme.
Szablon nie deklaruje obsługi ikon wpisów. Najczęściej dlatego, że ich po prostu nie obsługuje.

REQUIRED: get_option( 'home’ ) / get_option( 'site_url’ ) was found in the file nazwa_pliku. Use home_url() / site_url() instead.
Szablon odczytuje adres URL strony za pomocą funkcji get_option zamiast home_url() lub site_url(). Najczęściej ma to miejsce w starych, nieaktualizowanych motywach.

RECOMMENDED: Screenshot dimensions are wrong! Ratio of width to height should be 4:3.
Dołączony do szablonu obrazek ze zrzutem ekranu ma nieprawidłowe proporcje. Istotne tylko gdy chcemy opublikować motyw w oficjalnym repozytorium.

RECOMMENDED: Screenshot size should be 600×450, to account for HiDPI displays. Any 4:3 image size is acceptable, but 600×450 is preferred.
Dołączony do szablonu zrzut ekranu ma nieprawidłowy rozmiar. Prawidłowym będzie każdy obrazek o proporcjach 4:3, ale zalecany rozmiar to 600×450 pikseli. Istotne tylko gdy chcemy opublikować motyw w oficjalnym repozytorium.

REQUIRE: Please use get_search_form() instead of including searchform.php directly.
Szablon dołącza plik searchform.php zamiast wyświetlać pole wyszukiwarki za pomocą funkcji get_search_form(). Może to powodować problemy z kompatybilnością z wtyczkami, które w jakiś sposób współpracują z wyszukiwarką. Problem ten najczęściej występuje w starych, nieaktualizowanych motywach.

REQUIRE: nazwa_elementu is missing from your style.css header.
Komunikat informujący o brakującym wymaganym nagłówku w pliku style.css. Wymaganymi nagłówkami są: Theme Name (nazwa szablonu), Description (opis szablonu), Author (nazwa autora), Version (numer wersji), License (licencja, na jakiej został wydany szablon) i License URI (adres URL strony z treścią licencji). Tak naprawdę do działania wymagana jest tylko nazwa szablonu – pozostałe nagłówki są konieczne do publikacji motywu w oficjalnym repozytorium.

REQUIRED: nazwa_klasy css class is needed in your theme css.
Ten komunikat informuje o braku jednej z wymaganych klas w pliku CSS. Brak którejś z nich może (ale nie musi) powodować problemy z formatowaniem niektórych elementów treści wpisu.

RECOMMENDED: nazwa_funkcji was found in the file nazwa_pliku. Use nazwa_funkcji instead.
Szablon korzysta z przestarzałych lub niezalecanych funkcji do pobierania informacji o stronie. Nie jest to problem dopóki funkcje te nie zostaną całkowicie usunięte z WordPressa.

REQUIRED: This theme doesn’t seem to display tags. Modify it to display tags in appropriate locations.
Motyw nie korzysta z funkcji wyświetlającej tagi wpisów. Komunikat ten można zignorować jeśli nie chcemy korzystać z tagów.

INFO: At least one hard coded date was found in the file nazwa_pliku.
Komunikat ten informuje o „zaszytym” w szablonie formacie daty lub czasu. Motyw powinien pobierać format daty i czasu z ustawień strony.

Bezpośredni link