{"id":224,"date":"2017-09-01T22:48:44","date_gmt":"2017-09-02T04:48:44","guid":{"rendered":"http:\/\/cloudbits.org.mx\/blog\/?p=224"},"modified":"2017-12-19T12:39:44","modified_gmt":"2017-12-19T18:39:44","slug":"reemplazar-enlaces-despues-cambio-dominio","status":"publish","type":"post","link":"https:\/\/www.cloudbits.org.mx\/blog\/2017\/09\/reemplazar-enlaces-despues-cambio-dominio\/","title":{"rendered":"Reemplazar enlaces despu\u00e9s de un cambio de dominio"},"content":{"rendered":"<p>Realizar un cambio de dominio en WordPress puede ser una pesadilla.\u00a0<strong>Todos los enlaces que tengamos que usen el nombre de dominio antiguo van a fallar<\/strong>. Y cr\u00e9eme, no quieres que eso pase.<\/p>\n<p>Seguramente pienses que no vas a cambiar nunca de nombre de dominio y que esto a ti no te afecta. Y est\u00e1s en lo cierto. Pero,\u00a0<strong>\u00bfte has planteado quiz\u00e1s usar un certificado SSL en tu web?<\/strong>\u00a0S\u00ed, me refiero a que aparezca el t\u00edpico icono del candado en el navegador junto a HTTP<strong>S<\/strong>\u00a0en vez de HTTP. Si es tu caso, vas a tener un\u00a0problema parecido, aunque habitualmente s\u00f3lo afectar\u00e1 a im\u00e1genes.<\/p>\n<p>Tanto si vas a cambiar de dominio como si vas a usar SSL, ten en cuenta que tu dominio ser\u00e1 diferente. Y es importante que sepas como reemplazar enlaces para que todo aquello que apuntaba a\u00a0<code>http:\/\/midominio.com<\/code>\u00a0ahora apunte a\u00a0<code>http:\/\/midominionuevo.com<\/code>\u00a0o\u00a0<code>http<strong>s<\/strong>:\/\/midominio.com<\/code>\u00a0(seg\u00fan sea tu caso).<\/p>\n<p>Veamos, pues, c\u00f3mo conseguir aplicar los reemplazos de forma sencilla y de varias maneras\u00a0diferentes.<\/p>\n<h2>Modificando la Base de Datos de WordPress<\/h2>\n<p>La opci\u00f3n m\u00e1s r\u00e1pida es reemplazar los enlaces directamente desde la base de datos con instrucciones SQL. Tan solo debes\u00a0utilizar la siguiente instrucci\u00f3n para aplicar las modificaciones en el contenido de tus\u00a0entradas y p\u00e1ginas:<\/p>\n<pre>UPDATE wp_posts \r\nSET post_content = \r\nREPLACE (post_content, 'http:\/\/midominio.com', 'http:\/\/midominionuevo.com');<\/pre>\n<p>Anteriormente ya te expliqu\u00e9\u00a0c\u00f3mo trabajar con\u00a0SQL\u00a0y lo \u00fatil que resulta para un mont\u00f3n de tareas relacionadas con WordPress. Aparentemente, con esto ya estar\u00eda todo, \u00bfno?\u00a0En realidad, todav\u00eda no estamos, ya que\u00a0es muy posible que haya enlaces antiguos en otros lugares de la base de datos, como por ejemplo en la columna\u00a0<code>guid<\/code>\u00a0de la tabla\u00a0<code>wp_posts<\/code>\u00a0para todas las im\u00e1genes almacenadas en nuestra Biblioteca de Medios. En tal caso, puedes\u00a0usar esta sentencia SQL:<\/p>\n<pre>UPDATE wp_posts \r\nSET guid = \r\nREPLACE (guid, 'http:\/\/midominio.com', 'http:\/\/midominionuevo.com');<\/pre>\n<p>y, a\u00fan as\u00ed, seguir\u00edamos sin tener todo actualizado. Nos estamos dejando m\u00e1s apariciones de enlaces antiguos en otros lugares, como por ejemplo en las tablas\u00a0<code>wp_options<\/code>\u00a0o\u00a0<code>wp_postmeta<\/code>\u00a0de tu base de datos WordPress. Si est\u00e1s pensando en ir aplicando las sentencias anteriores a las nuevas tablas, te recomiendo que frenes un poco y sigas leyendo.<\/p>\n<p>El problema con las tablas\u00a0<code>wp_options<\/code>\u00a0o\u00a0<code>wp_postmeta<\/code>\u00a0es que, en muchos casos,\u00a0almacenen\u00a0<strong>cadenas de texto serializadas<\/strong>.\u00a0Una cadena de texto serializada en PHP no es m\u00e1s que una forma de almacenar datos en la base de datos. Por ejemplo, podr\u00edamos tener este conjunto de datos en PHP (un\u00a0<em>array<\/em>):<\/p>\n<pre>array (\r\n 'dominio' =&gt; 'http:\/\/midominio.com',\r\n 'usuario' =&gt; 'avillegasn',\r\n 'edad' =&gt; 30\r\n);<\/pre>\n<p>Si lo guardamos en la base de datos serializado, el resultado es el siguiente:<\/p>\n<pre>a:3:{s:7:\"dominio\";s:20:\"http:\/\/midominio.com\";s:7:\"usuario\";s:10:\"avillegasn\";s:4:\"edad\";i:30;}<\/pre>\n<p>Si miras el resultado anterior con detalle, ver\u00e1s que\u00a0<strong>los n\u00fameros que aparecen delante de los valores indican la longitud en caracteres<\/strong>\u00a0(de hecho, en\u00a0<em>bytes<\/em>) del valor. Para este caso, si guardamos\u00a0<code>http:\/\/midominio.com<\/code>, autom\u00e1ticamente se indica con un\u00a0<strong>20<\/strong>\u00a0que la longitud (en este caso, el n\u00famero de letras)\u00a0es esa. Por lo que si directamente hacemos el reemplazo por\u00a0<code>http:\/\/minuevodominio.com<\/code>, tendremos:<\/p>\n<pre>a:3:{s:7:\"dominio\";s:20:\"http:\/\/minuevodominio.com\";s:7:\"usuario\";s:10:\"avillegasn\";s:4:\"edad\";i:30;}<\/pre>\n<p>Pero claro,\u00a0<code>http:\/\/minuevodominio.com<\/code>\u00a0no tiene 20 letras, sino 25.\u00a0<strong>Cuando WordPress intente \u201cdeserializar\u201d este valor, fallar\u00e1 estrepitosamente<\/strong>. Y no queremos que esto pase.<\/p>\n<p>Por tanto, parece que utilizar SQL no es lo m\u00e1s recomendable para modificar todos los enlaces. Afortunadamente, hay\u00a0m\u00e1s opciones.<\/p>\n<h2>Usando un Script PHP<\/h2>\n<p>Una opci\u00f3n m\u00e1s sencilla que ir directamente a toquetear la base de datos es\u00a0<strong>usar un script PHP que realice las labores por nosotros<\/strong>. Si eres un crack del PHP es posible que seas capaz de programar el script tu mismo; \u00a1enhorabuena por ello!\u00a0\ud83d\ude00\u00a0Pero sino, puedes usar\u00a0este script de interconnect\/it\u00a0que funciona tanto para WordPress como para Drupal.<\/p>\n<figure id=\"attachment_1937\" class=\"wp-caption alignnone\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-1937\" src=\"https:\/\/i0.wp.com\/neliosoftware.com\/es\/wp-content\/uploads\/sites\/3\/2016\/03\/interconnectit-script.png?resize=640%2C1196&#038;ssl=1\" alt=\"Script de interconnect\/it para buscar y reemplazar, teniendo en cuenta cadenas serializadas.\" width=\"640\" height=\"1196\" \/><figcaption class=\"wp-caption-text\">Captura del script de interconnect\/it para buscar y reemplazar, teniendo en cuenta cadenas serializadas.<\/figcaption><\/figure>\n<p>Lo bueno de este script es que\u00a0<strong>s\u00f3lo lo tienes que subir a la ra\u00edz de tu instalaci\u00f3n WordPress<\/strong>\u00a0(mediante FTP, por ejemplo) y acceder a \u00e9l desde el navegador. Se te abrir\u00e1 una interfaz como la que puedes ver en la captura anterior, d\u00f3nde tendr\u00e1s que indicar los datos de acceso a tu base de datos para que el script pueda acceder a ella.<\/p>\n<p>A partir de ese momento, puedes usar el formulario para buscar y reemplazar valores de forma sencilla, tal y como har\u00edas en cualquier editor de texto habitual.\u00a0No obstante,\u00a0<strong>recuerda hacer una\u00a0copia de seguridad\u00a0de tu base de datos<\/strong>\u00a0para evitar posibles problemas.<\/p>\n<h2>Plugins de B\u00fasqueda y Reemplazo<\/h2>\n<p>Por \u00faltimo, aqu\u00ed te\u00a0dejo 4 plugins para realizar reemplazos en tus\u00a0contenidos, los cuales tienen en cuenta los valores serializados y hacen la b\u00fasqueda en todas las tablas de la base de datos. Adem\u00e1s, no necesitas nada m\u00e1s que instalarlos y activarlos como cualquier otro plugin. As\u00ed de f\u00e1cil.<\/p>\n<h3>Better Search Replace<\/h3>\n<figure id=\"attachment_1939\" class=\"wp-caption alignnone\"><a href=\"https:\/\/wordpress.org\/plugins\/better-search-replace\/\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"wp-image-1939 size-full\" src=\"https:\/\/i0.wp.com\/neliosoftware.com\/es\/wp-content\/uploads\/sites\/3\/2016\/03\/Captura-de-pantalla-2016-03-22-a-las-9.07.14.png?resize=640%2C207&#038;ssl=1\" alt=\"Better Search Replace\" width=\"640\" height=\"207\" \/><\/a><figcaption class=\"wp-caption-text\">Better Search Replace<\/figcaption><\/figure>\n<p>Este plugin nos permite buscar y reemplazar\u00a0<strong>cualquier contenido<\/strong>. Tiene en cuenta valores serializados y adem\u00e1s permite hacer una simulaci\u00f3n para saber cuantas apariciones va a sustituir antes de realmente hacer los reemplazos. De esta manera podemos tener un poco m\u00e1s de idea sobre el impacto que los cambios van a tener.<\/p>\n<p>No es el m\u00e1s popular, pero est\u00e1 traducido al espa\u00f1ol, lo que es un plus.<\/p>\n<h3>Search &amp; Replace<\/h3>\n<figure id=\"attachment_1940\" class=\"wp-caption alignnone\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-1940\" src=\"https:\/\/i0.wp.com\/neliosoftware.com\/es\/wp-content\/uploads\/sites\/3\/2016\/03\/Captura-de-pantalla-2016-03-22-a-las-9.07.27.png?resize=640%2C206&#038;ssl=1\" alt=\"Search &amp; Replace\" width=\"640\" height=\"206\" \/><figcaption class=\"wp-caption-text\">Search &amp; Replace<\/figcaption><\/figure>\n<p>Un plugin muy parecido al anterior, para buscar y reemplazar contenidos en general. Lo bueno de este es que aparentemente\u00a0<strong>permite hacer copia de seguridad<\/strong>\u00a0de la base de datos. Adem\u00e1s, su interfaz es muy sencilla. S\u00f3lo hay que seleccionar en qu\u00e9 tablas queremos realizar la b\u00fasqueda y listo. Una opci\u00f3n interesante y con buena puntuaci\u00f3n en el directorio de plugins de WordPress.<\/p>\n<h3>Velvet Blues Update URLs<\/h3>\n<figure id=\"attachment_1942\" class=\"wp-caption alignnone\"><a href=\"https:\/\/es.wordpress.org\/plugins\/velvet-blues-update-urls\/\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"wp-image-1942 size-full\" src=\"https:\/\/i0.wp.com\/neliosoftware.com\/es\/wp-content\/uploads\/sites\/3\/2016\/03\/Captura-de-pantalla-2016-03-22-a-las-9.07.55.png?resize=640%2C207&#038;ssl=1\" alt=\"Velvet Blues Update URLs\" width=\"640\" height=\"207\" \/><\/a><figcaption class=\"wp-caption-text\">Velvet Blues Update URLs<\/figcaption><\/figure>\n<p>Es el plugin que yo suelo utilizar, sobretodo por ser\u00a0<strong>de los m\u00e1s antiguos<\/strong>\u00a0y adem\u00e1s seguir recibiendo actualizaciones de vez en cuando. Es espec\u00edfico para modificar enlaces, ya que s\u00f3lo debes decirle cual es la direcci\u00f3n web antigua y la nueva, y d\u00f3nde quieres que haga la b\u00fasqueda (habitualmente, con marcar todas las opciones que ofrece es suficiente).<\/p>\n<p>Como resultado nos indica el n\u00famero de sustituciones que ha hecho. Para m\u00ed, de los mejores para esta labor, y el que m\u00e1s descargas e instalaciones activas tiene (casi 700.000 y m\u00e1s de 200.000, respectivamente).<\/p>\n<h3>WP Migrate DB<\/h3>\n<figure id=\"attachment_1941\" class=\"wp-caption alignnone\"><a href=\"https:\/\/es.wordpress.org\/plugins\/wp-migrate-db\/\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"wp-image-1941 size-full\" src=\"https:\/\/i0.wp.com\/neliosoftware.com\/es\/wp-content\/uploads\/sites\/3\/2016\/03\/Captura-de-pantalla-2016-03-22-a-las-9.07.43.png?resize=640%2C206&#038;ssl=1\" alt=\"WP Migrate DB\" width=\"640\" height=\"206\" \/><\/a><figcaption class=\"wp-caption-text\">WP Migrate DB<\/figcaption><\/figure>\n<p>Aunque este plugin se suele usar para\u00a0<strong>hacer migraciones de webs en WordPress<\/strong>, tambi\u00e9n incluye la opci\u00f3n de buscar y reemplazar contenidos. Por tanto, si alguna vez lo has usado o ya est\u00e1s familiarizado con \u00e9l, ser\u00e1 una opci\u00f3n a tener en cuenta cuando tengas que hacer un cambio de dominio. M\u00e1s de 500.000 descargas y 100.000 instalaciones activas lo avalan.<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Realizar un cambio de dominio en WordPress puede ser una pesadilla.\u00a0Todos los enlaces que tengamos que usen el nombre de dominio antiguo van a fallar. Y cr\u00e9eme, no quieres que eso pase. Seguramente pienses que no vas a cambiar nunca de nombre de dominio y que esto a ti no te afecta. Y est\u00e1s en lo cierto. Pero,\u00a0\u00bfte has planteado quiz\u00e1s usar un certificado SSL en tu web?\u00a0S\u00ed, me refiero a que aparezca el t\u00edpico icono del candado en el navegador junto a HTTPS\u00a0en vez de HTTP. Si es tu&hellip;<!-- AddThis Advanced Settings generic via filter on wp_trim_excerpt --><!-- AddThis Share Buttons generic via filter on wp_trim_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":48837,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[37],"tags":[],"class_list":["post-224","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-desarrollo-web"],"aioseo_notices":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/www.cloudbits.org.mx\/blog\/wp-content\/uploads\/2017\/09\/Changing-Your-Domain-min.jpg?fit=800%2C418&ssl=1","jetpack_shortlink":"https:\/\/wp.me\/p90Gx9-3C","jetpack-related-posts":[],"jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/www.cloudbits.org.mx\/blog\/wp-json\/wp\/v2\/posts\/224","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.cloudbits.org.mx\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.cloudbits.org.mx\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.cloudbits.org.mx\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.cloudbits.org.mx\/blog\/wp-json\/wp\/v2\/comments?post=224"}],"version-history":[{"count":0,"href":"https:\/\/www.cloudbits.org.mx\/blog\/wp-json\/wp\/v2\/posts\/224\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.cloudbits.org.mx\/blog\/wp-json\/wp\/v2\/media\/48837"}],"wp:attachment":[{"href":"https:\/\/www.cloudbits.org.mx\/blog\/wp-json\/wp\/v2\/media?parent=224"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.cloudbits.org.mx\/blog\/wp-json\/wp\/v2\/categories?post=224"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.cloudbits.org.mx\/blog\/wp-json\/wp\/v2\/tags?post=224"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}