Blog sobre desarrollo WordPress en Español Desarrollo WordPress en Español
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:

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

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

 

Puede que también te interese

WordPress Hooks: Filters
WordPress Hooks: Filters
En la entrada anterior vimos lo que eran los Actions en WordPress. En esta vamos a ver el otro tipo de hook: los filters. Los…
Sidebar diferente para cada página en WordPress
Sidebar diferente para cada página en WordPress
En algunas ocasiones podemos necesitar tener un sidebar o barra lateral diferente para cada página o sección de nuestro sitio. Esto lo podemos hacer de…
Evitar la enumeración de usuarios en WordPress parte 1
Evitar la enumeración de usuarios en WordPress parte 1
La enumeración de usuarios es una vulnerabilidad que podría ser utilizada por un atacante o un usuario malicioso para intentar obtener un listado de los…
WordPress transients, opciones que expiran en el tiempo
WordPress transients, opciones que expiran en el tiempo
En la entrada anterior vimos cómo trabajar con la API de opciones de WordPress. En ésta vamos a ver qué son los transients. Los transients…