Guía de WP-CLI: Administra WordPress desde tu terminal
WP-CLI te permite administrar WordPress escribiendo comandos en el terminal en lugar de usar la interfaz gráfica. Es la herramienta oficial del CMS y resulta más eficiente para tareas repetitivas o pesadas, ya que evita los timeouts del servidor web. Para utilizarla, necesitas acceso SSH, PHP compatible y descargar el binario wp-cli.phar, añadiéndolo a tu path.
Al trabajar con WordPress, lo habitual para crear usuarios, publicar posts, cambiar el diseño o actualizar es el wp-admin, pero no es la única forma de trabajar con tu sitio.
WordPress pone a tu disposición varias interfaces además del archiconocido wp-admin, y algunas te vienen muy bien si necesitas automatizar tareas o quieres ganar tiempo en tu trabajo diario.
Las interfaces de comunicación con WordPress son la zona de administración web o wp-admin, el archivo xmlrpc.php, que se usa con frecuencia para atacar nuestras aplicaciones, la API rest de WordPress y, por último, la línea de comandos a través de wp-cli.
En este artículo, nos centramos en esta última y en cómo sacarle todo el partido a tu aplicación web con ella.
- Qué es WP-CLI
- Ventajas de WP-CLI
- Cómo instalar WP-CLI
- Comandos de WP-CLI
- Añadiendo comandos a WP-CLI
- Cómo se usa WP-CLI
- Instalar subcomandos de WP-CLI
Qué es WP-CLI
WP-CLI es la aplicación oficial para gestionar sitios WordPress desde la línea de comandos, y pretende sustituir al wp-admin: cualquier gestión que harías desde la interfaz gráfica la puedes hacer por terminal.
En realidad es incluso más potente, porque te da alternativas para las que, por interfaz gráfica, necesitarías instalar un plugin, como por ejemplo, permite la revisión de tareas cron de WordPress, con lo que puede ayudarte a mantener el sitio libre de código que no hace falta y a que funcione más rápido.
Con wp-cli, vas desde instalar un WordPress hasta cualquier gestión que se te ocurra: instalar o borrar temas y plugins, gestionar usuarios y sus roles y permisos, editar posts y lo que quieras.
Ventajas de WP-CLI
Si no tienes experiencia con herramientas de terminal, pueden parecerte rudimentarias y arcaicas, pero si los desarrolladores se esfuerzan en crearlas es por su eficiencia y versatilidad.
Por ejemplo, si te dedicas a desarrollar sitios en WordPress, es bastante probable que tengas una colección de plugins preferidos que instalas en casi todos.
Con wp-cli, eso lo haces de forma automática, mientras te preparas un café y piensas cómo va a ser la interfaz del sitio, en vez de instalarlos manualmente uno a uno con el tiempo que se lleva.
Lo mismo con la actualización de WordPress, sus plugins y el tema en uso, aunque no es recomendable hacerlo de forma desatendida, porque hay que comprobar que todo funciona bien al terminar, pero wp-cli tiene grandes ventajas sobre la interfaz gráfica: no dependes de los timeouts que pueda dar el servidor web.
Aunque debe ejecutar PHP aun así, el lenguaje de programación en que está escrito WordPress.
Otra cosa que te permite es exportar posts y contenidos de tu sitio, o incluso la base de datos entera, sin problemas de ningún tipo, ya que al hacerlo desde WordPress normalmente llegamos a los tiempos maximos de timeout y nos suele cortar la peticion en sitios web muy grandes con muchos datos.
Cómo instalar WP-CLI
Lo primero que necesitas para empezar a usar esta aplicación es, evidentemente, instalarla.
Los dos requisitos son PHP (una version bastante actual) y acceso por terminal o SSH.
En los Hosting Elastico de Raiola Networks y en los Servidores VPS Optimizados ya viene instalado y puedes saltarte este paso.
Si todavía no tienes un producto en Raiola Networks, o no es de los mencionados, lo primero es revisar si wp-cli ya está instalado. Para eso, búscalo en el path, que es la ruta donde están las aplicaciones ejecutables por terminal. Lo compruebas con este comando:
which wp-cli || which wp-cli.phar || which wp /usr/bin/which: no wp-cli in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/vesta/bin) /usr/bin/which: no wp-cli.phar in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/vesta/bin) /usr/bin/which: no wp in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/vesta/bin)

root@raiolanetworks.servidordepruebas.com:~ $ which wp-cli || which wp-cli.phar || which wp /usr/bin/which: no wp-cli in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/vesta/bin) /usr/bin/which: no wp-cli.phar in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/vesta/bin) /usr/bin/which: no wp in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/vesta/bin)
La salida te dirá si wp-cli existe en tu path y con qué nombre puedes usarlo. En este ejemplo no existe, como puedes ver: las 3 líneas dicen que no está en mi path, y voy a instalarlo.
Para instalar WP-CLI en primer lugar debes acceder por SSH a tu servidor o hosting (siempre que te lo permita, claro); posteriormente, desde la terminal, debes descargarte el binario wp-cli.phar usando el siguiente comando con curl:
curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
Después, podemos comprobar que funciona ejecutando esto:
php wp-cli.phar --info
Lo siguiente será asignarle permisos de ejecución con estos comandos:
chmod +x wp-cli.phar sudo mv wp-cli.phar /usr/local/bin/wp
Con esto ya tendremos WP-CLI listo para funcionar en nuestro servidor.

Ahora vuelve a comprobar si wp-cli está en tu path y verás algo como esto:
which wp-cli || which wp-cli.phar || which wp /usr/bin/which: no wp-cli in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/vesta/bin) /usr/bin/which: no wp-cli.phar in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/vesta/bin) /usr/local/bin/wp

Por último, queda comprobar que la instalación ha funcionado, y lo puedes hacer como yo en esta captura:
wp --info OS: Linux 3.10.0 #1 SMP Tue Jun 9 12:58:54 MSK 2020 x86_64 Shell: /bin/bash PHP binary: /usr/bin/php PHP version: 7.2.34 php.ini used: /etc/php.ini 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: WP-CLI global config: WP-CLI project config: WP-CLI version: 2.4.0

Comandos de WP-CLI
Ahora vamos a ver los principales subcomandos de WP-CLI y para qué sirve cada uno.
Empezamos por los subcomandos básicos para manejar una aplicación WordPress: el propio WordPress y sus plugins, temas y usuarios.
| Core | Descarga, instala, actualiza y gestiona una instalación de WordPress. Con él puedes verificar que tu WordPress (al menos el core, no los plugins y temas) no tiene código malicioso o no esperado, comprobar actualizaciones, convertirlo a multisitio u obtener su versión, entre otras opciones |
| Config | Genera o lee el archivo de configuración principal de WordPress, wp-config.php |
| Theme | Instala y desinstala temas, cambia el tema activo y actualiza los instalados |
| Plugin | La versión del anterior para gestionar plugins. Lista los instalados, los instala, los activa o desactiva, busca en los repositorios de WordPress y comprueba su integridad contra esos repositorios |
| Maintenance-mode | La gestión integrada de WordPress para el modo mantenimiento |
| DB | Gestiones con la base de datos de WordPress, como la exportación para hacer copia de seguridad, la actualización, la ejecución de consultas o el optimizado |
| Caché | Sirve para controlar la caché de objetos de WordPress |
Vamos ahora con los subcomandos de wp-cli para la gestión de usuarios.
| User | Gestiona los usuarios, sus roles y permisos y la información asociada a ellos |
| Cap | Gestión de permisos de un rol de usuario |
| Role | Creación y gestión de roles de usuario. También permite resetear sus propiedades al estado por defecto |
El siguiente subgrupo te permite la gestión de los contenidos de tu WordPress desde wp-cli.
| Menu | Lista, crea o borra los menús de navegación del tema activo |
| Sidebar | Lista los sidebars de WordPress. Un sidebar es cualquier elemento donde puedes añadir widgets, y vienen definidos en el código del tema |
| Widget | Añade, elimina y gestiona widgets en las barras laterales de tu CMS |
| Media | Importa archivos como adjuntos de forma masiva, regenera miniaturas y obtiene información de las imágenes de tu aplicación |
| Post | Gestiona la creación, edición y borrado de posts |
| Comment | Modera comentarios, hace recuento de cuántos hay en un post o en toda la aplicación, los marca como spam y demás |
Añadiendo comandos a WP-CLI
Si las opciones que trae wp-cli de serie no te parecen suficientes, algunos plugins incluyen sus propias utilidades integradas en terminal. WooCommerce, Jetpack o Autoptimize añaden sus subcomandos, y con ellos gestionas esos plugins desde la terminal.
Y por si fuera poco, se pueden escribir plugins o añadidos para wp-cli que instalas y gestionas desde el subcomando package, con lo que añades funcionalidades como comprobaciones del estado de salud de tu sitio.
Si has ejecutado la ayuda de wp-cli que te comentábamos antes, lo habrás visto: las opciones son muy amplias, más de las que hemos comentado hasta aquí, ya que hay comandos para gestionar WordPress multisitio, para darte estructuras precreadas con las que desarrollar plugins o temas, internacionalización, reemplazo de cadenas en base de datos (search-replace), revisión de código y más.
Si te interesa alguno que no esté en nuestra explicación, puedes ver su ayuda con una ejecución como esta:
wp search-replace --help
Eso muestra la ayuda específica del subcomando y te explica cada uno de sus argumentos y subopciones:

Cómo se usa WP-CLI
Ahora que ya tienes unas nociones básicas de lo que hace wp-cli y de sus subcomandos, y toca verlo sobre el terreno.
Lo primero es instalar WordPress en nuestro servidor. Cambia al directorio donde apunta tu dominio (por ejemplo, en cPanel, la carpeta "public_html" para el dominio principal) y ejecuta los 3 comandos que te dejo aquí:
wp core download wp config create --dbname='wpcli_wp1' --dbuser='wpcli_wp1' --dbpass='claveAccesoBBDDWordpress' wp core install --url='https://instalacion-wp-cli.tld' --title='Mi Blog' --admin_user='Fran' --admin_password='claveAccesoWordpress' --admin_email='fran@instalacion-wp-cli.tld' --skip-email --path=$(pwd)

Eso nos deja un WordPress recién instalado en la última versión disponible.
Ahora vamos a configurarle la zona horaria: el comando "option" permite obtener y modificar distintas configuraciones del sitio, tanto del propio WordPress como de los plugins instalados.
wp option update timezone_string Europe/Madrid
Tendrás que confiar en nosotros, o seguir los pasos que acabamos de indicar para comprobarlo tú mismo, pero si ahora entras desde un navegador (yo he usado este dominio, tú tendrás que usar el tuyo), verás un WordPress recién instalado y listo para funcionar.
Lo primero que voy a hacer con esa instalación es activar el modo mantenimiento, para que no entren curiosos mientras trabajo:
wp maintenance-mode activate

Este es el típico modo mantenimiento de WordPress.
En esta instalacion yo voy a trabajar como administrador, pero va a haber gente que contribuya al proyecto escribiendo artículos, y vamos a crear un usuario con permisos de autor:
wp user create 'Juan' 'juan@instalacion-wp-cli.tld' --role=author --user_nicename=Juan --send-email

Con eso Juan recibe una notificación por correo de que ya tiene acceso a la nueva instancia de WordPress que acabo de crear y en la que vamos a trabajar.
Vamos ahora a instalar los plugins que necesito para el proyecto. Me interesan:
- LiteSpeed para mejorar el rendimiento de mi aplicación. Es el plugin de caché recomendado en Hosting Compartidos de Raiola Networks.
- Contact Form para la creación de formularios de manera sencilla.
- HoneyPot como sistema antispam para proteger los formularios por defecto de WordPress.
- YoastSeo para la gestión de metaetiquetas en los distintos posts.
El comando para instalarlos y dejarlos activos todos a la vez seria este:
wp plugin install --activate litespeed-cache contact-form-7 honeypot-antispam wordpress-seo

Ahora podemos comprobar que wp-cli tiene subcomandos nuevos, como te comentábamos antes. Si escribo wp --help en mi terminal, veo que tanto yoast-seo como litespeed han añadido los suyos, y eso nos sirve para automatizar el purgado de la caché de litespeed, por ejemplo.
Lo siguiente es instalar un tema, y en este caso usaré GeneratePress:
wp theme install generatepress --activate

Y como el resto de temas no los necesito para nada, los listo y los borro con estos dos comandos:
wp theme list wp theme delete twentynineteen twentytwenty twentytwentyone

Ya que estoy limpiando, vamos a borrar los plugins que vienen preinstalados y no necesitamos:
wp plugin list wp plugin delete hello akismet

Con la estructura básica montada, vamos a añadir un menú a WordPress y configurarlo como principal:
wp menu create 'Main_menu' wp menu location assign Main_menu primary

Y como ya tenemos todos los componentes de la aplicación creados, vamos a meterle algo de contenido demo, unos cuantos usuarios suscriptores y algunos posts:
wp user generate --count=5 --role=subscriber wp post generate --count=3 --post_content <<< $(curl -s -N http://loripsum.net/api/2 )

Si ahora quisiera automatizar los despliegues (instalaciones y configuraciones iniciales) de WordPress, solo tengo que juntar todos los comandos anteriores en un archivo y darle permisos de ejecución. Cada vez que lo use, realizará todo el proceso sin esfuerzo y dejándome el terreno listo para comenzar el trabajo.
Como ves, wp-cli es una aplicación tremendamente útil para automatizar despliegues o acelerar gestiones que por terminal te llevarían un tiempo considerable, y sus utilidades no acaban aquí.
Si eres desarrollador, o quieres empezar a asomarte a las entrañas de WordPress, wp-cli te sirve para crear estructuras básicas con las que desarrollar plugins, temas y demás, mediante su comando scaffold.
Vamos a usarlo para crear la estructura básica de un plugin que, por el nombre, ya te puedes imaginar lo que hace:
wp scaffold plugin plugin-realmente-lento --plugin_description='Plugin para ralentizar la aplicación WordPress'

Con un par de líneas de código dentro, el plugin ya cumple su función: ralentizar la carga de WordPress.
A primera vista no parece el plugin más útil del mundo, pero sirve para ilustrar el siguiente subcomando que vamos a usar, que es profile.
Instalar subcomandos de WP-CLI
profile está listado entre los principales subcomandos de wp-cli, como se ve en su sitio oficial, pero no viene preinstalado.
Igual que algunos plugins nos han creado subcomandos, se pueden extender las funcionalidades de wp-cli mediante paquetes hechos por otros desarrolladores.
Tú podrías crear uno tú para automatizar procesos repetitivos, o que consuman mucho por interfaz gráfica, y acelerar así todavía más las gestiones.
Como dice la documentación, para instalar el subcomando profile hay que escribir lo siguiente:
wp package install wp-cli/profile-command

Si volvemos a usar wp --help, veremos que se ha añadido otro comando, profile.
Para este ejemplo nos interesan dos subcomandos: stage y hook.
Lo primero es analizar en qué consume WordPress su tiempo cuando le pedimos que cargue la página de inicio, y con algunos argumentos podemos probar otras URL:
wp profile stage --fields=stage,time,query_time,hook_time,request_time

Ahí se ve que "template" consume ¡10 segundos!, y vamos a analizar qué lo está provocando.
Si miramos cómo funciona template, veremos qué tarda en cargar en esta parte de nuestro WordPress:
wp profile stage template --fields=hook,callback_count,time,query_time

Como se aprecia en la captura, el hook wp_head tarda los 10 segundos que habíamos visto antes, y vamos a averiguar por qué.
Con el subcomando hook podemos ver todos los hooks de WordPress y cuánto tarda en cargar cada uno. Usaremos el argumento --spotlight para que no nos muestre aquellos cuyos tiempos son irrelevantes:
wp profile hook --spotlight --fields=hook,time,query_time,request_time

Otra vez tenemos la información de que hay un hook, wp_head en concreto, como ya hemos visto, que tarda 10 segundos en cargar, y vamos a meternos en él.
wp profile hook wp_head --spotlight --fields=callback,time

Ahí vemos que hay un callback, una función en este caso, llamada stremely_slow_function(), que tarda 10 segundos en cargar y está en plugin-realmente-lento/plugin-realmente-lento.php; en concreto, en la línea 17.
Y si abrimos el archivo, vemos que la función hace esto:
function function_realmente_lenta() {
sleep(10);
}
Es una función dummy: espera 10 segundos antes de hacer nada, así que podríamos quitarla de la aplicación desactivando el plugin, por ejemplo.
wp plugin deactivate plugin-realmente-lento
Tras desactivar ese plugin tan malo, WordPress vuelve a cargar en tiempos normales:
wp profile stage

Si necesitas que un experto en WordPress analice tu sitio web, no dudes en contactar con nosotros para que podamos echarte una mano. Tenemos un departamento de aplicaciones web especializado que puede revisar todo esto y mucho más.
Jabi
07/03/2021 a las 01:03