admin管理员组

文章数量:1122846

How can I make a link like this?

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:

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...

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...

Share Improve this question edited Jan 11, 2011 at 7:36 Jan Fabry 30.5k4 gold badges90 silver badges136 bronze badges asked Dec 8, 2010 at 6:27 shalushalu 4693 gold badges7 silver badges14 bronze badges
Add a comment  | 

6 Answers 6

Reset to default 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;
}

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:

  • Creating 301 Redirects for Post, Page, Category and Image URLs?

If you'd like more clarification, please ask.

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.

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.

I do this directly on mysql table and works fine:

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);

本文标签: How can I make Capital letter ( uppercase ) permalinks