¿Cómo puedo crear enlaces permanentes con mayúsculas (letras capitales)?

8 dic 2010, 08:27:09
Vistas: 17.6K
Votos: 8

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

0
Todas las respuestas a la pregunta 6
7

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;
}
8 dic 2010 10:01:44
Comentarios

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

Horttcore Horttcore
8 dic 2010 10:20:05

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

Denis de Bernardy Denis de Bernardy
8 dic 2010 11:23:19

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

Jan Fabry Jan Fabry
8 dic 2010 14:51:45

Ah, eso tiene sentido para mí :-)

Horttcore Horttcore
8 dic 2010 16:12:58

¡Qué genial! +1 por el prefijo inteligente.

kaiser kaiser
28 mar 2011 17:06:50

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

Mario Torres Mario Torres
14 feb 2021 20:36:27

@MarioTorres no publiques respuestas como soluciones, lo convertí en un comentario, pero no estoy seguro si esta era la respuesta a la que estabas respondiendo. Si tienes una nueva pregunta, deberías usar el botón de hacer una pregunta en la parte superior

Tom J Nowell Tom J Nowell
14 feb 2021 21:18:35
Mostrar los 2 comentarios restantes
0

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.

8 dic 2010 10:54:10
0

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.

8 dic 2010 09:15:14
0

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 &nbsp, &ndash y &mdash a guiones.
        $title = str_replace( array( '%c2%a0', '%e2%80%93', '%e2%80%94' ), '-', $title );
        // Convertir entidades HTML &nbsp, &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',
                // &iexcl y &iquest.
                '%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',
                // &copy, &reg, &deg, &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 &times 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.

2 feb 2021 18:04:58
0

Lo hice directamente en la tabla de MySQL y funciona bien: Descripción de la imagen aquí

23 jul 2020 00:48:18
0

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);
30 abr 2024 04:08:34