Seleccionar página

MySQLLos que me sigan y conozcan mi trabajo sabrán que muchas de las entradas que escribo, ya las escribí en su día en otro blog. Hoy por hoy, no están a mi nombre por motivos que no puedo controlar, y algún día espero que esto cambie. Mientras tanto, siempre que yo lo considere útil para mi página actual, seguiré publicando artículos que ya publiqué anteriormente en ese otro blog (que no citaré), dándoles un toque diferente. Es triste que se pueda pensar que estoy “plagiando” a otra página, cuando el contenido es mío… Este artículo es uno de esos casos en los que tengo que reescribir y reestructurar mi contenido para que no parezca un plagio (de mí mismo).

Vamos al caso que nos ocupa. Hoy vamos a ver una sencilla sentencia en MySQL para reemplazar cadenas. El ejemplo más claro nos lo trae una migración de WordPress, pero en realidad, este artículo no se refiere tanto a WordPress como a una técnica útil de MySQL.

Cuando hacemos una migración de WordPress cambiando la URL (por ejemplo, de un servidor de preproduccion a uno ya en producción), hay muchos registros de nuestra base de datos que se quedan con la URL antigua. Es el caso de la tabla ‘wp_posts’, concretamente del campo ‘guid’, por ejemplo. Sin duda alguna, lo mejor si este es tu caso es que utilices este plugin del que ya hablé hace un tiempo, pero eso no nos sirve para lo que intento ejemplificar aquí hoy.

Para estos casos, tenemos que ir a nuestro phpMyAdmin, seleccionar la base de datos correspondiente si no está ya seleccionada, y entrar en la pestaña SQL. Vamos a ejecutar esta sencilla consulta:

UPDATE <tabla> SET <campo> = REPLACE ( <columna>, ‘<cadena antigua>’, ‘<cadena nueva>’ )

Donde <tabla> es la tabla en la que se encuentra el campo a reemplazar, <campo> y <columna> en realidad van a ser el mismo valor en nuestro ejemplo, y <cadena antigua> es la cadena que vamos a reemplazar por <cadena nueva>. No es necesario utilizar %..% antes de las cadenas, el sistema busca las subcadenas que coincidan y las sustituye.

Por ejemplo, tenemos varias entradas en wp_posts donde el campo guid es ‘http://dominioantiguo.com/…….” y queremos cambiarlas todas a la vez, sin necesidad de ir una a una modificando manualmente en phpMyAdmin. Pues ejecutamos:

UPDATE wp_posts SET guid = REPLACE (guid, ‘dominioantiguo.com’, ‘dominionuevo.com’)

Ojito con las triples www, si no las pones en la cadena antigua no las pongas tampoco en la cadena nueva salvo que estés seguro de que la antigua no las usaba. O te puedes encontrar con que algún resultado se queda con más www de la cuenta. Lo que quiero decir es que cambies únicamente lo necesario, por ejemplo, no incluyas http:// porque al fin y al cabo eso no tiene que cambiar. Eso lo dejo a vuestro criterio.

Esta sentencia habrá modificado todas las entradas que contengan la cadena ‘dominioantiguo.com’, sustituyendo (sólo la subcadena correspondiente) por ‘dominionuevo.com’.

Por supuesto, podemos añadir una claúsula WHERE al final si necesitamos restringir los cambios a ciertos criterios. Vamos a suponer (esto es poco útil en realidad, pero nos sirve como ejemplo) que sólo queremos cambiar el campo guid del tipo “post”, no queremos modificar el de las páginas, ni el de los adjuntos, ni el de otros campos personalizados. Para esto, sabemos que la tabla “wp_posts” tiene un campo llamado “post_type”, que indica el tipo de la entrada que se guarda. Lo haremos coincidir con “post_type = post”

UPDATE wp_posts SET guid = REPLACE (guid, ‘dominioantiguo.com’, ‘dominionuevo.com’) WHERE post_type = “post”

Así, sólo modificamos el campo guid de aquellas entradas cuyo post_type sea “post”.

Y esto es todo por hoy. Es un truco bastante útil para hacer muchos cambios en una gran base de datos (cuidado con eso), con una sola sentencia SQL.