如何增加200个帖子名的字符限制?

时间:2013-03-07 作者:ericn

我有泰语的帖子名,使用UTF-8 性格其中许多编码为ASCII格式的超长码,例如:。วิธีการหลีกเลี่ยงข้อผิดพลาดทั้ง-8个-ในชีวิตการแต่งงาน

我已使用phpMyAdmin将“post\\u name”的类型更改为VARCHAR(1000) 和排序规则utf8_unicode_ci.

然而,在我的WordPress后端编辑器中,上面的帖子名称仍然会自动剪切为วิธีการหลีกเลี่ยงข้อผิ 当我试图保存URL时。

有一个插件提高了字符限制,但它是泰语的,我看不懂。

有什么想法吗?

1 个回复
最合适的回答,由SO网友:Eugene Manuilov 整理而成

这是因为当你保存帖子时,WordPress会打电话给你sanitize_title 函数来清理标题。此功能适用sanitize_title 滤器

一个用于sanitize_title 筛选器为sanitize_title_with_dashes 函数,该函数通过调用seems_utf8 函数,如果标题具有utf8格式,则函数调用utf8_uri_encode 作用

utf8_uri_encode 函数接收两个参数:$utf8_string$length. 第一个参数是标题,第二个参数是长度,标题不应溢出。

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;
}
正如你所看到的,我们使用完全相同的sanitize_title_with_dashes 一次更改的函数:而不是传递200, 我们通过了1000 作为所有权的限制。

结束

相关推荐

Can't match title in database

这很令人困惑,希望有人能帮助我。下面是我用来查看wp\\u posts表中是否存在标题的一些代码$mypostids = $wpdb->get_results(\"select ID from $wpdb->posts where post_title=\'$thisTitle\'\"); if(!empty($mypostids)){ echo $thisTitle.\' already exists\'; }else{ echo $t