“Słynna 5-minutowa instalacja” to slogan marketingowy, a nie standard profesjonalny. Domyślna instalacja WordPressa jest “gadatliwa”, nieoptymalna i często niebezpieczna.
Jako programiści, nie tylko “instalujemy” WordPressa; my go prowizjonujemy. Ten przewodnik obejmuje kluczowe stałe konfiguracyjne i techniki utwardzania (hardening), które powinny znaleźć się w twoim szablonie (boilerplate) każdego projektu klienckiego w 2026 roku.
1. Potęga wp-config.php
To mózg twojej instalacji. Przestań zostawiać go na ustawieniach domyślnych.
Kontrola Środowiska (environment control)
Od WordPressa 5.5, WP_ENVIRONMENT_TYPE jest standardem. Używaj go, aby zapobiec wyciekaniu błędów developerskich na produkcję.
// W wp-config.php
define( 'WP_ENVIRONMENT_TYPE', 'production' ); // 'local', 'development', 'staging', 'production'
Następnie w swoim kodzie:
if ( wp_get_environment_type() === 'production' ) {
// Włącz Cache, Wyłącz Błędy
}
Utwardzanie bezpieczeństwa (hardening)
Uchroń klientów (lub hakerów) przed zepsuciem strony poprzez panel administracyjny.
// Wyłącz Edytor Plików (Edytor Motywu/Wtyczek)
define( 'DISALLOW_FILE_EDIT', true );
// Zablokuj Instalację/Aktualizację Wtyczek (Dobre dla deploymentów immutable)
define( 'DISALLOW_FILE_MODS', true );
// Wymuś SSL w Adminie
define( 'FORCE_SSL_ADMIN', true );
Rewizje postów
Zabójca bazy danych. Czy naprawdę potrzebujesz 100 wersji strony “O Nas”?
define( 'WP_POST_REVISIONS', 10 ); // Zachowaj ostatnie 10
// LUB
define( 'WP_POST_REVISIONS', false ); // Wyłącz całkowicie (Niezalecane)
2. Profesjonalne debugowanie
Nigdy nie wyświetlaj błędów na frontendzie. Loguj je.
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', '/tmp/wp-errors.log' ); // Przenieś log poza katalog publiczny!
define( 'WP_DEBUG_DISPLAY', false );
// Loguj zapytania SQL do debugowania wydajności (Wyłącz na produkcji!)
define( 'SAVEQUERIES', false );
3. Sprzątanie rdzenia (“core bloat”)
WordPress przychodzi z funkcjami, których 90% stron biznesowych nie potrzebuje: Emoji, oEmbedy i XML-RPC.
Nie instaluj wtyczki, by je wyłączyć. Stwórz Must-Use Plugin (wp-content/mu-plugins/lean-core.php).
<?php
/* Plugin Name: Lean Core */
// 1. Wyłącz Emoji (Oszczędza żądanie HTTP)
remove_action( 'wp_head', 'print_emoji_detection_script', 7 );
remove_action( 'wp_print_styles', 'print_emoji_styles' );
// 2. Wyłącz XML-RPC (Bezpieczeństwo)
add_filter( 'xmlrpc_enabled', '__return_false' );
// 3. Usuń Wersję WP (Security by Obscurity)
remove_action( 'wp_head', 'wp_generator' );
// 4. Wyłącz Kanały RSS (Jeśli budujesz stronę wizytówkę)
// function wppoland_disable_feed() {
// wp_die( 'Brak kanału, odwiedź naszą stronę główną!' );
// }
// add_action('do_feed', 'wppoland_disable_feed', 1);
4. Mit “soli” (salts)
Znasz klucze uwierzytelniania w wp-config.php.
define('AUTH_KEY', 'wpisz tutaj swoja unikalna fraze');
// ...
Fakt: Ich zmiana natychmiast wylogowuje wszystkich użytkowników. To “Opcja Nuklearna”, jeśli strona zostanie zhakowana. Pro Tip: Zautomatyzuj ich rotację używając skryptu CLI lub Vaulta, jeśli zarządzasz stronami enterprise.
5. Lista kontrolna (podsumowanie)
Zanim wystartujesz (Launch):
- Ustaw
WP_ENVIRONMENT_TYPEna production. - Ustaw
DISALLOW_FILE_EDITna true. - Ogranicz
WP_POST_REVISIONS. - Przenieś
WP_DEBUG_LOGdo prywatnego folderu. - Wyłącz Emoji/XML-RPC kodem.
Dobrze skonfigurowana instancja WordPressa jest cicha, bezpieczna i szybka.
6. Konfiguracja permalinków i struktury URL
Optymalna struktura permalinków
Ustawienia → Bezpośrednie odnośniki → Nazwa wpisu
Dlaczego:
- Krótsze, czytelniejsze URL-e
- Lepsze dla SEO (słowa kluczowe w URL)
- Łatwiejsze do zapamiętania i udostępniania
Konfiguracja w wp-config.php:
// Wymuś strukturę permalinków (opcjonalnie)
define('WP_POST_REVISIONS', 10);
Struktura kategorii i tagów
- Utwórz podstawowe kategorie (3-7 głównych)
- Zdefiniuj hierarchię (kategorie nadrzędne i podrzędne)
- Ustaw domyślną kategorię (nie “Bez kategorii”)
- Zaplanuj strategię tagów (opcjonalnie, 5-10 tagów na wpis)
7. Ustawienia mediów i optymalizacja obrazów
Rozmiary obrazów
Ustawienia → Media
Zalecane ustawienia:
- Miniatura: 150x150px (zaznacz “Przytnij miniaturę”)
- Średni: 300x300px
- Duży: 1024x1024px
- Pełny rozmiar: Zawsze dostępny
Automatyczna optymalizacja obrazów
// W mu-plugin: wp-content/mu-plugins/image-optimization.php
<?php
/* Plugin Name: Image Optimization */
// Wyłącz generowanie dodatkowych rozmiarów, których nie używasz
function remove_unused_image_sizes() {
remove_image_size('1536x1536'); // WordPress 5.3+
remove_image_size('2048x2048'); // WordPress 5.3+
}
add_action('init', 'remove_unused_image_sizes');
// Włącz lazy loading dla obrazów
add_filter('wp_lazy_loading_enabled', '__return_true');
// Optymalizuj obrazy przy uploadzie
add_filter('wp_image_editors', function($editors) {
return ['WP_Image_Editor_Imagick', 'WP_Image_Editor_GD'];
});
Formaty obrazów nowej generacji
// Włącz WebP (wymaga wsparcia serwera)
add_filter('wp_upload_image_mime_transforms', function($transforms) {
$transforms['image/jpeg'] = ['image/webp', 'image/jpeg'];
$transforms['image/png'] = ['image/webp', 'image/png'];
return $transforms;
});
8. Hardening bezpieczeństwa - kompletny przewodnik
Zmiana domyślnego prefiksu tabel
Podczas instalacji:
Wpisz niestandardówy prefiks zamiast wp_ (np. x7k9_, mysite_, proj23_)
Po instalacji (zaawansowane):
-- Zmień prefiks w phpMyAdmin (zrób kopię zapasową!)
RENAME TABLE wp_posts TO x7k9_posts;
RENAME TABLE wp_options TO x7k9_options;
-- ... powtórz dla wszystkich tabel
-- Zaktualizuj wp-config.php
define('DB_PREFIX', 'x7k9_');
Ochrona pliku wp-config.php
# W .htaccess (głównym katalogu WordPress)
<files wp-config.php>
order allow,deny
deny from all
</files>
# Dodatkowa ochrona
<files ~ "^.*\.([Hh][Tt][Aa])">
order allow,deny
deny from all
</files>
Blokowanie dostępu do katalogów
# W wp-content/uploads/.htaccess
Options -Indexes
# W wp-includes/.htaccess
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^wp-admin/includes/ - [F,L]
RewriteRule !^wp-includes/ - [S=3]
RewriteRule ^wp-includes/[^/]+\.php$ - [F,L]
RewriteRule ^wp-includes/js/tinymce/langs/.+\.php - [F,L]
RewriteRule ^wp-includes/theme-compat/ - [F,L]
</IfModule>
Ograniczenie prób logowania
// W mu-plugin: wp-content/mu-plugins/login-security.php
<?php
/* Plugin Name: Login Security */
// Ogranicz próby logowania (bez wtyczki)
add_action('wp_login_failed', function($username) {
$ip = $_SERVER['REMOTE_ADDR'];
$attempts = get_transient('login_attempts_' . $ip);
if ($attempts === false) {
set_transient('login_attempts_' . $ip, 1, HOUR_IN_SECONDS);
} else {
set_transient('login_attempts_' . $ip, $attempts + 1, HOUR_IN_SECONDS);
if ($attempts >= 5) {
wp_die('Zbyt wiele prób logowania. Spróbuj ponownie za godzinę.');
}
}
});
// Ukryj wersję WordPressa
remove_action('wp_head', 'wp_generator');
add_filter('the_generator', '__return_empty_string');
Dwuskładnikowe uwierzytelnianie (2FA)
// Wymuś silne hasła
add_action('user_profile_update_errors', function($errors) {
$password = $_POST['pass1'];
if (!empty($password) && strlen($password) < 12) {
$errors->add('password_error', 'Hasło musi mieć co najmniej 12 znaków.');
}
});
9. Optymalizacja wydajności
Podstawowa optymalizacja bazy danych
// W wp-config.php
// Ogranicz rewizje postów
define('WP_POST_REVISIONS', 10);
// Automatyczne opróżnianie kosza po 7 dniach
define('EMPTY_TRASH_DAYS', 7);
// Wyłącz edytor plików (bezpieczeństwo + wydajność)
define('DISALLOW_FILE_EDIT', true);
Czyszczenie bazy danych
// W mu-plugin: wp-content/mu-plugins/db-cleanup.php
<?php
/* Plugin Name: DB Cleanup */
// Usuń stare rewizje (zachowaj ostatnie 10)
add_action('wp_scheduled_auto_draft_delete', function() {
global $wpdb;
$wpdb->query("DELETE FROM {$wpdb->posts} WHERE post_type = 'revision' AND post_date < DATE_SUB(NOW(), INTERVAL 30 DAY)");
$wpdb->query("DELETE FROM {$wpdb->options} WHERE option_name LIKE '_transient_%' AND option_value < UNIX_TIMESTAMP()");
$wpdb->query("OPTIMIZE TABLE {$wpdb->posts}, {$wpdb->options}, {$wpdb->postmeta}");
});
Optymalizacja Heartbeat API
// Zmniejsz częstotliwość Heartbeat
add_filter('heartbeat_settings', function($settings) {
$settings['interval'] = 60; // sekundy (domyślnie 15)
return $settings;
});
// Wyłącz Heartbeat na frontendzie
add_action('init', function() {
if (!is_admin()) {
wp_deregister_script('heartbeat');
}
}, 1);
Wyłączenie niepotrzebnych funkcji
// W mu-plugin: wp-content/mu-plugins/disable-bloat.php
<?php
/* Plugin Name: Disable Bloat */
// Wyłącz emoji
remove_action('wp_head', 'print_emoji_detection_script', 7);
remove_action('wp_print_styles', 'print_emoji_styles');
// Wyłącz XML-RPC
add_filter('xmlrpc_enabled', '__return_false');
// Wyłącz RSD link
remove_action('wp_head', 'rsd_link');
// Wyłącz Windows Live Writer link
remove_action('wp_head', 'wlwmanifest_link');
// Wyłącz shortlink
remove_action('wp_head', 'wp_shortlink_wp_head');
// Wyłącz REST API link (jeśli nie używasz)
remove_action('wp_head', 'rest_output_link_wp_head');
10. Podstawy SEO
Konfiguracja podstawowa
Ustawienia → Ogólne:
- Tytuł witryny: [Twoja marka] - [Krótki opis]
- Opis: 2-3 zdania o witrynie (meta description)
- Widoczność dla wyszukiwarek: ODZNACZ "Proś wyszukiwarki o nieindeksowanie"
Struktura permalinków SEO-friendly
Ustawienia → Bezpośrednie odnośniki → Nazwa wpisu
Mapa witryny (XML Sitemap)
// Włącz domyślną mapę witryny WordPressa
add_filter('wp_sitemaps_enabled', '__return_true');
// Dodaj niestandardowe typy treści do mapy
add_filter('wp_sitemaps_post_types', function($post_types) {
$post_types[] = 'portfolio';
return $post_types;
});
Podstawowa optymalizacja obrazów dla SEO
// Automatyczne ALT tagi (fallback)
add_filter('wp_get_attachment_image_attributes', function($attributes, $attachment) {
if (empty($attributes['alt'])) {
$attributes['alt'] = get_the_title($attachment->ID);
}
return $attributes;
}, 10, 2);
// Tytuły obrazów
add_filter('wp_insert_attachment_data', function($data, $postarr) {
if (empty($data['post_title'])) {
$filename = basename($data['guid']);
$data['post_title'] = sanitize_title($filename);
}
return $data;
}, 10, 2);
11. Strategia kopii zapasowych
Automatyczne kopie zapasowe bazy danych
// W mu-plugin: wp-content/mu-plugins/backup-scheduler.php
<?php
/* Plugin Name: Backup Scheduler */
// Codzienna kopia bazy danych
add_action('daily_database_backup', function() {
$upload_dir = wp_upload_dir();
$backup_dir = $upload_dir['basedir'] . '/backups';
if (!file_exists($backup_dir)) {
wp_mkdir_p($backup_dir);
}
$filename = $backup_dir . '/db-backup-' . date('Y-m-d-H-i-s') . '.sql';
// Użyj WP-CLI lub mysqldump
exec('mysqldump --user=' . DB_USER . ' --password=' . DB_PASSWORD . ' --host=' . DB_HOST . ' ' . DB_NAME . ' > ' . $filename);
// Usuń stare kopie (zachowaj ostatnie 7)
$files = glob($backup_dir . '/db-backup-*.sql');
if (count($files) > 7) {
array_multisort(array_map('filemtime', $files), SORT_ASC, $files);
for ($i = 0; $i < count($files) - 7; $i++) {
unlink($files[$i]);
}
}
});
// Zaplanuj zadanie
if (!wp_next_scheduled('daily_database_backup')) {
wp_schedule_event(time(), 'daily', 'daily_database_backup');
}
Konfiguracja zewnętrznych kopii
Zalecane rozwiązania:
- UpdraftPlus - darmowa wersja wystarczająca dla małych stron
- BlogVault - płatne, ale bardzo niezawodne
- WPvivid - dobra alternatywa darmowa
Konfiguracja:
- Kopia codzieńna (baza danych)
- Kopia tygodniowa (pełna)
- Przechowywanie: minimum 30 dni
- Lokalizacja zewnętrzna: Google Drive, Dropbox, S3
12. Konfiguracja poczty e-mail
SMTP zamiast mail()
// W wp-config.php lub mu-plugin
define('SMTP_USER', 'your-email@example.com');
define('SMTP_PASS', 'your-password');
define('SMTP_HOST', 'smtp.gmail.com');
define('SMTP_PORT', '587');
define('SMTP_SECURE', 'tls');
define('SMTP_FROM', 'your-email@example.com');
define('SMTP_NAME', 'Twoja Strona');
// W mu-plugin
add_action('phpmailer_init', function($phpmailer) {
$phpmailer->isSMTP();
$phpmailer->Host = SMTP_HOST;
$phpmailer->SMTPAuth = true;
$phpmailer->Username = SMTP_USER;
$phpmailer->Password = SMTP_PASS;
$phpmailer->SMTPSecure = SMTP_SECURE;
$phpmailer->Port = SMTP_PORT;
$phpmailer->From = SMTP_FROM;
$phpmailer->FromName = SMTP_NAME;
});
Testowanie poczty
// Funkcja testowa (uruchom raz)
add_action('admin_init', function() {
if (isset($_GET['test_email'])) {
wp_mail(get_option('admin_email'), 'Test Email', 'To jest testowa wiadomość z WordPressa.');
wp_die('E-mail testowy wysłany!');
}
});
13. Monitoring i logowanie
Logowanie błędów
// W wp-config.php
define('WP_DEBUG', false);
define('WP_DEBUG_LOG', '/var/log/wp-errors.log'); // Poza katalogiem publicznym
define('WP_DEBUG_DISPLAY', false);
// Logowanie zapytań SQL (tylko w trybie debugowania)
// define('SAVEQUERIES', true);
Monitoring uptime
Zalecane narzędzia:
- UptimeRobot (darmowy plan: 50 monitorów, 5-minutowe interwały)
- Pingdom (płatne, ale bardziej zaawansowane)
- Better Uptime (nowoczesna alternatywa)
Logowanie aktywności administracyjnej
// W mu-plugin: wp-content/mu-plugins/activity-log.php
<?php
/* Plugin Name: Activity Log */
add_action('wp_login', function($user_login, $user) {
error_log('User logged in: ' . $user_login . ' from IP: ' . $_SERVER['REMOTE_ADDR']);
}, 10, 2);
add_action('save_post', function($post_id, $post, $update) {
if ($update && $post->post_status === 'publish') {
error_log('Post updated: ' . $post->post_title . ' by user: ' . get_current_user_id());
}
}, 10, 3);
14. Przygotowanie do uruchomienia (Go-Live Checklist)
Ostateczna weryfikacja
- Wszystkie ustawienia SEO poprawne
- Mapa witryny wygenerowana
- Google Search Console skonfigurowane
- Google Analytics zainstalowane
- Polityka prywatności i regulamin dodane
- Formularze kontaktowe przetestowane
- Poczta e-mail działa
- SSL działa (HTTPS)
- Przekierowania www ↔ non-www skonfigurowane
- Kopia zapasowa wykonana
- Wtyczki cache’ujące skonfigurowane (opcjonalnie)
- CDN skonfigurowane (opcjonalnie)
- Testy wydajności przeprowadzone (PageSpeed Insights)
- Testy responsywności mobilnej
- Testy w różnych przeglądarkach
- 404 strona skonfigurowana
- Favicon dodany
Testy przed uruchomieniem
# Testy WP-CLI
wp core verify-checksums
wp plugin verify-checksums --all
wp db check
# Testy bezpieczeństwa
curl -I https://twoja-strona.pl/wp-admin/install.php # Powinno zwrócić 404
curl -I https://twoja-strona.pl/wp-config.php # Powinno zwrócić 403
Podsumowanie: 50-punktowa lista kontrolna
Bezpieczeństwo (1-15)
- ✅ Zmień prefiks tabel bazy danych
- ✅ Ustaw silne hasła (min. 12 znaków)
- ✅ Zmień nazwę użytkownika admin
- ✅ Wyłącz edytor plików w panelu
- ✅ Zablokuj instalację wtyczek (opcjonalnie)
- ✅ Wymuś SSL w panelu administracyjnym
- ✅ Zabezpiecz wp-config.php przez .htaccess
- ✅ Zablokuj dostęp do katalogów (no indexes)
- ✅ Wyłącz XML-RPC
- ✅ Ukryj wersję WordPressa
- ✅ Ogranicz próby logowania
- ✅ Skonfiguruj dwuskładnikowe uwierzytelnianie (2FA)
- ✅ Regularnie rotuj klucze uwierzytelniania (salts)
- ✅ Zainstaluj certyfikat SSL
- ✅ Skonfiguruj zabezpieczenia na poziomie serwera (firewall, ograniczenie prób logowania)
Wydajność (16-25)
- ✅ Ogranicz rewizje postów (5-10)
- ✅ Wyłącz emoji
- ✅ Wyłącz nieużywane funkcje (XML-RPC, RSD)
- ✅ Zoptymalizuj rozmiary obrazów
- ✅ Włącz lazy loading
- ✅ Skonfiguruj cache (obiektowy, page cache)
- ✅ Zoptymalizuj Heartbeat API
- ✅ Włącz kompresję GZIP/Brotli
- ✅ Skonfiguruj CDN (opcjonalnie)
- ✅ Zoptymalizuj bazę danych (automatyczne czyszczenie)
SEO (26-35)
- ✅ Ustaw strukturę permalinków “Nazwa wpisu”
- ✅ Skonfiguruj tytuł i opis witryny
- ✅ Włącz mapę witryny XML
- ✅ Dodaj stronę do Google Search Console
- ✅ Skonfiguruj Google Analytics / GA4
- ✅ Zoptymalizuj obrazy (ALT tagi)
- ✅ Utwórz strukturę kategorii
- ✅ Skonfiguruj breadcrumbs
- ✅ Dodaj schemat Organization
- ✅ Przygotuj meta tagi Open Graph
Kopie zapasowe (36-42)
- ✅ Skonfiguruj automatyczne kopie bazy danych
- ✅ Skonfiguruj pełne kopie tygodniowe
- ✅ Przechowuj kopie w zewnętrznej lokalizacji
- ✅ Przetestuj przywracanie z kopii
- ✅ Ustaw retencję kopii (min. 30 dni)
- ✅ Dokumentuj procedurę przywracania
- ✅ Regularnie weryfikuj integralność kopii
Treść i funkcjonalność (43-50)
- ✅ Utwórz strony podstawowe (O nas, Kontakt, Polityka prywatności)
- ✅ Skonfiguruj menu nawigacyjne
- ✅ Przetestuj wszystkie formularze
- ✅ Skonfiguruj SMTP dla poczty
- ✅ Utwórz niestandardową stronę 404
- ✅ Dodaj favicon i ikony PWA
- ✅ Przeprowadź testy wydajności
- ✅ Dokumentuj konfigurację
Explore os nossos serviços de segurança WordPress para levar o seu projeto mais longe.



