El problema: Despues de migrar el contenido (en mi caso fue desde Joomla a WordPress) el enlace de los posts aparece concatenado con la entrada actual.
Viendo el contenido de la URL «midominio.com/pagina-ejemplo/ » dentro del post de esta pagina tenemos enlaces en el texto donde el link apunta a una URL relativa a «enlace-interno/categoria-4″ hasta ahi todo bien.
En el front end se nos muestra de la siguiente forma concatenado «midominio.com/pagina-ejemplo/enlace-interno/categoria-4» luego de clicar en este enlace nos redirige correctamente a la entrada pero ya nos esta generando una redireccion 301 inecesaria.
Para solucionarlo hay 2 formas.
Ya sea actualizar manualmente el enlace añadiendo / al principio por ejemplo o incluso la URL absoluta.
La otra forma es en el caso de que tengas muchos posts con este problema y deseas arreglarlo de una.
Lo que vamos a hacer es implementar una nueva funcion para nuestro functions.php
Aquí está la función que puedes utilizar para añadir el dominio actual y una barra antes del enlace, convirtiéndolo en un enlace absoluto:
add_filter('the_content', 'custom_add_domain_and_slash_to_links');
function custom_add_domain_and_slash_to_links($content) {
// Encuentra todos los enlaces relativos del contenido y añade el dominio actual y / al principio.
$content = preg_replace_callback(
'/<a\s+([^>]+)>/ims',
function ($matches) {
$href = preg_replace(
'/href="(?!http[s]?|#|mailto)([^"]+)"/',
'href="'.site_url('/').'$1"',
$matches[0]
);
return str_replace($matches[0], $href, $matches[0]);
},
$content
);
return $content;
}
En lugar de simplemente buscar por <a> tags en el HTML de los posts (como lo hace la función original), preg_replace_callback es utilizado aquí para permitir una llamada a otra función (function ($matches)…) cada vez que una etiqueta <a> coincida con nuestra expresión regular. Esto nos permite entonces modificar el código HTML en consecuencia.
Para buscar enlaces relativos en lugar de cualquier enlace HTML, utilizamos una expresión regular diferente: href=»(?!http[s]?|#|mailto)([^»]+)». Esta expresión regular encuentra aquellos hrefs que no contengan las cadenas http, https, #, o mailto.
Entonces, usamos la función preg_replace dentro de la callback de preg_replace_callback. Rogyxon preg_replace, reemplazamos el href = «…» tag con su versión completa, que incluye el dominio actual (site_url(‘/’)) y una barra antes de la ruta(verificamos que no contenga http[s],mailto o # porque los link ya deberian ser absolutos).
Y por último, simplemente reemplazamos la etiqueta <a> original con nuestra etiqueta actualizada.
Mas información sobre preg_replace_callback