web-dev-qa-db-fra.com

Comment ajouter un point (".") Dans post slug

Comment ajouter un point (.) dans les slugs post?

Dans notre blog, nous écrivons sur les sites Web et aimerions utiliser leur adresse exacte comme slug comme ceci:

ourdomain.com/example1.com

Mais les points sont soit supprimés lorsqu’une publication est enregistrée, soit WordPress ne la trouve pas lorsque nous en avons ajouté une.

Y a-t-il une option disponible?

2
bhv

WordPress exécute des slugs via sa fonction de filtrage sanitize_title_with_dashes() qui remplace les points par des tirets. Malheureusement, la fonction ne vous donne aucun contrôle sur cette possibilité, ni aucune possibilité de changer les personnages supprimés ou remplacés.

Ce que nous pouvons faire, cependant, est de supprimer ce filtre et d’en ajouter notre propre version avec quelques modifications:

remove_filter( 'sanitize_title', 'sanitize_title_with_dashes', 10 );
add_filter( 'sanitize_title', 'wpse231448_sanitize_title_with_dashes', 10, 3 );

function wpse231448_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, 200);
    }

    $title = strtolower($title);

    if ( 'save' == $context ) {
        // Convert nbsp, ndash and mdash to hyphens
        $title = str_replace( array( '%c2%a0', '%e2%80%93', '%e2%80%94' ), '-', $title );
        // Convert nbsp, ndash and mdash HTML entities to hyphens
        $title = str_replace( array( ' ', ' ', '–', '–', '—', '—' ), '-', $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',
            // acute accents
            '%c2%b4', '%cb%8a', '%cc%81', '%cd%81',
            // Grave accent, macron, caron
            '%cc%80', '%cc%84', '%cc%8c',
        ), '', $title );

        // Convert times to x
        $title = str_replace( '%c3%97', 'x', $title );
    }

    $title = preg_replace('/&.+?;/', '', $title); // kill entities

    // WPSE-231448: Commented out this line below to stop dots being replaced by dashes.
    //$title = str_replace('.', '-', $title);

    // WPSE-231448: Add the dot to the list of characters NOT to be stripped.
    $title = preg_replace('/[^%a-z0-9 _\-\.]/', '', $title);
    $title = preg_replace('/\s+/', '-', $title);
    $title = preg_replace('|-+|', '-', $title);
    $title = trim($title, '-');

    return $title;
}

Les lignes que j'ai modifiées sont commentées par un "WPSE-231448" - J'ai d'abord commenté la ligne qui effectue une fonction str_replace() et remplace les points par des tirets, puis j'ai ajouté le point à la liste des caractères à ne PAS remplacer dans la fonction preg_replace() située en dessous. .

Veuillez noter que je n'ai pas testé cela avec la pagination ou quoi que ce soit d'autre, cela empêche simplement les points d'être débarrassés des slugs sur le devant/l'arrière-plan et tout problème pouvant en résulter devra être traité en conséquence.

2
Andy