WP-CLI

WP-CLI Parte 6, search replace, un comando imprescindible

Llegamos a la sexta entrada en la serie de WP-CLI. Esta vez para hablar sobre el comando wp search-replace, bajo mi punto de vista uno de los más útiles y que personalmente uso más a menudo.

Éste comando se utiliza para buscar una cadena en base de datos y reemplazarla por otra. Muy útil cuando por ejemplo tienes que realizar una migración de dominio, o modificar el nombre de un post_type.

Su uso es muy sencillo, pero hay que extremar la precaución cuando vayamos a ejecutar este comando. Es muy fácil cometer un error y podemos echar nuestra web abajo. Por lo tanto, antes de hacer cualquier modificación es recomendable hacer una copia de seguridad de la base de datos.

Además, wp search-replace interpreta los datos serializados, y hace los reemplazos de manera inteligente, sin romper nada.

Éste comando acepta los siguientes parámetros:

  • <old>, la cadena que vamos a buscar en la base de datos.
  • <new>, la cadena que va a reemplazar a la cadena <old> que estamos buscando.
  • [<table>…], lista de tablas sobre las que restringir los reemplazos. Soporta Wildcards, ejemplo: ‘wp_*options’ or ‘wp_post*’.
  • [--dry-run], ejecuta el comando, pero simplemente muestra en pantalla el resultado, sin guardar los cambios en base de datos. Es importante la primera vez siempre ejecutar este comando en modo dry run, para evaluar los cambios antes de que se produzcan.
  • [--network], hace la búsqueda y reemplazo en todas las tablas registradas en $wpdb en instalaciones multisite.
  • [--all-tables-with-prefix], habilita la búsqueda y reemplazo en todas las tables con el prefijo, incluso aunque no estén registradas en $wpdb.
  • [--all-tables], habilita la búsqueda y reemplazo en todas las tablas de la base de datos, incluso aunque no estén registradas en $wpdb.
  • [--export[=<file>]], escribe los datos transformados a un archivo SQL en lugar de guardar los reemplazos en la base de datos.
  • [--export_insert_size=<rows>], para definir el número de filas en una sola instrucción INSERT al realizar la exportación de SQL. Por defecto 50.
  • [--skip-columns=<columns>], para no realizar la búsqueda y reemplazo en columnas específicas. Se pueden establecer múltiples columnas separadas por coma.
  • [--include-columns=<columns>], para realizar la búsqueda y reemplazo en columnas específicas. Se pueden establecer múltiples columnas separadas por coma.
  • [--precise], fuerza el uso de PHP en lugar de SQL, que es más completo pero más lento
  • [--verbose], va imprimiendo en caliente las filas de las tablas que está chequeando el script.
  • [--regex], para lanzar la búsqueda utilizando una expresión regular con delimitadores. Si se utiliza una expresión regular el tiempo de ejecución del script puede multiplicarse por 15 ó 20.
  • [--regex-flags=<regex-flags>], para establecer modificadores en la expresión regular, por ejemplo «i», para insensibilidad a mayúsculas y minúsculas.
  • [--format=<format>], para imprimir la salida en un formato particular: table (por defecto), count (únicamente el número de reemplazos)

El ejemplo más típico es el de hacer una migración de dominio. Ya sea una migración real, o un cambio de http a https, o simplemente estamos instalando un proyecto en local y queremos cambiar el nombre de dominio para identificarlo mejor:

wp search-replace 'midominio.com' 'midominio.dev' --dry-run

Al hacer un dry-run, simplemente nos mostrará en pantalla dónde ha encontrado coincidencias y el número de las mismas, pero sin efectuar cambio alguno en base de datos. Para que tenga efecto, simplemente tendremos que ejecutar el mismo comando pero quitando --dry-run.

Puedes localizar la búsqueda y reemplazo de cadenas en determinadas tablas de la base de datos. Por ejemplo, si sabes que el reemplazo sólo lo quieres hacer en la información de tus usuarios, puedes lanzar el comando wp search-replace indicando las tablas wp_users y wp_usermeta:

wp search-replace 'foo' 'bar' wp_users wp_usermeta
wp search replace

Antes mencionaba lo sencillo que es utilizar este comando. La probabilidad de romper algo es directamente proporcional a su facilidad de uso. Por esta razón es mejor pensar dos veces, y ejecutar una.

Ten en cuenta que una cadena concreta puede ser parte de una cadena más grande, y se efectuaría el reemplazo igualmente. O si vas a cambiar el nombre de un post_type, por ejemplo producto por articulo, ten en cuenta que si en una entrada utilizas la palabra producto, será reemplazada por artículo. O si tienes un enlace a una URL del tipo https://otrodominio.com/producto.html, será reemplazada por http://otrodominio.com/articulo.html y se romperá el enlace.

Keep Calm & search replace

¿Te ha resultado útil esta información? 🍺

Si este post te ha resuelto un problema, invítame a un café o a una cerveza. Con este pequeño gesto me animas a seguir escribiendo.

Comentarios

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *:

  • El fin del tratamiento es únicamente la moderación de comentarios para evitar spam
  • La legitimación es tu consentimiento al comentar
  • No se comunicará ningún dato a terceros salvo por obligación legal
  • Tienes derecho al acceso, rectificación y eliminación de los comentarios