Letztens habe ich versucht, einen GPS-Track als GPX-Datei (.gpx) auf eine Website hochzuladen. Ziel war es, den GPS-Track anderen Leuten als Download zur Verfügung zu stellen. Der Versuch scheiterte zunächst kläglich. Ursache waren die WordPress Mime-Types, wie ich schnell herausfinden konnte.
MIME-Types in WordPress auf einen Blick
- Was ein MIME-Type ist: die technische Angabe, welche Art von Inhalt eine Datei hat – image/jpeg für ein JPG. Jede erlaubte Dateiendung hat so einen Wert.
- Warum der Upload scheitert: WordPress nimmt nur Dateitypen aus einer festen Liste an. Fehlt die Endung dort, kommt die Meldung, dass der Dateityp aus Sicherheitsgründen nicht erlaubt sei.
- Erst nachsehen, dann ändern: was Deine Installation erlaubt, liefert die Funktion
wp_get_mime_types(). Vieles, was früher fehlte, ist heute schon dabei. - Erweitern per Code: zum Hinzufügen den Filter mime_types, zum Entfernen den Filter upload_mimes. Ein paar Zeilen im Child-Theme genügen.
- Erweitern ohne Code: ein Plugin übernimmt dieselbe Aufgabe, in einer Multisite reicht ein Eintrag in den Netzwerkeinstellungen.
- WebP und AVIF: beide Bildformate kennt der WordPress-Core inzwischen selbst, freischalten musst Du dafür nichts.
- Sicherheit: schalte nur frei, was Du wirklich brauchst. SVG gehört bereinigt und auf Administratoren beschränkt.
WordPress lässt nur bestimmte Dateitypen zu
Standardmäßig kann man mit dem integrierten Uploader nämlich nur bestimmte Dateitypen hochladen. Welche, das bestimmen die WordPress Mime-Types. Man könnte auch sagen, die Dateiendung muss stimmen, sonst verweigert WordPress den Upload. Das ist ja eigentlich aus Sicherheitsaspekten sehr gut, denn so können potentiell schädliche Dateien, die beim normalen Betrieb einer Website nicht benötigt werden, gar nicht erst hochgeladen werden. Eine .exe-Datei kann man also gar nicht in die Mediathek hochladen.
Erlaubte WordPress Mime-Types
Eine Übersicht der erlaubten Dateitypen bzw. Dateiendungen (WordPress Mime-Types gibt es hier. Das sind neben Bilddateien überwiegend weitere Mediadateien, wie gängige Audio- und Videoformate. Aber auch Office-Dateien (.ppt, .xls, .odt, .doc) kann man hochladen.
Das sind also auch bereits zahlreiche Formate, die potentiell Schadcode enthalten können. Also kann man aus Sicherheitsaspekten erstmal nichts gegen eine sinnvolle Erweiterung der Mime-Types haben, besonders dann nicht, wenn man diese Dateien für den Betrieb der Webseite braucht. Das Format SVG wird auch von Haus aus nicht unterstützt, aber oft benötigt. Und wenn man Joggingstrecken, Wanderrouten oder Fahrradtouren als GPS-Tracks auf seiner Webseite bereitstellen will, dann braucht man eben die Möglichkeit, GPX-Dateien in die WordPress Mediathek hochzuladen.
WordPress Multisite bringt das Feature von Haus aus mit
Da ich häufig mit WordPress-Multisites arbeite, guckte ich erstmal in den Einstellungen. Denn in der Multisite-Installation kann man unter Werkzeuge > Netzwerkeinstellungen die benötigten weiteren Mime-Types einfach ergänzen. Gewünschte Dateiendung einfügen, fertig. Leider gibt es diese Möglichkeit nicht in einer Standard-Installation von WordPress. Warum eigentlich nicht? Gute Frage!
Plugin oder Handarbeit?
Bei der Google-Suche nach einem entsprechenden Plugin stieß ich erstmal auf den tollen Beitrag von Raffael zum Thema erlaubte Dateitypen für den Upload in WordPress. Die dort vorgestellten Lösungen haben mir sehr geholfen, die Lösung zu finden. Nachtrag: Dieser Beitrag ist inzwischen offline. Die maßgebliche Liste der von WordPress erlaubten Dateitypen steht in der Referenz zu wp_get_mime_types().
Erlaubte Dateitypen für den Upload mit einem WordPress Plugin ändern
Wer nicht in den Quellcode seines WordPress-Themes eingreifen möchte oder kann, bedient sich zur Änderung der erlaubten Mime-Types einfach eines Plugins. Das Plugin WP Extra File Types leistet, was er Titel verspricht.
WordPress Mime-Types über den PHP-Code ändern
Statt ein weiteres Plugin zu installieren, wollte ich aber lieber Handarbeit leisten und das Problem mit einer Funktion lösen. Immer mehr Plugins blähen jede WordPress Installation irgendwann auf und beeinträchtigen die Leistung. Außerdem steigt das Risiko, dass irgendwann ein Plugin mangels Update nicht mehr funktioniert. Spätestens dann wird man sich mit der Lösung des Problems auf der Ebene des PHP-Quellcodes in der functions.php auseinandersetzen müssen.
Den richtigen Mime-Type für GPX Dateien finden
In dieser Übersicht über die meisten Mime-Typen habe ich .gpx-Dateien leider nicht gefunden. Google hilft hier aber weiter, die korrekte Bezeichnung des Mime-Type für GPX-Dateien lautet application/gpx+xml.
Welcher Filter? – upload_mimes oder mime_types?
Im oben verlinkten Beitrag findet sich ein Codeschnipsel, der das Problem lösen kann, bei mir hat es aber nach Anpassung jedenfalls nicht funktioniert. Das wird daran liegen, dass dort der WordPress-API-Filter upload_mimes benutzt wurde, in den die Funktion eingeklinkt wurde, um das Array mit den erlaubten Dateitypen bearbeiten können. Um Mime-Types hinzuzufügen oder zu entfernen, wird das Array der erlaubten Dateitypen verändert. Wenn man aber nicht aufpasst, dann zerschießt man mit diesem Filter das vorhandene Array. So war es jedenfalls bei mir, nachdem ich den Code so verwendet hatte, funktionierte zwar der Upload des neu hinzugefügten Dateityps GPX-Datei (.gpx), aber ich konnte keine anderen Dateien mehr hochladen, auch kein .jpg mehr.
Bessere Lösung: den Filter mime_types verwenden
Auf der Ursachesuche bin ich unter anderem auf diesen englischsprachigen Beitrag zum Hinzufügen von Mime-Types gestoßen. Dort wird das Problem sehr deutlich erklärt und eine andere Möglichkeit gewählt. Man kann auch auf die Funktion wp_get_mime_types() zugreifen die in der Datei wp-includes/functions.php im WordPress-Core zu finden ist. Zu dieser Funktion stellt WordPress einen Filter mit dem Namen mime_types bereit. Im WordPress Codex wird auch explizit angegeben, dass man diesen Filter zum Hinzufügen von erlaubten WordPress Dateitypen nutzen soll. Zum Entfernen von erlaubten WordPress Dateitypen soll man hingegen den Filter upload_mimes nutzen.
Codeschnipsel um GPX-Dateien in WordPress hochzuladen
Der fertige PHP-Code, um den Upload von GPX-Dateien in die WordPress Mediathek zu ermöglichen sieht so aus. Der Code funktionierte bei mir und ich konnte GPX-Dateien und auch alle anderen zuvor erlaubten Dateitypen hochladen.
function my_theme_custom_upload_mimes( $existing_mimes ) {
// gpx zur Liste der erlaubten Mime-Types hinzufuegen
$existing_mimes['gpx'] = 'application/gpx+xml';
// Return des Array mit dem hinzugefuegten Mime-Type gpx
return $existing_mimes;
}
add_filter( 'mime_types', 'my_theme_custom_upload_mimes' );
Kein Zugriff auf die hochgeladene GPX-Datei
Nachdem der Upload endlich reibungslos funktionierte musste ich allerdings feststellen, dass man auf die GPX-Datei nicht zugreife konnte. Laut FTP lag sie im WordPress Uploads Verzeichnis, was war das Problem? Nun, es lag am IIS. Wenn der den neuen Mime-Type nicht kennt, dann kann man auf die Dateien eben nicht zugreifen. Die Lösung unter Plesk findet man hier.
Nachsehen statt raten: welche Dateitypen erlaubt sind
Bevor Du an der functions.php etwas änderst, lohnt ein Blick auf den Ist-Zustand. Die verbindliche Liste liefert wp_get_mime_types(). Die Schlüssel des Arrays sind die Dateiendungen, die Werte die MIME-Types; gleichwertige Endungen stehen zusammen in einem Schlüssel, etwa jpg|jpeg|jpe für image/jpeg. Genau dieses Array bekommst Du in den Filtern von oben zu fassen.
Zum Nachsehen genügt ein Schnipsel, den Du vorübergehend in die functions.php Deines Child-Themes legst. Er zeigt die Liste ausschließlich Administratoren.
add_action( 'admin_notices', 'bx_zeige_erlaubte_mime_types' );
function bx_zeige_erlaubte_mime_types() {
if ( ! current_user_can( 'manage_options' ) ) {
return;
}
echo '<pre>' . esc_html( print_r( wp_get_mime_types(), true ) ) . '</pre>';
}
Wer lieber nachliest, findet dieselbe Aufstellung in der Referenz zu wp_get_mime_types() im Entwicklerhandbuch. Die Liste ist über die Jahre gewachsen: manches Format, das man früher nachrüsten musste, bringt der Core längst mit. Weitere Schnipsel sammle ich unter PHP-Tools und Links.
WebP und AVIF: die modernen Bildformate
Die häufigste Frage zu den WordPress Mime-Types betrifft heute nicht mehr GPX, sondern die modernen Bildformate. Dabei musst Du meist gar nichts freischalten: WebP nimmt WordPress seit Version 5.8 von sich aus an, AVIF ist mit Version 6.5 dazugekommen. Ob Deine Installation sie kennt, beantwortet der Schnipsel von oben zuverlässiger als jede Jahreszahl.
Hochladen und Weiterverarbeiten sind aber zweierlei: die Zwischengrößen entstehen nur, wenn auch die Bildbibliothek des Servers das Format beherrscht – bei AVIF seltener als bei WebP. Was Dein Server kann, zeigt die PHP-Konfiguration; wie Du sie aufrufst, steht unter PHP-Info-Datei erstellen.
Wenn WebP oder AVIF trotzdem abgelehnt werden
Dann liegt es fast nie am Format. Ist die WordPress-Version aktuell? Entfernt ein Plugin oder ein eigener upload_mimes-Filter Einträge aus der Liste? Fehlt das Format in den Netzwerkeinstellungen einer Multisite? Erst wenn das alles ausscheidet, ist ein eigener Eintrag über mime_types sinnvoll.
Sicherheit: nur freischalten, was Du wirklich brauchst
Oben steht schon, dass die Beschränkung im Grunde eine gute Sache ist. Beim Erweitern gilt das erst recht: jeder zusätzliche Dateityp ist eine Tür mehr, und sie steht danach allen offen, die Dateien hochladen dürfen. Die Frage lautet deshalb nicht, was man irgendwann brauchen könnte, sondern welche Datei heute hochgeladen werden soll.
Der Standardfall: SVG mit eingebettetem JavaScript
SVG ist keine Bilddatei im gewohnten Sinn, sondern ein XML-Dokument – also Text. Und in Text lässt sich Skriptcode schreiben: ein script-Element oder ein Ereignis-Attribut, das ausgeführt wird, sobald die Grafik angezeigt wird. Ruft jemand die Datei direkt auf oder bindet das Theme sie inline ein, läuft dieser Code im Kontext Deiner Domain. Ein JPG kann WordPress an seinen Bilddaten prüfen, bei einem SVG gibt es nichts dergleichen. Deshalb steht das Format nicht in der Standardliste – und deshalb rate ich davon ab, SVG-Uploads pauschal freizuschalten.
Was Du stattdessen tun kannst
- Bereinigen: SVG-Dateien beim Upload von Skript- und Ereignis-Inhalten befreien – per Plugin, das dafür gebaut ist, oder indem Du die Grafik ohne Skripte exportierst und im Texteditor durchsiehst.
- Auf Administratoren beschränken: pflegst nur Du die Grafiken ein, muss der Dateityp für Autoren nicht offen stehen.
- Keine fremden Dateien: eine SVG-Datei aus beliebiger Quelle ist kein Bild, sondern fremder Code.
- Wieder abschalten: brauchst Du ein Format nur einmal, nimm den Filter danach wieder heraus.
Das passt zur Arbeitsteilung der beiden Filter von oben: hinzugefügt wird über mime_types, entfernt über upload_mimes.
add_filter( 'upload_mimes', 'bx_svg_nur_fuer_admins' );
function bx_svg_nur_fuer_admins( $mimes ) {
if ( ! current_user_can( 'manage_options' ) ) {
unset( $mimes['svg'] );
}
return $mimes;
}
Fehlersuche: dieser Dateityp ist aus Sicherheitsgründen nicht erlaubt
Diese Meldung – im Wortlaut je nach Version etwas anders – ist die Standardantwort des Uploaders, wenn eine Datei nicht zur erlaubten Liste passt. Woran es liegt, verrät sie nicht. Geh die Ursachen der Reihe nach durch:
- Steht der Dateityp überhaupt in der Liste? Der häufigste Fall, mit dem Schnipsel von oben in einer Minute geklärt.
- Greift Dein Filter? Code in einem gar nicht aktiven Theme, ein deaktiviertes Snippet-Plugin oder ein Tippfehler im Hook-Namen sind die Klassiker.
- Passt der Inhalt zur Endung? Beim Upload prüft
wp_check_filetype_and_ext(), ob der Dateiinhalt zur Endung passt. Eine umbenannte Datei fällt hier durch, gelegentlich aber auch eine korrekte, deren Typ der Server anders einschätzt. - Multisite? Dann gilt zusätzlich die Liste aus den Netzwerkeinstellungen.
- Reicht die Benutzerrolle? Entfernt ein Filter den Typ rollenabhängig, sieht nur dieser Benutzer die Meldung. Teste mit dem betroffenen Konto.
- Blockt der Server? Manche Hoster filtern Uploads über eine vorgelagerte Firewall; das endet meist in einem Fehler 403 und nur der Support hilft weiter.
Klappt der Upload, lässt sich die Datei danach aber nicht abrufen, bist Du beim Webserver – genau der Fall weiter oben. Ein Download ins Leere ist übrigens einer der SEO-Fehler im eigenen Blog.
Häufige Fragen zu MIME-Types in WordPress
Grundlagen
Technik und Sicherheit
Fazit
Die WordPress Mime-Types sind kein Schikane-Feature, sondern eine Schutzmauer mit einer Tür darin. Sieh nach, was schon erlaubt ist, ergänze gezielt den Typ, den Du brauchst, und begrenze bei heiklen Formaten wie SVG zusätzlich Rechte und Inhalt. Mehr Werkzeuge fürs Bloggen findest Du unter Blogger-Tools.


[…] entgegen, sondern verlangt eine öffentlich erreichbare JPEG-URL. Wenn dein WordPress die Beitragsbilder als WebP ausliefert – und das tun inzwischen viele –, musst du vorher umwandeln. Facebook akzeptiert WebP bei […]