J'ai un nom de poste en thaïlandais qui utilise le caractère UTF-8
. Beaucoup d’entre eux s’encodent en super long dans ASCII par exemple. หลีก -8- ชีวิต การ แต่งงาน
J'ai changé le type de "post_name" en utilisant phpMyAdmin en VARCHAR(1000)
et le classement en utf8_unicode_ci
.
Cependant, dans mon éditeur de back-end WordPress, le nom de post ci-dessus est toujours automatiquement coupé en หลีก เลี่ยง ข้อ ผิ lorsque j'essaie d'enregistrer l'URL.
Il y a ce plugin qui élève la limite de caractères mais c'est en thaï que je ne peux pas lire.
Des idées?
Cela se produit parce que lorsque vous enregistrez une publication, WordPress appelle sanitize_title
fonction pour assainir votre titre. Cette fonction applique le filtre sanitize_title
.
L'un des principaux raccords pour le filtre sanitize_title
est sanitize_title_with_dashes
function, qui vérifie le titre au format utf8 en appelant la fonction seems_utf8
et, si le titre est au format utf8, l'appel de fonction utf8_uri_encode
fonction.
La fonction utf8_uri_encode
reçoit deux arguments: $utf8_string
et $length
. Le premier est votre titre et le second argument est la longueur, que le titre ne doit pas dépasser.
La fonction sanitize_title_with_dashes
transmet votre titre avec une limite de 200 caractères. Donc, si vous voulez changer la limite, vous devez changer le hook standard pour le filtre sanitize_title
. Nous arrivons ici à une solution un peu sale, mais elle devrait toutefois vous aider:
// first of all lets remove standard hook
remove_filter( 'sanitize_title', 'sanitize_title_with_dashes' );
// add our custom hook
add_filter( 'sanitize_title', 'wpse8170_sanitize_title_with_dashes', 10, 3 );
function wpse8170_sanitize_title_with_dashes( $title, $raw_title = '', $context = 'display' ) {
$title = strip_tags($title);
// Preserve escaped octets.
$title = preg_replace('|%([a-fA-F0-9][a-fA-F0-9])|', '---$1---', $title);
// Remove percent signs that are not part of an octet.
$title = str_replace('%', '', $title);
// Restore octets.
$title = preg_replace('|---([a-fA-F0-9][a-fA-F0-9])---|', '%$1', $title);
if (seems_utf8($title)) {
if (function_exists('mb_strtolower')) {
$title = mb_strtolower($title, 'UTF-8');
}
$title = utf8_uri_encode($title, 1000); // <--- here is the trick!
}
$title = strtolower($title);
$title = preg_replace('/&.+?;/', '', $title); // kill entities
$title = str_replace('.', '-', $title);
if ( 'save' == $context ) {
// Convert nbsp, ndash and mdash to hyphens
$title = str_replace( array( '%c2%a0', '%e2%80%93', '%e2%80%94' ), '-', $title );
// Strip these characters entirely
$title = str_replace( array(
// iexcl and iquest
'%c2%a1', '%c2%bf',
// angle quotes
'%c2%ab', '%c2%bb', '%e2%80%b9', '%e2%80%ba',
// curly quotes
'%e2%80%98', '%e2%80%99', '%e2%80%9c', '%e2%80%9d',
'%e2%80%9a', '%e2%80%9b', '%e2%80%9e', '%e2%80%9f',
// copy, reg, deg, hellip and trade
'%c2%a9', '%c2%ae', '%c2%b0', '%e2%80%a6', '%e2%84%a2',
// Grave accent, acute accent, macron, caron
'%cc%80', '%cc%81', '%cc%84', '%cc%8c',
), '', $title );
// Convert times to x
$title = str_replace( '%c3%97', 'x', $title );
}
$title = preg_replace('/[^%a-z0-9 _-]/', '', $title);
$title = preg_replace('/\s+/', '-', $title);
$title = preg_replace('|-+|', '-', $title);
$title = trim($title, '-');
return $title;
}
Comme vous pouvez le constater, nous utilisons complètement la même fonction sanitize_title_with_dashes
avec une modification: au lieu de transmettre 200
, nous passons 1000
en tant que limite pour le titre.