Struktura plików i folderów WordPress – co gdzie się znajduje

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:

  1. Twoja praca należy do wp-content/ – tam motywy, wtyczki, media. Tylko tam.
  2. Nie ruszaj wp-admin/ i wp-includes/ – aktualizacje WP je nadpiszą.
  3. 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.

KROK 1 Z 4

Z CZYM POTRZEBUJESZ POMOCY?