Was bei Titletags seit WordPress 3.6 geht, nämlich die Umwandlung von Umlauten in „ae“, „oe“ und „ue“, vermisse ich bei WordPress für Dateinamen immer noch. Grundsätzlich funktioniert es zwar, Bilder mit Umlauten und scharfem »ß« in Dateinamen einzusetzen, allerdings können diese Zeichen in Dateinamen selbst innerhalb von WordPress zu Lesefehlern führen. Betroffene Bilder konnte ich beim Testen in der Vorschauansicht der Mediathek nach dem Hochladen nicht sehen (in der Detailansicht allerdings schon).
Im Vergleich der Funktionen sanitize_file_name()
und sanitize_title()
fällt auf, dass die Titel durch die Funktion remove_accents()
geschickt werden. Denselben Zeichenfilter testete ich an Dateinamen (wird nur auf Dateien angewendet die noch hochgeladen werden, nicht bestehende).
function pppf_extend_filename_sanitization($title) {
return remove_accents($title);
}
add_filter( 'sanitize_file_name','pppf_extend_filename_sanitization');
Code-Sprache: PHP (php)
Ergebnis mit denselben vier Testdateien
Durchgehende Kleinschreibung
Mit strotolower
werden Großbuchstaben in Dateinamen abschließend noch in Kleinbuchstaben umgewandelt.
function pppf_extend_filename_sanitization($title) {
return strtolower(remove_accents($title));
}
add_filter( 'sanitize_file_name','pppf_extend_filename_sanitization');
Code-Sprache: PHP (php)
Es ist nicht auszuschließen, dass beim XML-Import einer WordPress-Site die Dateinamen in Posts ebenfalls umbenannt werden, die Dateien selbst aber nicht. In einem solchen Fall müsste die Funktion vorübergehend ausgesetzt werden, oder betroffene Dateien umbenannt.
Test ohne Funktion

Test mit Funktion als / in einem Plugin

Test mit Funktion in der functions.php

Damit der Filter für Umlaute korrekt funktioniert, muss die Sprache der Site auf Deutsch (de_DE oder de_DE_formal) gestellt sein, oder die Abfrage wird entsprechend umgeschrieben.
// Used for locale-specific rules
$locale = get_locale();
if ( 'de_DE' == $locale || 'de_DE_formal' == $locale ) {
$chars[ chr(195).chr(132) ] = 'Ae';
$chars[ chr(195).chr(164) ] = 'ae';
$chars[ chr(195).chr(150) ] = 'Oe';
$chars[ chr(195).chr(182) ] = 'oe';
$chars[ chr(195).chr(156) ] = 'Ue';
$chars[ chr(195).chr(188) ] = 'ue';
$chars[ chr(195).chr(159) ] = 'ss';
}
Code-Sprache: PHP (php)
Erweiterung der Funktion bei anderen Spracheinstellungen
function pppf_extend_filename_sanitization($title) {
$locale = get_locale();
if (seems_utf8($title) && ( 'de_DE' != $locale && 'de_DE_formal' != $locale )) {
$chars[ chr(195).chr(132) ] = 'Ae';
$chars[ chr(195).chr(164) ] = 'ae';
$chars[ chr(195).chr(150) ] = 'Oe';
$chars[ chr(195).chr(182) ] = 'oe';
$chars[ chr(195).chr(156) ] = 'Ue';
$chars[ chr(195).chr(188) ] = 'ue';
$chars[ chr(195).chr(159) ] = 'ss';
$title = strtr($title, $chars);
}
return strtolower(remove_accents($title));
}
add_filter( 'sanitize_file_name','pppf_extend_filename_sanitization');
Code-Sprache: PHP (php)

Die angefügte erweiterte Funktion pppf_extend_filename_sanitization()
wurde lediglich mit der Spracheinstellung en_US getestet
Das ist ja schön und gut, aber bei mir wandelt WordPress die Umlaute bei Bildern nicht automatisch um. Ist das normal? Wenn ich eine Testgrafik mit äüö.jpg hochlade, kommt ä ö ü dabei heraus, jeweils mit Leerzeichen, aber kein ae, oe, ue etc.
Möglicherweise spielt die Position der Funktion eine Rolle, resp. wann der Filter greift. Bei mir war die Funktion als ich sie testete in einem Plugin. Ich überprüfe wie sie sich in der functions.php vom Theme verhält und ergänze dann den Beitrag.
Nunja, das "ß" wird ja in "s" umgewandelt, aber Umlaute eben nicht. Was im Grunde viel wichtiger ist.
Interessanter Hinweis. Ist die Spracheinstellung der Site denn Deutsch?
Ja klar, sonst würde ich mich auch nicht wundern.
Geht mir grade auch so, dass ich mich wundere. Natürlich gibt es dafür eine Erklärung, aber ohne nähere Untersuchung fällt mir dazu im Moment nichts mehr ein. Wird strtolower auch verwendet und in derselben Abfolge? Wenn man die Funktionen umkehrt, führt das auch zu unvorhersehbaren Ergebnissen.