¿Cómo puedo crear enlaces permanentes con mayúsculas (letras capitales)?
¿Cómo puedo crear un enlace como este?
http://www.lifecellskin.us/Dev/About
En la parte "Using_Permalinks", la A está en mayúsculas. Pero WordPress convierte automáticamente las mayúsculas a minúsculas.
Estoy intentando migrar un sitio antiguo hecho solo con HTML a una plataforma WordPress. Algunos enlaces al sitio tienen este formato:
http://www.lifecellskin.us/About
El sitio ya está indexado en SEO. Así que no quiero perder el posicionamiento en los motores de búsqueda.
Gracias por leer esto, y espero que alguien pueda arrojar algo de luz sobre el tema...

Las URLs de las páginas se definen por los slugs, y por defecto se formatean y se convierten a minúsculas mediante la función sanitize_title_with_dashes()
. Sin embargo, esta función se llama a través de un filtro, y puedes desenganchar el filtro para que no se ejecute:
remove_filter( 'sanitize_title', 'sanitize_title_with_dashes' );
Simplemente hacer esto probablemente no sea una buena idea, ya que no eliminará los espacios y otras cosas extrañas en el slug. Te sugiero que copies la función existente, elimines la parte que la convierte a minúsculas y la vuelvas a enganchar:
add_filter( 'sanitize_title', 'wpse5029_sanitize_title_with_dashes' );
function wpse5029_sanitize_title_with_dashes($title) {
$title = strip_tags($title);
// Preservar octetos escapados.
$title = preg_replace('|%([a-fA-F0-9][a-fA-F0-9])|', '---$1---', $title);
// Eliminar signos de porcentaje que no son parte de un octeto.
$title = str_replace('%', '', $title);
// Restaurar octetos.
$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); // eliminar entidades
$title = str_replace('.', '-', $title);
// ¡Mantener también los caracteres en mayúsculas!
$title = preg_replace('/[^%a-zA-Z0-9 _-]/', '', $title);
$title = preg_replace('/\s+/', '-', $title);
$title = preg_replace('|-+|', '-', $title);
$title = trim($title, '-');
return $title;
}

solo una pregunta tonta, ¿por qué añades el prefijo wpse{cualquier número} a tus funciones?

@Horttcore: ¿wpse5029 como la pregunta #5029 de WP Stack Exchange?

@Horttcore: Efectivamente, añado el número de pregunta como prefijo a todos mis nombres de función. Para probarlas yo mismo como plugins separados, y en caso de que alguien las copie en su propio código sin cambiar: wpseNNNN
probablemente sea único.

Gracias por la información. Estoy intentando que Wordpress respete las mayúsculas incluidas en el nombre de usuario, pero no puedo.

Realmente recomendaría que mantengas las URLs en minúsculas para tu sitio, como WordPress lo hace por defecto (considero que las URLs en minúsculas son una mejor práctica de todos modos), pero que configures redirecciones 301 para todas las URLs donde tengas este problema. Generalmente termina siendo problemático intentar luchar contra una plataforma para evitar que haga lo que está diseñada para hacer, y las estructuras de URLs están muy integradas en la arquitectura de WordPress.
Escribí otra respuesta que es muy similar a lo que necesitas y ese ejemplo puede mostrarte cómo usar el hook 'template_redirect'
para configurar una redirección para esas URLs donde tengas este problema:
Si necesitas más aclaraciones, por favor pregunta.

Según tengo entendido, los motores de búsqueda no distinguen entre mayúsculas y minúsculas, aunque las URL sí son sensibles a esto. Recomendaría eliminar el formato de archivo con mayúsculas, ya que es difícil de recordar para los usuarios.
Si realmente deseas mantener la estructura anterior, necesitarás trabajar con expresiones regulares (regexp) en el archivo .htaccess.

FEB 2020
Desde la respuesta de Jan Fabry, la función de WordPress ha cambiado un poco, por lo que el fragmento de código correcto para la versión 5.6 es:
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 );
// Preservar octetos escapados.
$title = preg_replace( '|%([a-fA-F0-9][a-fA-F0-9])|', '---$1---', $title );
// Eliminar signos de porcentaje que no son parte de un octeto.
$title = str_replace( '%', '', $title );
// Restaurar octetos.
$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 ) {
// Convertir  , &ndash y &mdash a guiones.
$title = str_replace( array( '%c2%a0', '%e2%80%93', '%e2%80%94' ), '-', $title );
// Convertir entidades HTML  , &ndash y &mdash a guiones.
$title = str_replace( array( ' ', ' ', '–', '–', '—', '—' ), '-', $title );
// Convertir barra diagonal a guión.
$title = str_replace( '/', '-', $title );
// Eliminar completamente estos caracteres.
$title = str_replace(
array(
// Guiones suaves.
'%c2%ad',
// ¡ y ¿.
'%c2%a1',
'%c2%bf',
// Comillas angulares.
'%c2%ab',
'%c2%bb',
'%e2%80%b9',
'%e2%80%ba',
// Comillas curvas.
'%e2%80%98',
'%e2%80%99',
'%e2%80%9c',
'%e2%80%9d',
'%e2%80%9a',
'%e2%80%9b',
'%e2%80%9e',
'%e2%80%9f',
// Viñeta.
'%e2%80%a2',
// ©, ®, °, &hellip y &trade.
'%c2%a9',
'%c2%ae',
'%c2%b0',
'%e2%80%a6',
'%e2%84%a2',
// Acentos agudos.
'%c2%b4',
'%cb%8a',
'%cc%81',
'%cd%81',
// Acento grave, macrón, carón.
'%cc%80',
'%cc%84',
'%cc%8c',
),
'',
$title
);
// Convertir × a 'x'.
$title = str_replace( '%c3%97', 'x', $title );
}
// Eliminar entidades.
$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;
}
El editor seguirá mostrando la URL en minúsculas, pero se habrá guardado exactamente como la enviaste, sin cambiar las mayúsculas.
Nota: puede que no sea una buena idea usar este tipo de función, ya que el patrón de minúsculas es más conveniente.

Puedes probar esto. Pega el siguiente código en el archivo functions.php de tu tema. Esto funciona para mí.
// Eliminar el filtro existente
remove_filter( 'sanitize_title', 'sanitize_title_with_dashes' );
// Función para mantener las mayúsculas en los slugs
function maintain_capitalization_slug($title, $raw_title, $context) {
// Aplicar solo cuando se guardan los slugs
if ($context === 'save') {
// Preservar mayúsculas y reemplazar caracteres especiales con guiones
$title = preg_replace('/[^a-zA-Z0-9]+/', '-', $raw_title); // Reemplazar caracteres no alfanuméricos con guiones
$title = trim($title, '-'); // Eliminar guiones al inicio/final
}
return $title;
}
// Aplicar la función personalizada a 'sanitize_title'
add_filter('sanitize_title', 'maintain_capitalization_slug', 10, 3);
