Die “berühmte 5-Minuten-Installation” ist ein Werbeslogan, kein professioneller Standard. Eine WordPress-Standardinstallation ist “gesprächig”, nicht optimiert und oft unsicher.
Als Entwickler “installieren” wir WordPress nicht einfach. Wir bereiten es für den Betrieb in einer bestimmten Umgebung vor. Dieser Leitfaden behandelt die wichtigsten Konfigurationskonstanten und Hardening-Techniken, die 2026 zur Grundausstattung jedes Kundenprojekts gehören sollten.
wp-config.php nach der WordPress-Installation konfigurieren
Das ist das Gehirn Ihrer Installation. Lassen Sie es nicht länger auf den Standardeinstellungen.
WP_ENVIRONMENT_TYPE in wp-config.php setzen
Seit WordPress 5.5 ist WP_ENVIRONMENT_TYPE Standard. Nutzen Sie die Konstante, damit Entwicklungsfehler nicht in die Produktion durchsickern.
// In wp-config.php
define( 'WP_ENVIRONMENT_TYPE', 'production' ); // 'local', 'development', 'staging', 'production'Dann in Ihrem Code:
if ( wp_get_environment_type() === 'production' ) {
// Cache aktivieren, Fehler deaktivieren
}Dateieditor deaktivieren und SSL in wp-config.php erzwingen
Verhindern Sie, dass Kunden (oder Angreifer) die Website über das Admin-Panel beschädigen.
// Dateieditor deaktivieren (Theme-/Plugin-Editor)
define( 'DISALLOW_FILE_EDIT', true );
// Installation/Aktualisierung von Plugins sperren (gut für unveränderliche Deployments)
define( 'DISALLOW_FILE_MODS', true );
// SSL im Admin erzwingen
define( 'FORCE_SSL_ADMIN', true );Beitragsrevisionen in WordPress begrenzen
Der Datenbank-Killer. Brauchen Sie wirklich 100 Versionen der Seite “Über uns”?
define( 'WP_POST_REVISIONS', 10 ); // Die letzten 10 behalten
// ODER
define( 'WP_POST_REVISIONS', false ); // Vollständig deaktivieren (nicht empfohlen)WP_DEBUG_LOG aktivieren, ohne Fehler anzuzeigen
Zeigen Sie Fehler nie im Frontend an. Protokollieren Sie sie.
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', '/tmp/wp-errors.log' ); // Log außerhalb des öffentlichen Verzeichnisses ablegen!
define( 'WP_DEBUG_DISPLAY', false );
// SQL-Abfragen zum Performance-Debugging protokollieren (in Produktion deaktivieren!)
define( 'SAVEQUERIES', false );Emoji und XML-RPC in WordPress deaktivieren
WordPress bringt Funktionen mit, die 90% der Unternehmenswebsites nicht brauchen: Emoji, oEmbeds und XML-RPC.
Installieren Sie kein Plugin, um sie abzuschalten. Legen Sie ein Must-Use-Plugin an (wp-content/mu-plugins/lean-core.php).
<?php
/* Plugin Name: Lean Core */
// 1. Emoji deaktivieren (spart einen HTTP-Request)
remove_action( 'wp_head', 'print_emoji_detection_script', 7 );
remove_action( 'wp_print_styles', 'print_emoji_styles' );
// 2. XML-RPC deaktivieren (Sicherheit)
add_filter( 'xmlrpc_enabled', '__return_false' );
// 3. WP-Version entfernen (Security by Obscurity)
remove_action( 'wp_head', 'wp_generator' );
// 4. RSS-Feeds deaktivieren (wenn Sie eine reine Firmenwebsite bauen)
// function wppoland_disable_feed() {
// wp_die( 'Kein Feed vorhanden, besuchen Sie unsere Startseite!' );
// }
// add_action('do_feed', 'wppoland_disable_feed', 1);Salt-Schlüssel in wp-config.php ändern
Sie kennen die Authentifizierungsschlüssel in wp-config.php.
define('AUTH_KEY', 'geben Sie hier Ihre eindeutige Phrase ein');
// ...Fakt: Eine Änderung meldet sofort alle Benutzer ab. Das ist die “Notfalloption”, wenn die Website gehackt wurde. Profi-Tipp: Automatisieren Sie die Rotation mit einem CLI-Skript oder Vault, wenn Sie Enterprise-Websites betreuen.
Was Sie vor dem Livegang in wp-config.php setzen sollten
Vor dem Launch:
WP_ENVIRONMENT_TYPEauf production setzen.DISALLOW_FILE_EDITauf true setzen.WP_POST_REVISIONSbegrenzen.WP_DEBUG_LOGin einen privaten Ordner verschieben.- Emoji/XML-RPC per Code deaktivieren.
Eine gut konfigurierte WordPress-Instanz ist leise, sicher und schnell.
Welche Permalinks Sie in WordPress einstellen sollten
Die optimale Permalink-Struktur
Einstellungen > Permalinks > BeitragsnameWarum:
- Kürzere, lesbarere URLs
- Besser für SEO (Keywords in der URL)
- Leichter zu merken und zu teilen
Konfiguration in wp-config.php:
// Permalink-Struktur erzwingen (optional)
define('WP_POST_REVISIONS', 10);Struktur von Kategorien und Schlagwörtern
- Grundlegende Kategorien anlegen (3-7 Hauptkategorien)
- Hierarchie festlegen (über- und untergeordnete Kategorien)
- Standardkategorie setzen (nicht “Allgemein”)
- Schlagwort-Strategie planen (optional, 5-10 Schlagwörter pro Beitrag)
WordPress-Medieneinstellungen und Bildgrößen
Bildgrößen
Einstellungen > MedienEmpfohlene Einstellungen:
- Vorschaubild: 150x150px (“Vorschaubild auf exakte Größe zuschneiden” aktivieren)
- Mittelgroß: 300x300px
- Groß: 1024x1024px
- Volle Größe: immer verfügbar
Automatische Bildoptimierung
// Im MU-Plugin: wp-content/mu-plugins/image-optimization.php
<?php
/* Plugin Name: Image Optimization */
// Zusätzliche Größen, die Sie nicht nutzen, nicht erzeugen
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');
// Lazy Loading für Bilder aktivieren
add_filter('wp_lazy_loading_enabled', '__return_true');
// Bilder beim Upload optimieren
add_filter('wp_image_editors', function($editors) {
return ['WP_Image_Editor_Imagick', 'WP_Image_Editor_GD'];
});WebP-Uploads in WordPress aktivieren
// WebP aktivieren (erfordert Serverunterstützung)
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;
});WordPress nach der Installation absichern
Standard-Tabellenpräfix ändern
Bei der Installation: Geben Sie statt wp_ ein eigenes Präfix ein (zum Beispiel x7k9_, mysite_, proj23_)
Nach der Installation (fortgeschritten):
-- Präfix in phpMyAdmin ändern (vorher ein Backup erstellen!)
RENAME TABLE wp_posts TO x7k9_posts;
RENAME TABLE wp_options TO x7k9_options;
-- ... für alle Tabellen wiederholen
-- wp-config.php aktualisieren
define('DB_PREFIX', 'x7k9_');Die Datei wp-config.php schützen
# In .htaccess (WordPress-Hauptverzeichnis)
<files wp-config.php>
order allow,deny
deny from all
</files>
# Zusätzlicher Schutz
<files ~ "^.*\.([Hh][Tt][Aa])">
order allow,deny
deny from all
</files>Zugriff auf Verzeichnisse sperren
# In wp-content/uploads/.htaccess
Options -Indexes
# In 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>Anmeldeversuche begrenzen
// Im MU-Plugin: wp-content/mu-plugins/login-security.php
<?php
/* Plugin Name: Login Security */
// Anmeldeversuche begrenzen (ohne Plugin)
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('Zu viele Anmeldeversuche. Bitte versuchen Sie es in einer Stunde erneut.');
}
}
});
// WordPress-Version verbergen
remove_action('wp_head', 'wp_generator');
add_filter('the_generator', '__return_empty_string');Zwei-Faktor-Authentifizierung (2FA)
// Starke Passwörter erzwingen
add_action('user_profile_update_errors', function($errors) {
$password = $_POST['pass1'];
if (!empty($password) && strlen($password) < 12) {
$errors->add('password_error', 'Das Passwort muss mindestens 12 Zeichen lang sein.');
}
});WordPress nach der Installation beschleunigen
Grundlegende Datenbankoptimierung
// In wp-config.php
// Beitragsrevisionen begrenzen
define('WP_POST_REVISIONS', 10);
// Papierkorb automatisch nach 7 Tagen leeren
define('EMPTY_TRASH_DAYS', 7);
// Dateieditor deaktivieren (Sicherheit + Performance)
define('DISALLOW_FILE_EDIT', true);Datenbank bereinigen
// Im MU-Plugin: wp-content/mu-plugins/db-cleanup.php
<?php
/* Plugin Name: DB Cleanup */
// Alte Revisionen löschen (die letzten 10 behalten)
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}");
});Heartbeat API optimieren
// Heartbeat-Frequenz verringern
add_filter('heartbeat_settings', function($settings) {
$settings['interval'] = 60; // Sekunden (Standard 15)
return $settings;
});
// Heartbeat im Frontend deaktivieren
add_action('init', function() {
if (!is_admin()) {
wp_deregister_script('heartbeat');
}
}, 1);RSD-, Shortlink- und REST-API-Links aus wp_head entfernen
// Im MU-Plugin: wp-content/mu-plugins/disable-bloat.php
<?php
/* Plugin Name: Disable Bloat */
// Emoji deaktivieren
remove_action('wp_head', 'print_emoji_detection_script', 7);
remove_action('wp_print_styles', 'print_emoji_styles');
// XML-RPC deaktivieren
add_filter('xmlrpc_enabled', '__return_false');
// RSD-Link deaktivieren
remove_action('wp_head', 'rsd_link');
// Windows-Live-Writer-Link deaktivieren
remove_action('wp_head', 'wlwmanifest_link');
// Shortlink deaktivieren
remove_action('wp_head', 'wp_shortlink_wp_head');
// REST-API-Link deaktivieren (falls nicht genutzt)
remove_action('wp_head', 'rest_output_link_wp_head');Grundlegende SEO-Einstellungen in WordPress
Seitentitel, Untertitel und Sichtbarkeit für Suchmaschinen
Einstellungen > Allgemein:
- Titel der Website: [Ihre Marke] | [Kurzbeschreibung]
- Untertitel: 2-3 Sätze über die Website (Meta Description)
- Sichtbarkeit für Suchmaschinen: "Suchmaschinen davon abhalten, diese Website zu indexieren" NICHT aktivierenSEO-freundliche Permalink-Struktur
Einstellungen > Permalinks > BeitragsnameXML-Sitemap
// Die Standard-Sitemap von WordPress aktivieren
add_filter('wp_sitemaps_enabled', '__return_true');
// Eigene Inhaltstypen zur Sitemap hinzufügen
add_filter('wp_sitemaps_post_types', function($post_types) {
$post_types[] = 'portfolio';
return $post_types;
});Grundlegende Bildoptimierung für SEO
// Automatische ALT-Attribute (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);
// Bildtitel
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);Backups von WordPress erstellen
Automatische Datenbank-Backups
// Im MU-Plugin: wp-content/mu-plugins/backup-scheduler.php
<?php
/* Plugin Name: Backup Scheduler */
// Tägliches Datenbank-Backup
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';
// WP-CLI oder mysqldump verwenden
exec('mysqldump --user=' . DB_USER . ' --password=' . DB_PASSWORD . ' --host=' . DB_HOST . ' ' . DB_NAME . ' > ' . $filename);
// Alte Backups löschen (die letzten 7 behalten)
$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]);
}
}
});
// Aufgabe planen
if (!wp_next_scheduled('daily_database_backup')) {
wp_schedule_event(time(), 'daily', 'daily_database_backup');
}Externe Backups einrichten
Empfohlene Lösungen:
- UpdraftPlus: Die kostenlose Version reicht für kleine Websites
- BlogVault: kostenpflichtig, aber sehr zuverlässig
- WPvivid: eine gute kostenlose Alternative
Konfiguration:
- Tägliches Backup (Datenbank)
- Wöchentliches Backup (vollständig)
- Aufbewahrung: mindestens 30 Tage
- Externer Speicherort: Google Drive, Dropbox, S3
SMTP in WordPress konfigurieren
SMTP statt mail()
// In wp-config.php oder einem MU-Plugin
define('SMTP_USER', '[email protected]');
define('SMTP_PASS', 'your-password');
define('SMTP_HOST', 'smtp.gmail.com');
define('SMTP_PORT', '587');
define('SMTP_SECURE', 'tls');
define('SMTP_FROM', '[email protected]');
define('SMTP_NAME', 'Ihre Website');
// Im 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;
});Test-E-Mail aus WordPress senden
// Testfunktion (einmal ausführen)
add_action('admin_init', function() {
if (isset($_GET['test_email'])) {
wp_mail(get_option('admin_email'), 'Test Email', 'Dies ist eine Testnachricht von WordPress.');
wp_die('Test-E-Mail gesendet!');
}
});WordPress-Monitoring und Fehlerprotokollierung
Fehlerprotokollierung
// In wp-config.php
define('WP_DEBUG', false);
define('WP_DEBUG_LOG', '/var/log/wp-errors.log'); // Außerhalb des öffentlichen Verzeichnisses
define('WP_DEBUG_DISPLAY', false);
// SQL-Abfragen protokollieren (nur im Debug-Modus)
// define('SAVEQUERIES', true);Uptime-Monitoring
Empfohlene Werkzeuge:
- UptimeRobot (kostenloser Plan: 50 Monitore, 5-Minuten-Intervalle)
- Pingdom (kostenpflichtig, aber umfangreicher)
- Better Uptime (moderne Alternative)
Admin-Logins und Beitragsänderungen protokollieren
// Im 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);Was Sie vor dem Start einer WordPress-Website prüfen sollten
Checkliste vor dem Livegang
- Alle SEO-Einstellungen korrekt
- Sitemap erzeugt
- Google Search Console eingerichtet
- Google Analytics installiert
- Datenschutzerklärung und AGB hinzugefügt
- Kontaktformulare getestet
- E-Mail-Versand funktioniert
- SSL funktioniert (HTTPS)
- Weiterleitungen zwischen www und ohne www eingerichtet
- Backup erstellt
- Caching-Plugins konfiguriert (optional)
- CDN konfiguriert (optional)
- Performance-Tests durchgeführt (PageSpeed Insights)
- Tests der mobilen Darstellung
- Tests in verschiedenen Browsern
- 404-Seite eingerichtet
- Favicon hinzugefügt
Prüfsummen und Dateizugriff mit WP-CLI und curl testen
# WP-CLI-Tests
wp core verify-checksums
wp plugin verify-checksums --all
wp db check
# Sicherheitstests
curl -I https://ihre-website.de/wp-admin/install.php # Sollte 404 zurückgeben
curl -I https://ihre-website.de/wp-config.php # Sollte 403 zurückgebenZusammenfassung: die Checkliste mit 50 Punkten
Sicherheit (1-15)
- ✅ Tabellenpräfix der Datenbank ändern
- ✅ Starke Passwörter festlegen (mind. 12 Zeichen)
- ✅ Benutzernamen admin ändern
- ✅ Dateieditor im Backend deaktivieren
- ✅ Plugin-Installation sperren (optional)
- ✅ SSL im Admin-Bereich erzwingen
- ✅ wp-config.php per .htaccess schützen
- ✅ Zugriff auf Verzeichnisse sperren (no indexes)
- ✅ XML-RPC deaktivieren
- ✅ WordPress-Version verbergen
- ✅ Anmeldeversuche begrenzen
- ✅ Zwei-Faktor-Authentifizierung (2FA) einrichten
- ✅ Authentifizierungsschlüssel (Salts) regelmäßig rotieren
- ✅ SSL-Zertifikat installieren
- ✅ Schutz auf Serverebene einrichten (Firewall, Begrenzung der Anmeldeversuche)
Performance (16-25)
- ✅ Beitragsrevisionen begrenzen (5-10)
- ✅ Emoji deaktivieren
- ✅ Ungenutzte Funktionen deaktivieren (XML-RPC, RSD)
- ✅ Bildgrößen optimieren
- ✅ Lazy Loading aktivieren
- ✅ Cache einrichten (Object Cache, Page Cache)
- ✅ Heartbeat API optimieren
- ✅ GZIP/Brotli-Komprimierung aktivieren
- ✅ CDN einrichten (optional)
- ✅ Datenbank optimieren (automatische Bereinigung)
SEO (26-35)
- ✅ Permalink-Struktur “Beitragsname” einstellen
- ✅ Titel und Untertitel der Website festlegen
- ✅ XML-Sitemap aktivieren
- ✅ Website zur Google Search Console hinzufügen
- ✅ Google Analytics / GA4 einrichten
- ✅ Bilder optimieren (ALT-Attribute)
- ✅ Kategoriestruktur anlegen
- ✅ Breadcrumbs einrichten
- ✅ Organization-Schema hinzufügen
- ✅ Open-Graph-Meta-Tags vorbereiten
Backups (36-42)
- ✅ Automatische Datenbank-Backups einrichten
- ✅ Wöchentliche Vollbackups einrichten
- ✅ Backups an einem externen Ort speichern
- ✅ Wiederherstellung aus dem Backup testen
- ✅ Aufbewahrungsdauer festlegen (mind. 30 Tage)
- ✅ Wiederherstellungsablauf dokumentieren
- ✅ Integrität der Backups regelmäßig prüfen
Inhalte und Funktionen (43-50)
- ✅ Grundlegende Seiten anlegen (Über uns, Kontakt, Datenschutzerklärung)
- ✅ Navigationsmenüs einrichten
- ✅ Alle Formulare testen
- ✅ SMTP für den E-Mail-Versand einrichten
- ✅ Eigene 404-Seite erstellen
- ✅ Favicon und PWA-Icons hinzufügen
- ✅ Performance-Tests durchführen
- ✅ Konfiguration dokumentieren
Werfen Sie einen Blick auf unser WordPress-Sicherheitsaudit, wenn Sie Risiken und Schutzmaßnahmen Ihrer Website ordnen möchten.
Unterschiede in wp-config.php zwischen Staging und Produktion
Dieser Leitfaden setzt WP_DEBUG zweimal mit unterschiedlichen Werten: im Abschnitt zum Debugging auf true, im Abschnitt zum Monitoring auf false. Beide Varianten sind richtig, jede für eine andere Umgebung. Deshalb sollte dieselbe Kopie von wp-config.php nicht unverändert auf Staging und Produktion landen. Bevor Sie die Datei zwischen Servern verschieben, gehen Sie diese Konstanten durch:
WP_ENVIRONMENT_TYPE:stagingauf der Testkopie,productionauf der Live-Website. Von diesem Wert hängt jede Bedingung ab, die aufwp_get_environment_type()aufbaut.WP_DEBUG: auf Staging aktiviert, in Produktion deaktiviert.WP_DEBUG_DISPLAYbleibt an beiden Ortenfalse, und das Log liegt außerhalb des öffentlichen Verzeichnisses.SAVEQUERIES: nur während der Suche nach langsamen Abfragen, nie in Produktion.DISALLOW_FILE_MODS: sperrt in Produktion die Installation und Aktualisierung von Plugins im Backend, Updates laufen also über das Deployment oder WP-CLI. Klären Sie das mit dem Kunden, bevor er den fehlenden Aktualisierungsbutton bemerkt.- Authentifizierungsschlüssel: für jede Installation zufällig erzeugt. Eine Kopie der Produktion auf Staging bekommt einen eigenen Satz, und die produktiven Schlüssel rühren Sie nicht an, weil ihre Änderung alle Benutzer abmeldet.
Führen Sie nach dem Verschieben der Datei wp core verify-checksums und wp plugin verify-checksums --all aus dem Abschnitt zu den Tests vor dem Livegang aus.







