Recientemente he tenido que desactivar y desinstalar en un sitio WordPress el plugin pdf-viewer, ya que está fuera de desarrollo y tiene vulnerabilidades que pueden ser explotadas para infectar el sitio WordPress. Lo he sustituido por el plugin PDF.js Viewer que hace exactamente lo mismo.
El plugin con vulnerabiliades usaba el sortcode [pdfviwer]
para incluir un visor PDF en el contenido de un post; el sustituto usa el shortcode [pdfjs-viewer]
. La sintaxis de ambos plugins es ligeramente diferente.
La sustitución del plugin implicaba sustituir todos los antiguos shortcodes por el nuevo. Para no hacer esto a mano he recurrido a la interfaz de línea de comandos de WordPress, WP-CLI. Se puede usar el comando search-replace con expresiones regulares. A continuación los pasos que he seguido.
Hacer una copia de seguridad de la base de datos
Antes de hacer modificaciones automatizadas, copia de seguridad para poder restaurar inmediatamente si algo va mal:
wp db export backup.base.de.datos.sql
Probar la expresión de sustitución con --dry-run
Antes de hacer las sustituciones es importante lanzar el comando de wp-cli con el modificador --dry-run
para probarlo sin riesgo.
wp search-replace '\[pdfviewer width="[^"]*" height="([^"]*)"[^\]]*"\]([^\[]*)\[/pdfviewer\]' '[pdfjs-viewer url=\2 viewer_height=\1]' wp_posts --include-columns=post_content --regex --regex-delimiter=# --dry-run
Cosas a tener en cuenta sobre las expresiones regulares de search-replace:
- search-replace usa el motor
preg_replace()
de PHP. - El modificador
--regex-delimiter
define el carácter delimitador de la expresión regular. Si se define en el comando no hay que incluirlo en la expresión, WP-CLI lo añade después. - Una búsqueda con sustitución usando regex tarda entre 15 y 20 veces más que una búsqueda sin expresiones regulares. Es una buena idea limitar la búsqueda en base de datos por tablas y columnas si es posible. Si no es posible, se puede hacer al menos al lanzar las pruebas con
--dry-run
.
Lanzar el comando definitivo y borrar cachés
Una vez que se ha comprobado que el comando hace lo que queremos, se puede lanzar sin --dry-run
:
wp search-replace '\[pdfviewer width="[^"]*" height="([^"]*)"[^\]]*"\]([^\[]*)\[/pdfviewer\]' '[pdfjs-viewer url=\2 viewer_height=\1]' wp_posts --include-columns=post_content --regex --regex-delimiter=#
Antes de comprobar que todo ha ido bien, borrar todos los cachés. En mi caso, el caché de objetos que usa la web también tiene interfaz WP-CLI:
wp cache flush
Restaurar la copia de la base de datos si algo salió mal
Si algo no fue bien y no es reparable, siempre se puede restaurar la copia de base de datos que hicimos:
wp db import backup.base.de.datos.sql
Y en cualquier caso, si la copia se guardó en una ubicación públicamente accesible, es importante eliminarla o moverla a una ubicación segura.