Upload médií bez diakritiky na WordPressu

1 PHP, Tipy & triky

WordPress ponechává diakritiku v názvech při nahrávání souborů. Jak tyto nežádoucí znaky a další odstranit si ukážeme v dnešním návodu.

Upload médií bez diakritiky na WordPressu

WordPress po uploadu souboru zanechá v názvu různé znaky, včetně těch českých. Na některých serverech poté nastane problém, po navštívení odkazu server vrátí Error404.

Řešení ale není tak jednoduché, jak by se mohlo zdát. Ukážeme si jedno řešení pomocí WordPress funkcí, druhé pomocí vlastních metod, které lze více přizpůsobit vlastním potřebám.

Odstranění pomocí funkcí WordPressu

WordPress obsahuje metodu remove_accents, která mnohé znaky dokáže odstranit. Přesto znaky řečtiny nebo ruštiny převede špatně, a odkazy poté fungovat nemusí. Pokud ale neočekáváte azbuku a jiné, může vám jednodušší řešení dostačovat.

Registrujeme filtr a funkci k němu, která se zavolá vždy po nahrání souboru.

function removeNonAsciiCharsFromFileUpload( $filename ) {
    $info = pathinfo( $filename );
    $ext  = empty( $info['extension'] ) ? '' : '.' . $info['extension'];
    $name = basename( $filename, $ext );

    return remove_accents($name).$ext;
}

add_filter( 'sanitize_file_name', 'removeNonAsciiCharsFromFileUpload', 10 );

Vlastní řešení

Pokud očekáváte i další znaky, nebo jen máte rádi kontrolu nad názvy a chcete se ujistit, že žádný znak nebude dělat problémy, můžete využít následujícího kódu. Chová se stejně jako předchozí, můžete ale si nadefinovat vlastní znaky pro nahrazení.  Můžete tedy přidat i řeckou abecedu, azbuku a co si jen zamanete.

function removeNonAsciiCharsFromFileUpload( $filename ) {
    $info = pathinfo( $filename );
    $ext  = empty( $info['extension'] ) ? '' : '.' . $info['extension'];
    $name = basename( $filename, $ext );

    // převedeme vše na malé písmena
    $name = mb_strtolower($name,'UTF-8');
    // nahradime české a slovenské znaky (lze si přidat i vlastní)
    $name = str_replace(
        array('á','ä','č','ď','ě','é','í','ĺ','ľ','ň','ó','ô','ř','ŕ','š','ť','ú','ů','ý','ž','_',' '),
        array('a','a','c','d','e','e','i','l','l','n','o','o','r','r','s','t','u','u','y','z','-','-'), $name);

    // jiné než povolené znaky se vymažou
    $name = preg_replace('/[^a-z0-9\-]/', "", $name);
    // jsou-li 2 a více pomlček za sebou, nahradíme za jednu
    $name = preg_replace('/(\-){2,}/', "-", $name);

    // Pokud i nadále je název prázdný, můžete vložit MD5 hash názvu souboru
    if(strlen($name) == 0 || $name == "-"){
        $name = md5($filename);
    }

    return $name . $ext;
}

add_filter( 'sanitize_file_name', 'removeNonAsciiCharsFromFileUpload', 10 );

Máte jiné řešení, nebo metodu jak zabránit ostatním znakům v adrese? Podělte se s námi v komentářích

K tomuto článku již není možné přidávat další komentáře

Komentáře

Zdravím narazil jsem na stejný problém jako řešil tento člověk se soubory s diakritikou nahrávanými do WP http://m.cg/post/.../fix-accented-filenames-on-linux-with-convmv možná pomůže ostatním s opravou (pak už stačí Media File Renamer).