Deuxième déception: après avoir créé un fichier .htaccess pour réécrire les URL de mon blog, je m’aperçois que les titres de mes billets comportant des accents se réécrivent mal…
Par exemple, le titre suivant: “Réécriture des URL du blog” devient “http://www.davidtouvet.com/blog/archives/2004/08/16/rcriture-des-url-du-blog/”. On remarque vite fait bien fait que les deux “é” ont disparu purement et simplement. De la magie, non, il ne semble pas, comme vous allez le comprendre.
En fouinant sur le support de WordPress, je suis tombé sur les messages suivants: “Trouble with permalinks and special caracters“. On y apprend avec stupéfaction qu’une fonction php (”remove_accents”) qui servait justement à gérer ce genre de situations n’est plus présente dans la dernière version de WordPress. Et là, je me suis posé la même question que “Marcos Vinicius”: “Why this function are deleted from newer version?”.
J’ai alors tenté une recherche sur Google pour trouver des informations relatives à cette fonction. C’est là que je suis tombé sur un site proprement hallucinant puisqu’il liste l’ensemble des fonctions de la prochaine version, la 1.3. J’ai donc retrouvé la fonction dans “wp-include/functions-formatting.php” que j’ai insérée dans mon fichier du même nom. Pour l’instant cela semble fonctionner, on verra si d’autres problèmes surviennent.
Voici les fonctions que j’ai ajoutées. La première étant appelée par la deuxième, j’ai jugé important de la prendre aussi:
function seems_utf8($Str) { # by bmorel at ssi dot fr
for ($i=0; $i
if (ord($Str[$i]) < 0x80) continue; # 0bbbbbbb
elseif ((ord($Str[$i]) & 0xE0) == 0xC0) $n=1; # 110bbbbb
elseif ((ord($Str[$i]) & 0xF0) == 0xE0) $n=2; # 1110bbbb
elseif ((ord($Str[$i]) & 0xF8) == 0xF0) $n=3; # 11110bbb
elseif ((ord($Str[$i]) & 0xFC) == 0xF8) $n=4; # 111110bb
elseif ((ord($Str[$i]) & 0xFE) == 0xFC) $n=5; # 1111110b
else return false; # Does not match any model
for ($j=0; $j<$n; $j++) { # n bytes matching 10bbbbbb follow ?
if ((++$i == strlen($Str)) || ((ord($Str[$i]) & 0xC0) != 0x80))
return false;
}
}
return true;
}
Puis, la fameuse fonction pour les accents:
function remove_accents($string) {
$chars['in'] = chr(128).chr(131).chr(138).chr(142).chr(154).chr(158)
.chr(159).chr(162).chr(165).chr(181).chr(192).chr(193).chr(194)
.chr(195).chr(196).chr(197).chr(199).chr(200).chr(201).chr(202)
.chr(203).chr(204).chr(205).chr(206).chr(207).chr(209).chr(210)
.chr(211).chr(212).chr(213).chr(214).chr(216).chr(217).chr(218)
.chr(219).chr(220).chr(221).chr(224).chr(225).chr(226).chr(227)
.chr(228).chr(229).chr(231).chr(232).chr(233).chr(234).chr(235)
.chr(236).chr(237).chr(238).chr(239).chr(241).chr(242).chr(243)
.chr(244).chr(245).chr(246).chr(248).chr(249).chr(250).chr(251)
.chr(252).chr(253).chr(255);
$chars['out'] = "EfSZszYcYuAAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuyy";
if (seems_utf8($string)) {
$invalid_latin_chars = array(chr(197).chr(146) => ‘OE’, chr(197).chr(147) => ‘oe’, chr(197).chr(160) => ‘S’, chr(197).chr(189) => ‘Z’, chr(197).chr(161) => ’s’, chr(197).chr(190) => ‘z’, chr(226).chr(130).chr(172) => ‘E’);
$string = utf8_decode(strtr($string, $invalid_latin_chars));
}
$string = strtr($string, $chars[’in’], $chars[’out’]);
$double_chars[’in’] = array(chr(140), chr(156), chr(198), chr(208), chr(222), chr(223), chr(230), chr(240), chr(254));
$double_chars[’out’] = array(’OE’, ‘oe’, ‘AE’, ‘DH’, ‘TH’, ’ss’, ‘ae’, ‘dh’, ‘th’);
$string = str_replace($double_chars[’in’], $double_chars[’out’], $string);
return $string;
}
Puis vient la fonction “sanitize_title” que je n’ai pas touchée et enfin la fonction “sanitize_title_with_dashes” auquel j’ai dû rajouté une première ligne qui est justement celle qui nous intéresse puisqu’elle appelle la fonction “remove_accents”.
function sanitize_title_with_dashes($title) {
$title = remove_accents($title);
$title = strtolower($title);
$title = preg_replace(’/&.+?;/’, ”, $title); // kill entities
$title = preg_replace(’/[^a-z0-9 _-]/’, ”, $title);
$title = preg_replace(’/s+/’, ‘ ‘, $title);
$title = str_replace(’ ‘, ‘-’, $title);
$title = preg_replace(’|-+|’, ‘-’, $title);
$title = trim($title, ‘-’);
return $title;
}
Tags:
blog,
titre,
wordpress