8

How can I make a link like this?

http://www.lifecellskin.us/Dev/About

the "Using_Permalinks" part, A is Capital letters. But WP automatically convert upper case to lower case.

I'm trying to convert an old site that made by only html to a WP platform site. Some links to the site look like this:

http://www.lifecellskin.us/About

The site is already indexed by SEO. so I don't want to lose SE rankings.

Thanks for reading this, and hope somebody will be able to shed some light on it...

6 Answers 6

9

The page URLs are defined by the slugs, and by default they are formatted and lower-cased by the function sanitize_title_with_dashes(). However, this function is called via a filter, and you can unhook the filter so it doesn't get called:

remove_filter( 'sanitize_title', 'sanitize_title_with_dashes' );

Just doing this is probably not a good idea, as it will not remove the spaces and other weird stuff in the slug. I suggest you copy the existing function, remove the part that lowercases it, and hook it up again:

add_filter( 'sanitize_title', 'wpse5029_sanitize_title_with_dashes' );
function wpse5029_sanitize_title_with_dashes($title) {
    $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);

    $title = remove_accents($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);
    $title = preg_replace('/&.+?;/', '', $title); // kill entities
    $title = str_replace('.', '-', $title);
    // Keep upper-case chars too!
    $title = preg_replace('/[^%a-zA-Z0-9 _-]/', '', $title);
    $title = preg_replace('/\s+/', '-', $title);
    $title = preg_replace('|-+|', '-', $title);
    $title = trim($title, '-');

    return $title;
}
7
  • just a stupid question, why do you prefix wpse{anynumber} to your functions?
    – Horttcore
    Commented Dec 8, 2010 at 8:20
  • 2
    @Horttcore: wpse5029 like WP Stack Exchange question #5029? Commented Dec 8, 2010 at 9:23
  • 4
    @Horttcore: Indeed, I prefix all my function names with the question number. To try them myself as separate plugins, and in case somebody copies them in their own code without changing: wpseNNNN is probably unique.
    – Jan Fabry
    Commented Dec 8, 2010 at 12:51
  • Ah that makes sense to me :-)
    – Horttcore
    Commented Dec 8, 2010 at 14:12
  • 1
    That's kool! +1 for the smart prefix.
    – kaiser
    Commented Mar 28, 2011 at 14:06
7

I'd really recommend that you stick with the lowercase URLs for your site that WordPress uses (I consider that lowercase URLs are a best practice anyway) but that you set up 301 redirects for all the URLs for which you have this problem. I find it usually ends with pain when you try to fight a platform to keep it from doing what it wants to do, and URLs structures are really baked into WordPress' architecture.

I wrote another answer which is very similar to your needs and that example can show you how to use the 'template_redirect' hook to set up a redirect for those URLs here you have this problem:

If you'd like more clarification, please ask.

0
1

As far as I figure, search engines are not case specific, although URL's are case sensitive. I would recommend getting rid of the capitalized file format, as it is hard for users to remember.

If you really want to stick to the previous structure, you will need to work with regexp (regular expressions) in .htaccess file.

0
1

FEV 2020

Since Jan Fabry anwser, the Wordpress function changed a little bit, so, the correct snippet to version 5.6 is:

add_filter( 'sanitize_title', 'wpse5029_sanitize_title_with_dashes', 10, 3 );
function wpse5029_sanitize_title_with_dashes($title, $raw_title, $context = 'display') {

    $title = strip_tags( $raw_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 ) ) {
        $title = utf8_uri_encode( utf8_encode($title), 200 );
    }
    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 );
        // Convert forward slash to hyphen.
        $title = str_replace( '/', '-', $title );

        // Strip these characters entirely.
        $title = str_replace(
            array(
                // Soft hyphens.
                '%c2%ad',
                // &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',
                // Bullet.
                '%e2%80%a2',
                // &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 );
    }
    // Kill entities.
    $title = preg_replace( '/&.+?;/', '', $title );
    $title = str_replace( '.', '-', $title );
    
    $title = preg_replace( '/[^%a-zA-Z0-9 _-]/', '', $title );
    $title = preg_replace( '/\s+/', '-', $title );
    $title = preg_replace( '|-+|', '-', $title );
    $title = trim( $title, '-' );
    
    return $title;
}

The editor will keep showing the lowercase URL, but it will have saved exactly as you sent, without changing the capitalization.

Obs: it might not be a good idea to use this type of function, since the lowercase pattern is more convenient.

0

I do this directly on mysql table and works fine: enter image description here

0

You can try this. Paste this below code in your function.php theme file. This is working for me.

// Remove existing filter
remove_filter( 'sanitize_title', 'sanitize_title_with_dashes' );

// Function to maintain capitalization in slugs
function maintain_capitalization_slug($title, $raw_title, $context) {
// Apply only when saving slugs
if ($context === 'save') {
    // Preserve capitalization and replace special characters with hyphens
    $title = preg_replace('/[^a-zA-Z0-9]+/', '-', $raw_title); // Replace non-alphanumeric characters with hyphens
    $title = trim($title, '-'); // Trim leading/trailing hyphens
}
return $title;
}

// Apply the custom function to 'sanitize_title'
add_filter('sanitize_title', 'maintain_capitalization_slug', 10, 3);

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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