Zaczynasz przygodę z WordPress i czujesz się zagubiony, gdy musisz coś zmienić przez FTP albo edytor kodu? Nie wiesz, gdzie szukać motywów, gdzie lądują wgrane zdjęcia albo dlaczego nie wolno ruszać niektórych folderów?
Ten przewodnik rozwieje wszystkie wątpliwości. Po jego przeczytaniu będziesz dokładnie wiedzieć, co gdzie się znajduje w instalacji WordPress, dlaczego struktura katalogów jest zaprojektowana właśnie tak i jak poruszać się po niej bez ryzyka zepsucia strony.
1. Dlaczego warto znać strukturę plików WordPress?
WordPress to najpopularniejszy system zarządzania treścią na świecie – według danych W3Techs napędza ponad 43% wszystkich stron internetowych. Ogromna część z nich to projekty, przy których pracują deweloperzy, freelancerzy i agencje.
Znajomość struktury plików WordPress jest niezbędna, gdy:
- chcesz edytować motyw lub wtyczkę bez rozbijania całej strony,
- musisz zdiagnozować błąd i nie wiesz, gdzie szukać logów,
- przeprowadzasz migrację strony na nowy serwer,
- chcesz zabezpieczyć instalację przed typowymi atakami,
- pracujesz z FTP lub SSH i potrzebujesz wiedzieć, co gdzie leży.
Bez tej wiedzy nawet proste zadania zamieniają się w chaos. Z nią – stajesz się skuteczniejszy i pewniejszy w tym, co robisz.
2. Widok ogólny – trzy główne katalogi
Po zainstalowaniu WordPress i połączeniu się przez FTP (np. FileZillą) lub SSH zobaczysz katalog główny instalacji. Wygląda on mniej więcej tak:
public_html/ ← katalog główny instalacji
│
├── wp-admin/ ← panel administracyjny
├── wp-includes/ ← biblioteki i funkcje core WP
├── wp-content/ ← Twoje motywy, wtyczki, media
│
├── wp-config.php ← główna konfiguracja
├── wp-login.php ← strona logowania
├── index.php ← punkt wejścia
├── .htaccess ← reguły serwera Apache
└── (kilkanaście innych plików .php)
Najważniejsza zasada, którą musisz zapamiętać:
wp-admin/ i wp-includes/ są nadpisywane przy każdej aktualizacji WordPressa. Nigdy nie umieszczaj tam własnego kodu – zniknie przy najbliższej aktualizacji.
Cała Twoja praca – motywy, wtyczki, własny kod – należy do wp-content/. To jedyny katalog, który WordPress zostawia w spokoju podczas aktualizacji core’u.
3. wp-content/ – Twoje królestwo
To najważniejszy katalog z perspektywy dewelopera. Wszystko, co tworzysz lub instalujesz, ląduje właśnie tutaj.
wp-content/
├── themes/ ← motywy
├── plugins/ ← wtyczki
├── uploads/ ← media (zdjęcia, pliki PDF itp.)
├── mu-plugins/ ← must-use plugins (opcjonalny)
├── languages/ ← tłumaczenia
└── upgrade/ ← tymczasowe pliki aktualizacji
3.1 themes/ – motywy graficzne
W tym folderze mieszkają wszystkie zainstalowane motywy. Każdy motyw to osobny podfolder, np.:
themes/
├── twentytwentyfive/ ← domyślny motyw WP
├── moj-motyw/ ← Twój własny motyw
└── moj-motyw-child/ ← motyw dziecka (child theme)
Czym jest motyw dziecka? To specjalny motyw, który dziedziczy wygląd i funkcje motywu rodzica, ale pozwala Ci wprowadzać własne zmiany. Jeśli kiedykolwiek zaktualizujesz motyw rodzica – Twoje modyfikacje w motywie dziecka zostają nienaruszone. Zawsze twórz motyw dziecka zamiast edytować bezpośrednio pliki motywu rodzica.
Wewnątrz folderu z motywem znajdziesz m.in.:
| Plik |
Rola |
style.css |
główny arkusz stylów + nagłówek z metadanymi motywu |
functions.php |
rejestracja hooków, skryptów, funkcji motywu |
index.php |
domyślny szablon strony |
header.php |
szablon nagłówka |
footer.php |
szablon stopki |
single.php |
szablon pojedynczego wpisu |
page.php |
szablon strony statycznej |
template-parts/ |
fragmenty szablonów wielokrotnego użytku |
3.2 plugins/ – wtyczki
Każda wtyczka to osobny podfolder lub (rzadko) pojedynczy plik .php:
plugins/
├── woocommerce/ ← wtyczka z wieloma plikami
├── akismet/
└── hello-dolly.php ← wtyczka jako pojedynczy plik
Aby tymczasowo wyłączyć wtyczkę bez dostępu do panelu WP (np. gdy strona się wysypała), wystarczy zmienić nazwę jej folderu przez FTP – WordPress przestanie ją ładować.
3.3 uploads/ – pliki mediów
Tu trafiają wszystkie pliki wgrane przez panel WordPress: zdjęcia, PDF-y, wideo, dokumenty. WordPress automatycznie sortuje je według roku i miesiąca:
uploads/
├── 2024/
│ ├── 01/
│ ├── 06/
│ └── 12/
└── 2025/
├── 01/
└── 05/
Ważne: Nie wrzucaj plików do tego folderu ręcznie przez FTP. WordPress nie będzie o nich wiedział – nie pojawią się w bibliotece mediów i nie będziesz mógł ich łatwo zarządzać z poziomu panelu. Zawsze wgrywaj media przez Multimedia → Dodaj nowy.
Jeśli strona rośnie i uploads zaczyna zajmować dużo miejsca, warto rozważyć offloading mediów do zewnętrznego storage (np. Amazon S3 z wtyczką Offload Media).
3.4 mu-plugins/ – wtyczki Must-Use
Must-Use plugins (znane też jako MU plugins) to specjalny rodzaj wtyczek, które:
- ładują się zawsze, automatycznie, bez potrzeby aktywowania,
- nie można ich wyłączyć z poziomu panelu WP,
- są niewidoczne na standardowej liście wtyczek (widoczne tylko w zakładce „Must-Use”).
Kiedy warto tu coś umieszczać? Na przykład gdy masz krytyczny kod, który musi działać zawsze – poprawki bezpieczeństwa, własny logger błędów albo kod, którego nie chcesz, żeby ktoś przypadkowo wyłączył.
Folder mu-plugins/ nie istnieje domyślnie – musisz go sam utworzyć w wp-content/.
3.5 languages/ – tłumaczenia
Pliki tłumaczeń dla WordPressa, motywów i wtyczek:
languages/
├── pl_PL.mo ← skompilowane tłumaczenie WordPress (binarne)
├── pl_PL.po ← plik źródłowy tłumaczenia (edytowalny)
├── plugins/ ← tłumaczenia wtyczek
└── themes/ ← tłumaczenia motywów
Pliki .po to edytowalne źródła tłumaczeń (otworzysz je np. w Poedit). Pliki .mo to skompilowane wersje binarne, które WordPress faktycznie odczytuje. Pliki .json obsługują tłumaczenia po stronie JavaScript (m.in. w edytorze Gutenberg).
4. wp-includes/ – serce WordPressa
Ten katalog zawiera cały silnik WordPressa: klasy, funkcje, biblioteki zewnętrzne. To stąd pochodzi kod obsługujący posty, użytkowników, zapytania do bazy danych, REST API i wszystko inne.
wp-includes/
├── js/ ← pliki JavaScript core WP
├── css/ ← style core WP
├── images/ ← ikony i obrazy systemowe
├── class-wp.php ← główna klasa WordPress
├── class-wp-query.php ← obsługa zapytań do bazy
├── functions.php ← tysiące funkcji pomocniczych WP
├── post.php ← obsługa postów
├── user.php ← obsługa użytkowników
├── rest-api/ ← WordPress REST API
└── ... ← kilkaset innych plików
Zapamiętaj: nie edytuj żadnego pliku w wp-includes/. Przy aktualizacji WordPress wszystkie te pliki zostaną nadpisane i stracisz wszelkie zmiany. Jeśli chcesz zmodyfikować zachowanie jakiejś funkcji core – użyj hooków (filtrów i akcji) w motywie lub wtyczce.
5. wp-admin/ – panel administracyjny
Ten katalog zawiera wszystkie pliki odpowiedzialne za wyświetlanie i obsługę panelu administracyjnego WordPress (/wp-admin).
wp-admin/
├── css/ ← style panelu admina
├── js/ ← skrypty panelu admina
├── images/ ← grafiki interfejsu
├── includes/ ← pliki pomocnicze admina
├── network/ ← pliki WordPress Multisite
├── index.php ← strona główna dashboardu
├── post.php ← edytor postów
├── options.php ← strona ustawień
└── ...
Podobnie jak wp-includes/ – nie modyfikuj plików w tym katalogu. Wszystko, co chcesz dodać do panelu admina (własne menu, metaboxes, strony ustawień), realizuj przez hooki w swoich wtyczkach lub motywie.
6. Pliki w katalogu głównym
Oprócz trzech głównych katalogów, w katalogu głównym instalacji WordPress znajdziesz kilkanaście plików. Oto te, które musisz znać:
| Plik |
Opis |
Czy można edytować? |
wp-config.php |
Konfiguracja bazy danych, tryb debug, klucze bezpieczeństwa |
Tak – to Twój plik |
wp-login.php |
Strona logowania do panelu |
Nie modyfikuj |
index.php |
Punkt wejścia – ładuje WordPress |
Nie modyfikuj |
.htaccess |
Reguły serwera Apache, obsługa permalinków |
Tak – ostrożnie |
wp-cron.php |
Obsługa zaplanowanych zadań (WP Cron) |
Nie modyfikuj |
xmlrpc.php |
Stary protokół zdalnego dostępu |
Zablokuj przez .htaccess |
readme.html |
Informacje o wersji WP |
Usuń lub zablokuj |
license.txt |
Licencja GPL |
Można zostawić |
wp-trackback.php |
Obsługa trackbacków |
Rzadko potrzebny |
Dlaczego readme.html warto usunąć lub zablokować?
Plik readme.html wyświetla numer wersji WordPress. Atakujący może go odczytać i dopasować znane luki bezpieczeństwa do Twojej konkretnej wersji. Usuń go lub zablokuj dostęp przez .htaccess.
7. wp-config.php – najważniejszy plik konfiguracyjny
wp-config.php to plik, który musisz dobrze poznać. Zawiera wszystkie krytyczne ustawienia Twojej instalacji WordPress.
Dane dostępowe do bazy danych
define( 'DB_NAME', 'nazwa_bazy' );
define( 'DB_USER', 'uzytkownik' );
define( 'DB_PASSWORD', 'haslo' );
define( 'DB_HOST', 'localhost' );
define( 'DB_CHARSET', 'utf8mb4' );
To pierwsze, czego szukasz, gdy chcesz połączyć się z bazą danych ręcznie (np. przez phpMyAdmin) albo gdy strona pokazuje błąd „Error establishing a database connection”.
Prefiks tabel
$table_prefix = 'wp_';
Domyślny prefiks wp_ jest powszechnie znany i bywa celem ataków SQL injection. Przy nowej instalacji warto zmienić go na coś unikalnego, np. moja7_. Zmiana prefiksu na istniejącej stronie wymaga aktualizacji bazy danych – nie rób tego ręcznie bez wtyczki lub znajomości SQL.
Klucze bezpieczeństwa (Security Keys)
define( 'AUTH_KEY', 'losowy-ciag-znakow' );
define( 'SECURE_AUTH_KEY', 'losowy-ciag-znakow' );
define( 'LOGGED_IN_KEY', 'losowy-ciag-znakow' );
define( 'NONCE_KEY', 'losowy-ciag-znakow' );
// ...
Klucze te służą do szyfrowania ciasteczek sesji i tokenów bezpieczeństwa. Generuje się je automatycznie podczas instalacji. Jeśli podejrzewasz kompromitację konta – zmiana kluczy natychmiast wyloguje wszystkich zalogowanych użytkowników. Nowe klucze wygenerujesz na stronie https://api.wordpress.org/secret-key/1.1/salt/.
Tryb debugowania
define( 'WP_DEBUG', true ); // włącz wyświetlanie błędów
define( 'WP_DEBUG_LOG', true ); // zapisuj błędy do pliku
define( 'WP_DEBUG_DISPLAY', false ); // nie wyświetlaj błędów na stronie
Na środowisku deweloperskim włącz WP_DEBUG i WP_DEBUG_LOG. Na produkcji zawsze ustaw WP_DEBUG_DISPLAY na false – wyświetlanie błędów PHP na żywo to poważna luka bezpieczeństwa. Logi błędów znajdziesz w wp-content/debug.log.
Przeniesienie wp-config.php wyżej
WordPress pozwala na przeniesienie wp-config.php o jeden poziom wyżej niż katalog główny instalacji (np. z public_html/ do katalogu nadrzędnego). Dzięki temu plik nie jest dostępny przez przeglądarkę, co zwiększa bezpieczeństwo – dane bazy danych nie są narażone nawet jeśli serwer błędnie skonfiguruje obsługę PHP.
8. .htaccess – niewidoczny strażnik
Plik .htaccess to plik konfiguracyjny serwera Apache. WordPress używa go głównie do obsługi ładnych permalinków (przyjaznych adresów URL). Domyślna zawartość wygenerowana przez WordPress:
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
Nie usuwaj sekcji między # BEGIN WordPress a # END WordPress – WordPress regeneruje ją automatycznie i może nadpisać Twoje zmiany. Własne reguły dodawaj poza tymi znacznikami.
Przykłady przydatnych reguł w .htaccess:
# Zablokuj dostęp do xmlrpc.php
<Files xmlrpc.php>
Order Allow,Deny
Deny from all
</Files>
# Zablokuj wyświetlanie listy plików w katalogach
Options -Indexes
# Chroń wp-config.php
<Files wp-config.php>
Order Allow,Deny
Deny from all
</Files>
# Zablokuj uruchamianie PHP w katalogu uploads
<Directory "/wp-content/uploads">
<Files "*.php">
Order Allow,Deny
Deny from all
</Files>
</Directory>
Jeśli używasz serwera Nginx zamiast Apache, analogiczne reguły definiujesz w pliku konfiguracyjnym serwera (nie ma odpowiednika .htaccess).
9. Uprawnienia plików i folderów
Nieprawidłowe uprawnienia to jeden z najczęstszych powodów problemów z WordPress. Ogólna zasada:
| Typ |
Zalecane uprawnienia |
| Foldery |
755 |
| Pliki |
644 |
| wp-config.php |
600 lub 640 |
Co oznaczają te liczby? Uprawnienia Unix zapisuje się jako trzy cyfry: właściciel / grupa / pozostali. Cyfra 7 to pełny dostęp (odczyt + zapis + wykonanie), 5 to odczyt i wykonanie, 4 to tylko odczyt.
Przez SSH możesz ustawić uprawnienia hurtowo:
# Ustaw 755 dla wszystkich katalogów
find /ścieżka/do/wp -type d -exec chmod 755 {} \;
# Ustaw 644 dla wszystkich plików
find /ścieżka/do/wp -type f -exec chmod 644 {} \;
# Zabezpiecz wp-config.php
chmod 600 /ścieżka/do/wp/wp-config.php
Nigdy nie ustawiaj uprawnień 777 (pełny dostęp dla wszystkich) – to otwarte zaproszenie dla atakujących, by umieszczali złośliwy kod na Twoim serwerze.
10. Złote zasady bezpieczeństwa a struktura plików
Znajomość struktury plików pozwala też lepiej zabezpieczyć instalację. Oto najważniejsze praktyki:
1. Usuń lub zablokuj readme.html i license.txt Ujawniają wersję WordPress, co ułatwia ataki ukierunkowane.
2. Zablokuj xmlrpc.php XML-RPC to stary protokół, który jest rzadko potrzebny, a często atakowany (brute-force, DDoS amplification). Jeśli nie korzystasz z aplikacji mobilnej WordPress lub Jetpack – zablokuj.
3. Chroń wp-content/uploads/ przed wykonywaniem PHP Atakujący mogą próbować wgrać plik .php jako „zdjęcie”. Dodaj regułę do .htaccess, która blokuje wykonywanie PHP w tym katalogu.
4. Ogranicz dostęp do wp-login.php Jeśli logujesz się zawsze z tego samego IP – ogranicz dostęp do strony logowania po adresie IP. Ewentualnie włącz dwuetapowe uwierzytelnianie (2FA).
5. Przenieś wp-config.php o katalog wyżej Jak opisano wcześniej – plik konfiguracyjny poza public_html/ jest niedostępny przez HTTP.
6. Regularnie sprawdzaj integralność plików Wtyczki takie jak Wordfence czy iThemes Security potrafią porównać pliki core WordPressa z oficjalnym repozytorium i wykryć nieautoryzowane zmiany.
11. Ściągawka: gdzie szukać konkretnych rzeczy?
| Szukam… |
Gdzie to jest? |
| Pliki aktywnego motywu |
wp-content/themes/nazwa-motywu/ |
| Własne funkcje motywu |
wp-content/themes/nazwa-motywu/functions.php |
| Zainstalowane wtyczki |
wp-content/plugins/ |
| Wgrane zdjęcia i pliki |
wp-content/uploads/ |
| Logi błędów PHP/WP |
wp-content/debug.log |
| Dane dostępowe do bazy |
wp-config.php |
| Ustawienia permalinków |
.htaccess |
| Tłumaczenia WordPressa |
wp-content/languages/ |
| Tłumaczenia wtyczek |
wp-content/languages/plugins/ |
| Strona logowania |
wp-login.php |
| Zaplanowane zadania WP |
wp-cron.php |
| Klasy i funkcje core WP |
wp-includes/ |
Typowe scenariusze:
- Strona się wysypała po instalacji wtyczki → przejdź przez FTP do
wp-content/plugins/, zmień nazwę folderu problematycznej wtyczki. WordPress ją wyłączy.
- Nie ma WYSIWYG, białe okno → sprawdź
wp-content/debug.log – błąd PHP powie Ci, w którym pliku i linii szukać problemu.
- Zdjęcia nie wyświetlają się po migracji → sprawdź uprawnienia folderu
wp-content/uploads/ (powinny być 755) i ścieżkę w ustawieniach WordPress (Ustawienia → Media).
- Chcę zmienić wygląd, nie mam dostępu do panelu → edytuj pliki CSS w
wp-content/themes/twoj-motyw-child/style.css.
12. Podsumowanie
Struktura plików WordPress jest przemyślana i konsekwentna. Gdy ją rozumiesz, praca z WordPressem staje się znacznie bardziej intuicyjna.
Trzy rzeczy do zapamiętania:
- Twoja praca należy do
wp-content/ – tam motywy, wtyczki, media. Tylko tam.
- Nie ruszaj
wp-admin/ i wp-includes/ – aktualizacje WP je nadpiszą.
wp-config.php to centrum dowodzenia – przechowuj go bezpiecznie i zawsze miej jego kopię zapasową.
Mając tę wiedzę, możesz przejść do kolejnych kroków: nauczyć się tworzyć własny motyw dziecka, pisać pierwszą wtyczkę albo bezpiecznie customizować sklep WooCommerce.
Często zadawane pytania (FAQ)
Czy mogę zmienić lokalizację folderu wp-content?
Tak, WordPress pozwala zdefiniować w wp-config.php stałe WP_CONTENT_DIR i WP_CONTENT_URL, wskazując na inną lokalizację. Jest to rzadko potrzebne, ale przydaje się w zaawansowanych konfiguracjach serwerowych.
Co zrobić gdy nie mam dostępu do panelu WP?
Połącz się przez FTP lub SSH. Możesz wyłączyć wtyczki zmieniając nazwy ich folderów w wp-content/plugins/. Możesz też tymczasowo zmienić aktywny motyw, edytując bezpośrednio bazę danych (tabela wp_options, klucz template i stylesheet).
Czy WordPress działa tak samo na Nginx jak na Apache?
Rdzeń WordPressa – tak. Różnica dotyczy konfiguracji serwera: na Apache używasz .htaccess, na Nginx analogiczne reguły umieszczasz bezpośrednio w konfiguracji serwera (nginx.conf lub dedykowanym pliku hosta wirtualnego).
Jak sprawdzić, która wersja WordPress jest zainstalowana?
Numer wersji znajdziesz w pliku wp-includes/version.php jako zmienna $wp_version. Możesz też sprawdzić go przez WP-CLI komendą wp core version.