Actualizar BUG enlaces concatenados WordPress

Actualizar BUG enlaces concatenados WordPress

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.

Veamos el ejemplo del problema con los enalces concatenados

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.

actualizar todos los enalces de wordpress

Como actualizar y solucionar los enlaces concatenados

Para solucionarlo hay 2 formas.

Opción 1

Ya sea actualizar manualmente el enlace añadiendo / al principio por ejemplo o incluso la URL absoluta.

Opcion 2

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

Explico lo que hace:

En lugar de simplemente buscar por 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 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 original con nuestra etiqueta actualizada.

Mas información sobre preg_replace_callback