2

How to add dot(.) in post slugs?

In our blog, we are writing about websites and would like to use their exact address as slug like this:

ourdomain.com/example1.com

But dots are either removed when a post is saved, or WordPress doesn't find the post when we successfully add one.

Is there any option available?

  • Can you share more specific url – Suyash Jain Jul 5 '16 at 5:03
  • It would be better if u don't change in permalinks structure for that! Individualy changnging on certain pages would be better. And that can be done with this plugin wordpress.org/plugins/custom-permalinks This plugin will do the trick for you... You can change the url individually on pages/posts via this plugin. But keep checking for non plugin solution :) – Rishabh Jul 5 '16 at 7:28
2

WordPress runs slugs through its sanitize_title_with_dashes() filter function which replaces dots with dashes. Unfortunately the function doesn't give you any control over that or any ability to change what characters are stripped or replaced.

What we can do however is remove that filter and add our own version of it with a couple of 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;
}

The lines I edited are commented with a "WPSE-231448" - First I commented out the line which does a str_replace() and replaces dots with dashes, then I added the dot to the list of characters to NOT be replaced in the preg_replace() function below that.

Please note that I have not tested this with pagination or anything like that, it simply stops dots being stripped from slugs on the front/backend and any issues that may arise from that will need to be handled accordingly.

  • Thanks @Andy that works, but i did't remove the filter and with new filter. just '//$title = str_replace('.', '-', $title);' commented this line and modify this line '$title = preg_replace('/[^%a-z0-9 _-]/', '', $title);' to this '$title = preg_replace('/[^%a-z0-9 _\-\.]/', '', $title);' – bhv Jul 31 '16 at 4:28
  • 2
    @bhv no problem. The only issue with that approach is that your changes will be over written when you next update WordPress. – Andy Jul 31 '16 at 10:32

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.