私はタイ語でUTF-8
文字を使った投稿名を持っています。それらの多くはASCIIを超長整数にエンコードします。購入した商品を購入しました-8-他の商品を購入する
PhpMyAdminを使用して "post_name"のタイプをVARCHAR(1000)
に、照合順序をutf8_unicode_ci
に変更しました。
しかし、私のWordPressバックエンドエディタでは、URLを保存しようとすると、上記の投稿名は自動的に自動的に切り捨てられます。
文字数制限を引き上げるこのプラグインがありますが、それは私が読むことができないタイ語です。
何か案は?
投稿を保存すると、WordPressが sanitize_title
関数を呼び出してタイトルをサニタイズするために発生します。この関数はsanitize_title
フィルターを適用します。
sanitize_title
フィルターのコアフックの1つは sanitize_title_with_dashes
関数です。これは、seems_utf8
関数を呼び出してutf8形式のタイトルをチェックし、タイトルにutf8形式がある場合、関数は utf8_uri_encode
関数を呼び出します。
utf8_uri_encode
関数は、$utf8_string
と$length
の2つの引数を受け取ります。最初の引数はタイトルであり、2番目の引数は長さです。タイトルはオーバーフローしないはずです。
sanitize_title_with_dashes
関数は、200文字の制限でタイトルを渡します。したがって、制限を変更する場合は、sanitize_title
フィルターの標準フックを変更する必要があります。ここでは少し汚い解決策に取り組みますが、それはあなたを助けるはずです:
// 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;
}
ご覧のとおり、1回の変更でまったく同じsanitize_title_with_dashes
関数を使用しています。200
を渡す代わりに、1000
をタイトルの制限として渡します。