WordPress: Angaben in der wp-config.php

Die wp-config.php ist eine der wichtigsten Dateien in WordPress. Hier kann man Einstellungen und Richtlinien für das ganze System definieren.
Viele Seitenbetreiber wissen aber gar nicht, welche Einstellungsmöglichkeiten hier möglich sind und wieviel Potential sie dadurch verschenken. Deshalb habe ich diesen Artikel geschrieben.

[adsensecode300x250]Zwar liegt dem WordPress Archiv auch immer eine wp-config-sample.php Beispieldatei bei (die man nur anpassen muss), aber dort sind nur die Standardeinstellungen aufgeführt.

Bei einigen Einstellungen muss ich vorwarnen. Alle Änderungen an der wp-config.php erfolgen auf eigene Verantwortung. Bei einigen WordPress Plugins und Themes kann es zu Inkompatibilitäten kommen.

Die wp-config.php Standardeinstellungen

Ohne Verbindung zur Datenbank läuft bei WordPress nichts. Aus diesem Grund steht dieser Anweisungsblock ziemlich weit vorn der WP Config.

Database Name
Hier trägt man den Namen der Datenbank ein

Database Username
Hier trägt man den Datenbank Benutzernamen ein

Database Password
Hier trägt man das Passwort des Benutzers der Datenbank ein

Database Host
Adresse des Datenbankserver.

Bis auf Database Host dürften alle Angaben klar sein. Beim Host kann das aber sehr unterschiedlich aussehen. Meistens ist hier localhost die richtige Wahl. Das ist von eurem Provider abhängig. Wird beispielsweise ein anderer als der 3306 Standardport verwendet, wird dies so eingetragen:

define('DB_HOST', 'localhost:0815');

oder auch so:

define('DB_HOST', 'meindatenbankserver.com:0815');

Arbeitet der Datenbankserver mit Unix Sockets oder Pipes, erfolgt die Notation folgendermaßen:

define('DB_HOST', 'localhost:/var/run/mysqld/mysqld.sock');

Database character set

define('DB_CHARSET', 'utf8');

Mit utf8 seid ihr hier meistens immer auf der richtigen Seite. Da ich selbst Mühe habe, durch diese ganze Zeichensatzgeschichte durchzusehen, lasse ich auch die nächste Angabe in der Standardeinstellung.

Database collation

define('DB_COLLATE', '');

Sicherheit

Ich war erstaunt, wieviele Einstellungen sich dem Thema Sicherheit zuordnen lassen. Das betrifft nämlich nicht nur die Security Keys.

Security Keys

Dieser Bereich wurde seit den 2.x Versionen stetig ausgebaut. Die Keys dienen dazu, die Sicherheit der Daten im Nutzer Cookie zu erhöhen. Es empfiehlt sich, den Onlinegenerator zu benutzen und die Werte einfach zu übernehmen. Es sind aber keine zwingend notwendigen Einträge. Man könnte sie auch weglassen.

define('AUTH_KEY',         't`DK%X:>xy|e-Z(BXb/f(Ur`8#~UzUQG-^_Cs_GHs5U-&Wb?pgn^p8(2@}IcnCa|');
define('SECURE_AUTH_KEY',  'D&ovlU#|CvJ##uNq}bel+^MFtT&.b9{UvR]g%ixsXhGlRJ7q!h}XWdEC[BOKXssj');
define('LOGGED_IN_KEY',    'MGKi8Br(&{H*~&0s;{k0<S(O:+f#WM+q|npJ-+P;RDKT:~jrmgj#/-,[hOBk!ry^');
define('NONCE_KEY',        'FIsAsXJKL5ZlQo)iD-pt??eUbdc{_Cn<4!d~yqz))&B D?AwK%)+)F2aNwI|siOe');
define('AUTH_SALT',        '7T-!^i!0,w)L#JK@pc2{8XE[DenYI^BVf{L:jvF,hf}zBf883td6D;Vcy8,S)-&G');
define('SECURE_AUTH_SALT', 'I6`V|mDZq21-J|ihb u^q0F }F_NUcy`l,=obGtq*p#Ybe4a31R,r=|n#=]@]c #');
define('LOGGED_IN_SALT',   'w<$4c$Hmd%/*]`Oom>(hdXW|0M=X={we6;Mpvtg+V.o<$|#_}qG(GaVDEsn,~*4i');
define('NONCE_SALT',       'a|#h{c5|P &xWs4IZ20c2&%4!c(/uG}W:mAvy<I44`jAbup]t=]V<`}.py(wTP%%');

Plugin und Theme Editor deaktivieren

Damit nicht jeder Nutzer Zugriff auf die Themes oder Plugins im Quellcode hat, schaltet man den Editor einfach ab:

define('DISALLOW_FILE_EDIT', true);

Installation und Updates von Themes und Plugins

Möchte man den Nutzern auf dem System das Installieren und Updaten von Themes und/oder Plugins untersagen, setzt man diese Option:

define('DISALLOW_FILE_MODS', true);

Ist DISALLOW_FILE_MODS gesetzt, ist DISALLOW_FILE_EDIT nicht mehr nötig.

SSL Verbindungen erzwingen

Um die Anmeldung für Nutzer und des Adminbereiches über eine SSL verschlüsselte Verbindung zu erzwingen, stehen die zwei Angaben zur Verfügung:

define('FORCE_SSL_LOGIN', true);
define('FORCE_SSL_ADMIN', true);

Auf Nummer Sicher geht man mit der FORCE_SSL_ADMIN Option.

Externe URL Requests blockieren

Welcher Server darf Anfragen an das WordPress System stellen? Bzw. welcher nicht? Setzt man die folgende Einstellung auf true, darf nur localhost Requests an WordPress richten:

define('WP_HTTP_BLOCK_EXTERNAL', true);

Möchte man dennoch einige Anfragen durchlassen, muss man den (oder die) Server explizit auflisten:

define('WP_ACCESSIBLE_HOSTS', 'api.wordpress.org,*.externerserver.de');

Sind es mehrere Server, so werden sie durch Kommata getrennt hintereinander weggeschrieben. Alle Subdomains können durch die * Angabe eingeschlossen werden. IP Adressen müssten auch funktionieren.

Table Prefix

$table_prefix = 'thx1138';

Standardmäßig erhalten die Tabellennamen einer WordPress-Installation das Präfix wp_. Möchte man einen anderen Namensvorsatz vergeben (zum Beispiel aus Sicherheitsgründen), stellt man das mittels dieser Angabe ein. Es sind nur Zahlen, Buchstaben und der Unterstrich erlaubt.

WP SITEURL

Diese Angabe legt fest, wo die Kerndateien einer WordPress Installation zu finden sind. Eventuell anderslautende Einträge im Backend bzw. in der options Tabelle werden hiervon überschrieben. Bei dieser Angabe darf kein Slash am Ende der URL stehen.

define('WP_SITEURL', 'http://beispiel.de/meinwordpressverzeichnis');

Es ist auch möglich, den Servernamen als Bestandteil der URL dynamisch ausgeben zu lassen:

define('WP_SITEURL', 'http://' . $_SERVER['HTTP_HOST'] . '/pfadzuwordpress');

Da man dort aber ein Sicherheitsrisiko sieht, wird diese statische Methode empfohlen:

define('WP_SITEURL', 'http://' . $_SERVER['SERVER_NAME'] . '/pfadzuwordpress');

WP Home

Welche URL müssen die Nutzer eintippen, um auf den Blog zu gelangen? Der Eintrag WP Home legt dies fest und überschreibt auch hier wieder den eigentlichen Wert in der wp_options Tabelle. Wieder darf kein Slash am Ende der URL stehen und dynamische Werte sind auch möglich.

define('WP_HOME', 'http://beispielseite.de/wordpressverzeichnis');

Gebraucht wird diese Option vor allem, wenn WordPress in einem Unterverzeichnis einer Domain liegt, aber dennoch über die Domain URL aufgerufen werden soll.

WP Content verschieben

Seit WordPress 2.6 kann man den gesamten wie auch den Plugin Ordner des WP Content Ordners verschieben. Mit diesen Angaben teilt man also WordPress mit, wo es die Plugins, Uploads und Themes wiederfindet. Dazu wird ihm als erstes gesagt, wo es das Content Verzeichnis auf dem Server lokal wiederfindet:

define('WP_CONTENT_DIR', dirname(__FILE__) . '/andererordner/wp-content');

Und dann, wie die URI dafür lautet:

define('WP_CONTENT_URL', 'http://beispielseite/anderesverzeichnis/wp-content');

Das geht natürlich auch nur mit dem Plugin Ordner:

define('WP_PLUGIN_DIR', dirname(__FILE__) . '/anderesverzeichnis/wp-content/plugins');
define('WP_PLUGIN_URL', 'http://example/anderesverzeichnis/wp-content/plugins');

Der Themes Ordner hingegen ist fest verdrahtet, wie hier ersichtlich wird:

$theme_root = WP_CONTENT_DIR . '/themes';

Der Pfad zum Uploads Ordner wird hier festgelegt:

define('UPLOADS', '/blog/wp-content/uploads');

Den Upload aller Dateitypen zulassen

Das klingt verlockend, öffnet aber meiner Ansicht nach den Tentakelwesen aus der Kerkerdimension Tür und Tor:

define('ALLOW_UNFILTERED_UPLOADS', true);

Autosave Interval

define('AUTOSAVE_INTERVAL', 300);

Standardmäßig speichert WordPress alle 60 den aktuellen Stand eines gerade zu bearbeitenden Artikels als Revision ab. In meinem Beispiel habe ich den Wert mal auf 5 Minuten gesetzt. Die Angabe hat immer in Sekunden zu erfolgen.

Wie man sieht, kann diese Funktion dafür sorgen, dass eure Revisions schnell anwachsen und die Datenbank immer größer wird. Dagegen kann man aber etwas tun:

Revisionen

Post Revisions

Entweder, ihr schaltet die Revisions Funktion ganz ab:

define('WP_POST_REVISIONS', false);

Oder beschränkt diese auf die aktuellsten x (ich finde, 3 ist ein guter Wert) Versionen:

define('WP_POST_REVISIONS', 3);

Cookie Domain

So setzt man eine spezielle Cookie Domain für WordPress:

define('COOKIE_DOMAIN', 'www.askapache.com');

Debugging

Die Debugging Funktion in WordPress ist standardmäßig abgeschaltet. Wer Fehler in der Installation auswerten möchte, muss das Debuging aktivieren:

define('WP_DEBUG', true);

Dann sind auch WP_DEBUG_DISPLAY und WP_DEBUG_LOG möglich.

Ich halte es persönlich nicht für sinnvoll, in den Javascript bzw. CSS Dateien vom WordPress Kernsystem zu arbeiten. Aber wer das tun möchte, sollte folgende Einstellung setzen:

define('SCRIPT_DEBUG', true);

Javascript Concatenation

Damit das Arbeiten für den Admin schneller geht, fasst WordPress die Javascript Dateien zusammen und liefert diese gebündelt aus. Sollte dies unerwarteterweise Probleme bereiten, schaltet man dieses Verhalten ab:

define('CONCATENATE_SCRIPTS', false);

PHP Memory Limit

Je nach Provider und Hostingumgebung kann der PHP Arbeitsspeicher erhöht werden, den WordPress ausreizen kann. Mittlerweile sind die 32 MB oder 64 MB für ein voll ausgestattetes WordPress einfach zu wenig. Dann kann man das mit dieser Angabe nach oben schrauben:

define('WP_MEMORY_LIMIT', '128M');

Die folgene Angabe wirkt sich extra auf den Adminbereich aus:

define('WP_MAX_MEMORY_LIMIT', '256M');

WP Cache

Soweit ich weiß, benötigen Cache Plugins diese Variable:

define('WP_CACHE', true);

CustomUser Table und Custom User Meta Table

Man kann auch eigene Tabellen für die WordPress Nutzer verwenden. Ich weiss allerdings nicht, ob das ergänzend zu den Standardtabellen geschieht oder diese dadurch inaktiv sind:

define('CUSTOM_USER_TABLE', $table_prefix.'my_users');
define('CUSTOM_USER_META_TABLE', $table_prefix.'my_usermeta');

WP Language

Diese Optionen teilen dem System mit, wo sich das Verzeichnis mit den Übersetzungsdateien befindet und wie diese benannt sind:

define('WPLANG', 'de_DE');
define('WP_LANG_DIR', dirname(__FILE__) . 'wordpress/languages');

Save Queries

Manchmal ist es hilfreich zu analysieren, welche Datenbankabfragen das System generiert. Die folgende Variable speichert alle Anfragen (aufgerufene Funktion, Zeitdauer etc.) in einem Array und sollte daher nur während des Debugging aktiv sein:

define('SAVEQUERIES', true);

File Permissions

Gesetzt den Fall, dass der Provider strikte Regeln bei den Datei/Verzeichnisberechtigungen erlassen hat, dass selbst ein automatisches Update des Kernsystems nicht mehr möglich ist, kann vielleicht diese Einstellung aushelfen. Von dieser Funktion halte ich wenig. Dateirechte und -benutzer sollte man auf Serverebene festlegen oder einen Hoster wählen, der per default die nötigen Einstellungen hat:

define('FS_CHMOD_DIR', ( 0755 & ~ umask() ));
define('FS_CHMOD_FILE', ( 0644 & ~ umask() ));

WordPress Upgrade

Da ich es leid war, bei einem Update des WordPress Systems für jeden Vorgang die FTP Zugangsdaten einzugeben, habe ich mich auch eines Teils der nächstfolgenden Konstanten bedient. Im Nachhinein betrachtet kann vor allem die Angabe der FTP-Daten nicht mehr empfohlen werden. Einfacher gelangen Hacker nirgends an FTP Benutzernamen und Passwort:

define('FS_METHOD', 'ftpext');
define('FTP_BASE', '/pfadzuwordpress/');
define('FTP_CONTENT_DIR', '/pfadzuwordpress/wp-content/');
define('FTP_PLUGIN_DIR ', '/pfadzuwordpress/wp-content/plugins/');
define('FTP_PUBKEY', '/home/username/.ssh/id_rsa.pub');
define('FTP_PRIKEY', '/home/username/.ssh/id_rsa');
define('FTP_USER', 'username');
define('FTP_PASS', 'password');
define('FTP_HOST', 'ftp.beispielseite.de');
define('FTP_SSL', false);

WP Cron Jobs

Cron Jobs sind eine feine Sache und in WordPress teilweise auch zu steuern. Wenn z.B. der normale Cron-Job bei den geplanten Artikelveröffentlichungen seine Arbeit einstellt, kann man den alternativen Dienst aktivieren:

define('ALTERNATE_WP_CRON', true);

Die Cron-Jobs deaktiviert man so:

define('DISABLE_WP_CRON', true);

Jeder Crob-Job kann nur einmal in einem bestimmten Zeitraum (in Sekunden anzugeben) angestossen werden:

define('WP_CRON_LOCK_TIMEOUT', 120);

Papierkorb / Trash

Empty Trash

Der WordPress eigene Papierkorb (Trash) Bereich hebt alle gelöschten Beiträge, Seiten, Artikelbilder und Kommentare so lange auf, bis man den Papierkorb händisch leert. Allerdings gibt es auch eine Automatisierung dafür (Angabe in Tagen):

define('EMPTY_TRASH_DAYS', 7);

Man kann den Papierkorb auch ganz abschalten. Dann wird beim Löschen gleich richtig gelöscht. Weg ist dann weg.

define('EMPTY_TRASH_DAYS', 0);

Was mir auch neu war, ist, dass es auch eine Papierkorb-Funktion für die Mediathek gibt:

define('MEDIA_TRASH', true);

Database Optimization

define('WP_ALLOW_REPAIR', true);

Wenn ich das richtig verstanden habe, setzt man diese Funktion auf true, wenn man sich im Falle einer verhauenen Datenbank nicht mehr in das System selbst einloggen kann. Dabei wird die Funktion nur aktiviert, während der Aufruf des Skriptes händisch erfolgen muss:

{deinewordpressseite}/wp-admin/maint/repair.php

Upgrade Angelegenheiten bei globalen Tabellen

Es gibt Fälle, da sind die globalen Tabellen so angewachsen (User und Usermeta), dass ein Upgrade auf diese Tabellen zu lange dauert und eventuell sogar abbricht. Um das zu verhindern, kann man diese Tabellen von Änderungs- oder Löschungs-Anfragen ausnehmen:

define('DO_NOT_UPGRADE_GLOBAL_TABLES', true);

Automatisches Update der Kerndateien einstellen

Man kann auch die Kerndateien vom automatischen Update ausschliessen.

define('WP_AUTO_UPDATE_CORE', false);

Der Wert true würde ein automatisches Updaten erlauben.

Interessant ist auch die Idee, nur Minor Updates zuzulassen:

define('WP_AUTO_UPDATE_CORE', 'minor');

Hiermit setzt ihr die automatische Update Funktion aus:

define('AUTOMATIC_UPDATER_DISABLED', true);

Wenn ihr nur die Themes und Plugins vom automatischen Update ausnehmen wollt, definiert das so:

define('CORE_UPGRADE_SKIP_NEW_BUNDLED', true);

Verbindung zur wordpress.com API

Den API-Key eines Accounts bei wordpress.com kann man auch in der wp-config.php hinterlegen. Der einzige, mir bekannte, Fall wo das gebraucht wird, liegt in der Verwendung der Jetpack-Pluginsammlung:

define('WPCOM_API_KEY', 'API-Key-Eingeben');

Wie ihr seht, bietet einem die wp-config.php Datei vielseitige Einstellungsmöglichkeiten für das WordPress System, ohne dass amn gleich wieder ein Plugin installieren muss. Und dabei habe ich nur die WordPress-eigenen Befehle aufgelistet.

6 Kommentare:

  1. Hallo,
    vielen Dank für den tollen Artikel! Da sind einige nützliche Sachen dabei 🙂
    Eine Frage habe ich noch – ich habe meine config Datei inzwischen bearbeitet und einige Infos hinterlegt. (WP SITEURL und WO home). Nach einem automatisch Update von wordpress sind diese Infos jedesmal weg. Meine Seite nicht mehr erreichbar. Gibt es eine Möglichkeit, die config Datei vom Update auszuschließen??
    LG Jule

    • Hallo Jule,

      ein WordPress Update betrifft nicht die wp-config.php. Die kennt WordPress gar nicht, im Gegensatz zur wp-config-sample.

      Die Angaben der Siteurl und Home in der wp-config.php sind auch nur Notfallmaßnahmen. Es reicht im Prinzip aus, dies im Backend bei den Einstellungen anzugeben.

      • Hallo,

        da hatte ich leider einmal was falsch angegeben. Jetzt ist es ausgegraut und ich muss es in der wp-config angeben… Oder gibt es hier noch eine andere Möglichkeit?
        Komisch – beim letzten update, hat es mir diese Erweiterung rausgenommen. Dann kann ich nur hoffen, dass es diesmal klappt. Ich kann u.U. nämlich nicht reagieren, da ich im Urlaub bin.
        Herzlichen Dank! Jule

      • Ja, Du könntest es direkt in der wp_options Tabelle der Datenbank ändern.
        Aber scheinbar ist bei der gesamten Installation etwas im Argen, wenn da schon die Backendeinstellungen ausgegraut werden.

      • Ja – ist etwas komplizert bei mir – und ich kenne mich dann doch zu wenig aus.
        Danke trotzdem. Ich werde mal abwarten, was sich tut und hoffen, dass alles gut geht 🙂
        Liebe Grüße
        Juliane

      • „Ja – ist etwas komplizert bei mir“

        Scheint so.

        🙂

        Wenn Du Hilfe benötigst, melde Dich einfach.
        Von hier aus ist es schwer zu sagen, was auf der Seite genau querhaut. Also, so ohne Glaskugel …

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.