web-dev-qa-db-de.com

Wie erhöht man das Zeichenlimit für den Postnamen von 200?

Ich habe einen Postnamen in Thai, der das Zeichen UTF-8 verwendet. Viele von ihnen codieren in ASCII, z. วิธี -ร หลีก เลี่ยง ข้อ ผิด ผิด ทั้ง -8- ใน ชีวิต การ แต่งงาน

Ich habe den Typ von "post_name" mit phpMyAdmin in VARCHAR(1000) und die Sortierung in utf8_unicode_ci geändert.

In meinem WordPress-Backend-Editor wird der oben genannte Beitragsname jedoch immer noch automatisch auf "กา การ หลีก เลี่ยง ข้อ" gekürzt, wenn ich versuche, die URL zu speichern.

Es gibt dieses Plugin, das die Zeichenbeschränkung aufhebt, aber es ist in Thai, das ich nicht lesen kann.

Irgendwelche Ideen?

2
ericn

Es kommt vor, dass WordPress beim Speichern eines Beitrags die Funktion sanitize_title aufruft, um Ihren Titel zu bereinigen. Diese Funktion wendet den sanitize_title-Filter an.

Einer der zentralen Haken für den sanitize_title-Filter ist sanitize_title_with_dashes function, der den Titel im utf8-Format prüft, indem er die Funktion seems_utf8 aufruft. Wenn der Titel das utf8-Format hat, rufen Sie die Funktion utf8_uri_encode function auf.

Die Funktion utf8_uri_encode empfängt zwei Argumente: $utf8_string und $length. Der erste ist Ihr Titel und das zweite Argument ist die Länge, über die der Titel nicht hinauslaufen soll.

Die Funktion sanitize_title_with_dashes übergibt Ihren Titel mit einer Länge von maximal 200 Zeichen. Wenn Sie also das Limit ändern möchten, müssen Sie den Standard-Hook für den sanitize_title-Filter ändern. Hier kommen wir zu einer etwas schmutzigen Lösung, die Ihnen jedoch helfen sollte:

// 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;
}

Wie Sie sehen, verwenden wir mit einer Änderung dieselbe sanitize_title_with_dashes-Funktion: Anstatt 200 zu übergeben, übergeben wir 1000 als Titelbegrenzung.

5
Eugene Manuilov