No podemos negar que desde que aparecieron las primeras versiones de WordPress, la gestión y actualización de este CMS ha mejorado muchísimo y cada vez nos hacen la vida más fácil: simplemente dándole a un botón podemos actualizar temas, complementos y el propio WordPress.
Pero, ¿y si tenemos más de un blog con WordPress en nuestro servidor? Pues llega un momento en que las tareas administrativas de los diferentes blogs se pueden hacer realmente pesadas.
¿Hay algún modo de hacernos la vida más sencilla? Sí. Podemos controlar las actualizaciones y toda la gestión de este CMS desde la línea de comandos, es decir, necesitamos acceso SSH a nuestro servidor.
Los servidores VPS y dedicados proporcionan este tipo de acceso y los compartidos también deberían hacerlo.
Bien. Si tenemos acceso SSH a nuestro servidor, lo único que vamos a tener que hacer es instalar una herramienta imprescindible para todo administrador de WordPress: WP-CLI, que es lo que nos va a permitir controlar todos los aspectos de nuestra instalación de WordPress, desde los trabajos del CRON hasta las actualizaciones, pasando por problemas de “salud” de nuestra instalación.
¿Cómo instalamos WP-CLI en nuestro servidor?
Iniciamos sesión en nuestro servidor mediante SSH y descargamos wp-cli.phar mediante wget o curl con la siguiente orden:
curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
Comprobamos que todo está correcto y funciona y luego conseguimos que funcione el comando wp:
php wp-cli.phar --info
chmod +x wp-cli.phar
sudo mv wp-cli.phar /usr/local/bin/wp
wp --info
Y debería de salir algo como esto:
OS:
Shell:
PHP binary:
PHP version:
php.ini used:
MySQL binary:
MySQL version:
SQL modes:
WP-CLI root dir: phar://wp-cli.phar/vendor/wp-cli/wp-cli
WP-CLI vendor dir: phar://wp-cli.phar/vendor
WP_CLI phar path: /root
WP-CLI packages dir: /root/.wp-cli/packages/
WP-CLI cache dir: /root/.wp-cli/cache
WP-CLI global config:
WP-CLI project config:
WP-CLI version: 2.10.0
¿Qué sucede si no consigues algo similar? En mi caso, no tenía instalado Phar en mi servidor Apache, así que no había manera de que se interpretara la orden.
También te pueden salir diversos errores en función de cómo hayas configurado PHP. Si os pasa, comentármelo y os digo cómo solucionarlo. También os puede dar problemas si lo estáis ejecutando con el usuario root, algo nada recomendable. Cread un nuevo usuario en vuestro servidor y todo funcionará a las mil maravillas.
Ahora que ya tenemos instalado WP-CLI en nuestro servidor, solo tenemos que conocer un poco cuáles son los comandos disponibles. Pero básicamente hay tres realmente interesantes: «core» para instalar, actualizar WordPress, «plugin», para hacer exactamente lo mismo con los plugins y «theme» para gestionar las plantillas del blog.
¿Cómo actualizamos WordPress a una nueva versión? Actualizamos el núcleo de WordPress y la base de datos.
wp core update
wp core update-db
¿Cómo listamos los plugins que tenemos instalados?
wp plugin list
¿Cómo actualizamos WP-CLI a una nueva versión?
wp cli update
O vuelves a realizar el proceso de instalación desde el principio.
Cómo automatizar con scripts y WP-CLI las actualizaciones de WordPress
También podemos automatizar completamente nuestra instalación de WordPress creando un script en bash con todos los comando de WP-CLI que necesitemos y programar en «cron» de manera periódica las actualizaciones de plugins, temas o del propio núcleo de WordPress.
Por ejemplo, con el siguiente script vas a poder actualizar dos blogs (vi update-wp.sh):
#!/bin/bash
# Log file
LOGFILE="/ruta/a/wp-update-core-logs.txt"
# Ruta completa a wp-cli
WP_CLI_PATH="/usr/local/bin/wp"
PHP_PATH="/tu/ruta/ejecutable/PHP"
# Ejecuta wp-cli para actualizar WordPress y la base de datos en cada sitio
echo "Actualizando WordPress para /ruta/a/public_html/BLOG1 a $(date)" >> "$LOGFILE"
sudo -u USUARIOSERVIDOR1 $PHP_PATH $WP_CLI_PATH --path=" /ruta/a/public_html/BLOG1" core update >> "$LOGFILE" 2>&1
sudo -u USUARIOSERVIDOR1 $PHP_PATH $WP_CLI_PATH --path=" /ruta/a/public_html/BLOG1" core update-db >> "$LOGFILE" 2>&1
echo "Actualizando WordPress para /ruta/a/public_html/BLOG2 a $(date)" >> "$LOGFILE"
sudo -u USUARIOSERVIDOR2 $PHP_PATH $WP_CLI_PATH --path="/ruta/a/public_html/BLOG2" core update >> "$LOGFILE" 2>&1
sudo -u USUARIOSERVIDOR2 $PHP_PATH $WP_CLI_PATH --path="/ruta/a/public_html/BLOG2" core update-db >> "$LOGFILE" 2>&1
Vamos a actualizar 2 blogs WordPress de tu servidor simplemente colocando la ruta a su carpeta public_html y poniendo los usuarios principales de cada uno de ellos en su instalación del servidor. Tienes que saber dónde esta ele ejecutable PHP en tu servidor (puedes probar poniendo which php en línea de comandos). Los resultados de la actualización se reflejarán en un archivo txt wp-update-core-logs.txt que debes guardar en una ruta de tu servidor.
Después de configurar todo esto, debes guardar el archivo (ESC y luego :wq!) y hacerlo ejecutable:
chmod +x update-wp.sh
Luego solo tienes que poner en línea de comandos lo siguiente para ejecutarlo:
./update-wp.sh
Cómo gestionar el cron de WordPress con WP-CLI

Este es uno de los usos más interesantes. Y te lo he contado en la entrada: Gestionando el cron de WordPress de manera eficiente con WP-CLI.
Las actualizaciones del cron gracias a WP-CRON, solo se producen cuando alguien visita tu página web, o cuando estás accediendo al panel de administración, y esto puede llevar a varios problemas:
- Si tu blog tiene pocas visitas, se van a acumular eventos del cron, y es posible que se ejecuten todos al mismo tiempos, pudiendo provocar que la página en cuestión tarde más tiempo en cargar a tu visitante si el trabajo es intensivo y requiere mucha CPU o RAM de tu servidor.
- Si tu blog tiene muchas visitas, todos los eventos del cron de WP se ejecutarán a tiempo, pero tendremos otro problema: a lo mejor provoca una sobrecarga en el servidor porque se está ejecutando muchas veces.
Por eso se recomienda deshabilitar el cron de WordPress, y ejecutarlo desde el Cron de Linux cada 5 minutos con una orden como (editando el cron en Linux con crontab -e):
*/5 * * * * sudo -u TUUSUARIOSERVIDOR /RUTA/A/wp --path="/home/USUARIO/public_html/" cron event run --due-now
Resolviendo problemas de nuestra instalación WordPress con WP-CLI
WP-CLI también viene en nuestra ayuda en este sentido, y solo tenemos que instalar una cosa extra con WP-CLI: WP-CLI Doctor. Lo instalamos. Es un plugin (package) de WP-CLI:
wp package install wp-cli/doctor-command:@stable
Cuando lo tengas instalado, solo tienes que ir a la carpeta de instalación de tu WordPress y poner el siguiente comando:
wp doctor list --allow-root
Y te saldrá algo como esto:
+----------------------------+-------------------------------------------------+
| name | description |
+----------------------------+-------------------------------------------------+
| autoload-options-size | Warns when autoloaded options size exceeds thre |
| | shold of 900 kb. |
| constant-savequeries-falsy | Confirms expected state of the SAVEQUERIES cons |
| | tant. |
| constant-wp-debug-falsy | Confirms expected state of the WP_DEBUG constan |
| | t. |
| core-update | Errors when new WordPress minor release is avai |
| | lable; warns for major release. |
| core-verify-checksums | Verifies WordPress files against published chec |
| | ksums; errors on failure. |
| cron-count | Errors when there's an excess of 50 total cron |
| | jobs registered. |
| cron-duplicates | Errors when there's an excess of 10 duplicate c |
| | ron jobs registered. |
| file-eval | Checks files on the filesystem for regex patter |
| | n `eval\(.*base64_decode\(.*`. |
| option-blog-public | Confirms the expected value of the 'blog_public |
| | ' option. |
| plugin-active-count | Warns when there are greater than 80 plugins ac |
| | tivated. |
| plugin-deactivated | Warns when greater than 40% of plugins are deac |
| | tivated. |
| plugin-update | Warns when there are plugin updates available. |
| theme-update | Warns when there are theme updates available. |
| cache-flush | Detects any use of the `wp_cache_flush()` funct |
| | ion. |
| php-in-upload | Warns when a PHP file is present in the Uploads |
| | folder. |
| language-update | Warns when there are language updates available |
| | . |
+----------------------------+-------------------------------------------------+
Esto es lo que hace cada opción en WP Doctor:
Comando WP Doctor | Descripción |
---|---|
autoload-options-size | Advierte cuando el tamaño de las opciones autoload excede el umbral de 900 kb. |
constant-savequeries-falsy | Confirma el estado esperado de la constante SAVEQUERIES. |
constant-wp-debug-falsy | Confirma el estado esperado de la constante WP_DEBUG. |
core-update | Genera errores cuando hay una nueva versión menor de WordPress disponible; advierte sobre una versión mayor. |
core-verify-checksums | Verifica los archivos de WordPress contra las sumas de verificación publicadas y genera errores en caso de error. |
cron-count | Genera errores cuando hay más de 50 trabajos cron registrados. |
cron-duplicates | Genera errores cuando hay más de 10 trabajos cron duplicados registrados. |
file-eval | Verifica los archivos en el sistema de archivos para el patrón regex eval(.*base64_decode(.*. |
option-blog-public | Confirma el valor esperado de la opción ‘blog_public’. |
plugin-active-count | Advierte cuando hay más de 80 plugins activos. |
plugin-deactivated | Advierte cuando más del 40 % de los plugins instalados están desactivados. |
plugin-update | Advierte cuando hay actualizaciones de plugins disponibles. |
theme-update | Advierte cuando hay actualizaciones de temas disponibles. |
cache-flush | Detecta cualquier uso de la función wp_cache_flush(). |
php-in-upload | Advierte cuando hay un archivo PHP presente en la carpeta de subidas de WP. |
language-update | Advierte cuando hay actualizaciones de idiomas disponibles para WP. |
Si quieres que haga un chequeo de todos esto, solo tienes que poner:
wp doctor check --all --allow-root
O únicamente uno de ellos:
wp doctor check core-update --allow-root
¿Qué obtienes a la salida? Pues algo como esto:
+---------------------------------+---------+----------------------------------+
| name | status | message |
+---------------------------------+---------+----------------------------------+
| core-verify-checksums | error | WordPress doesn't verify against |
| | | its checksums. |
| file-eval | success | All 'php' files passed check for |
| | | 'eval\(.*base64_decode\(.*'. |
| cache-flush | warning | Use of wp_cache_flush() detected |
| | | . |
| autoload-options-size | success | Autoloaded options size (372.83k |
| | | b) is less than threshold (900kb |
| | | ). |
| constant-savequeries-falsy | success | Constant 'SAVEQUERIES' is undefi |
| | | ned. |
| constant-wp-debug-falsy | success | Constant 'WP_DEBUG' is defined f |
| | | alsy. |
| core-update | success | WordPress is at the latest versi |
| | | on. |
| cron-count | success | Total number of cron jobs is wit |
| | | hin normal operating expectation |
| | | s. |
| cron-duplicates | success | All cron job counts are within n |
| | | ormal operating expectations. |
| option-blog-public | success | Site is public as expected. |
| plugin-active-count | success | Number of active plugins (11) is |
| | | less than threshold (80). |
| plugin-deactivated | success | Less than 40 percent of plugins |
| | | are deactivated. |
| plugin-update | success | Plugins are up to date. |
| theme-update | success | Themes are up to date. |
| php-in-upload | success | No PHP files found in the Upload |
| | | s folder. |
| language-update | success | Languages are up to date. |
+---------------------------------+---------+----------------------------------+
En mi caso me sale Error en core-verify-checksums, porque tengo varios falsos positivos, pero no está de más que compruebes que archivos han fallado ejecutando este comando específico:
wp core verify-checksums --allow-root
En mi caso también ha detectado archivos de WordPress de versiones de hace muchos años que al ir actualizando el blog, no se han ido borrando de manera automática. Puedes borrar estos archivos con tranquilidad, es más, deberías de borrarlos para aumentar la seguridad de tu instalación:
- wp-pass.php
- wp-rss.php
- wp-feed.php
- wp-commentsrss2.php
- wp-rss2.php
- wp-atom.php
- wp-register.php
- wp-rdf.php
También puede detectar la NO presencia de wp-config-sample.php.
- Este comando es especialmente útil si quieres comprobar la integridad de WordPress para identificar Malware en tu instalación.
¿Quieres comprobar la seguridad de tus plugins con este comando?
wp plugin verify-checksums --all
Si vuelves a ejecutar el primer comando, verás que después de borrar esos archivos, ya no aparece el error:

El Warning de cache-flush se refiere a un uso de llamadas excesivo a la función wp_cache_flush(). Todo lo demás sale correcto.