Publi

Descubrimos WP-CLI para hacer maravillas y automatizar tu WordPress al máximo

photo-1443916568596-df5a58c445e9
WordPress es el CMS más popular hasta el momento. Solo que orientado al mundo blog o blogosfera, a día de hoy se hacen webs de diversa índole aprovechando sus capacidades de extensión. Aunque a los que llevamos mucho tiempo en la informática, las siglas WP nos recuerdan a WordPerfect1, pero no tiene nada que ver.
Como sabrán muchos lectores de este blog, normalmente prefiero las soluciones de línea de comandos para muchas tareas frente a otras soluciones gráficas más bonitas e intuitivas, ya que éstas últimas suelen ser más lentas, requieren un proceso constante de interacción por mi parte y es muy difícil automatizarlas.

Ahora viene lo bueno, ¿hay alguna forma de utilizar WordPress desde una interfaz de línea de comandos?
¡Por supuesto! Desde finales de 2011 tenemos con nosotros un desarrollo inicialmente hecho por Andreas Creten2 y Cristi Burcä3, aunque ahora su principal mantenedor es Daniel Bachhuber4 (encontramos sus enlaces de GitHub abajo del todo) llamado WP-CLI5.

¿Qué hace WP-CLI?

Básicamente es una interfaz en línea de comandos que nos permite utilizar WordPress sin necesidad de ver una web (aunque sí que necesitaremos acceso SSH al servidor donde tenemos alojado el blog).
Entre otras cosas, nos permite realizar instalaciones de WordPress, instalar plugins, temas, actualizarlos, gestionar comentarios, taxonomías, widgets, posts, páginas, usuarios, base de datos y muchas cosas más, todo desde nuestra línea de comandos. Y, por supuesto, podemos automatizar todas las acciones, lo cual nos permite ahorrar muchísimo tiempo en tareas repetitivas o al menos, si alguna operación va a tardar un rato, no necesitamos estar delante cargando decenas de apartados en el navegador y realizando tareas que requieren nuestra presencia y atención (y, si gestionas muchos blogs te puede venir muy bien).

Requerimientos

Para poder utilizar WP-CLI necesitamos:

  • Acceso SSH a un servidor (para trabajar en remoto), aunque también podemos trabajar en local si queremos. Puede ser Linux, OSX, o cualquier *nix o incluso Windows, aunque en Windows podremos hacer menos cosas.
  • PHP 5.3 o superior (recomiendan 5.3.29, pero funciona con la 5.3.19 sin embargo, a día de hoy, como mínimo una 5.5 la tenemos todos).
  • cURL instalado y su módulo para PHP también.
  • WordPress 3.7 o superior (aunque podremos instalarlo desde WP-CLI, pero no gestionar instancias más antiguas.

Instalación

WP-CLI no es un plugin de WordPress, por lo que no tenemos que instalarlo con el entorno de administración de éste. Es más, WP-CLI es capaz de automatizar tus instalaciones de WordPress. ¿Necesitas hacer varias instalaciones de WP en un servidor? Con esta herramienta puedes hacerlo en cuestión de segundos. WP-CLI será lo primero que instales.

Debemos hacerlo de la siguiente forma:

$ curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
$ sudo mv wp-cli.phar /usr/local/bin/wp
$ sudo chmod +x /usr/local/bin/wp

Con esto, lo tendremos instalado a nivel de sistema. Por lo que, en cualquier lado, podemos ejecutar:

$ wp –info
PHP binary: /usr/local/php54/bin/php-cli
PHP version: 5.4.45
php.ini used: /usr/local/php54/lib/php.ini
WP-CLI root dir: phar://wp-cli.phar
WP-CLI packages dir: /home/poesiab8/.wp-cli/packages/
WP-CLI global config:
WP-CLI project config:
WP-CLI version: 0.23.0

y nos dará información básica sobre el programa. Además, si a menudo trabajas con la línea de comandos, seguro que la tecla Tab la tienes desgastada, porque conseguimos que escriba lo que nos da pereza escribir, además de ayudarnos a recordar mucha información. Esto se llama bash completion, y muchísimos vienen acompañados de un pequeño script que nos ayuda con esto. WP-CLI no va a ser menos. Podemos descargarlo e instalarlo:

wget https://github.com/wp-cli/wp-cli/raw/master/utils/wp-completion.bash
sudo mkdir -p /usr/local/share/bash-completion/completions
sudo mv wp-completion.bash /usr/local/share/bash-completion/completions

Ahora en nuestro $HOME, añadir al archivo .bashrc las siguientes líneas al final:

1
2
3
4
if [ -f "/usr/local/share/bash-completion/completions/wp-completion.bash" ];
then
   source /usr/local/share/bash-completion/completions/wp-completion.bash;
fi

Así, nada más entrando en el sistema podremos disfrutar de esta ayuda. Si no queremos salir y volver a entrar, podemos hacer:

$ source /usr/local/share/bash-completion/completions/wp-completion.bash

Recapitulando

También podemos crear un pequeño script que lo haga todo por nosotros, muy útil si tenemos que hacer varias instalaciones de WP-CLI (el script necesita sudo, y preguntará la contraseña, pero no es difícil de adaptar):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#/bin/bash

OLDPWD="$(pwd)"
cd /tmp/

# Descarga e instala WP-CLI
wget https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
sudo mv wp-cli.phar /usr/local/bin/wp
sudo chmod +x /usr/local/bin/wp

# Descarga e instala WP-CLI completion
wget https://github.com/wp-cli/wp-cli/raw/master/utils/wp-completion.bash
sudo mkdir -p /usr/local/share/bash-completion/completions
sudo mv wp-completion.bash /usr/local/share/bash-completion/completions

# Instala WP-CLI completion en el usuario actual
cp $HOME/.bashrc $HOME/.bashrc_old
echo "if [ -f "/usr/local/share/bash-completion/completions/wp-completion.bash" ]
then
    source /usr/local/share/bash-completion/completions/wp-completion.bash;
fi"
>> $HOME/.bashrc
source /usr/local/share/bash-completion/completions/wp-completion.bash

cd "$OLDPW"

También podemos instalarlo en Windows, o utilizar Composer o Brew, tenemos mucha más información en la web oficial.6.

Actualización

WP-CLI soporta auto-actualización (como composer), es decir, ejecutando:

$ wp cli update

Automáticamente se descargará la última versión y se sobreescribirá el archivo actual (debemos tener permisos para ello, por ejemplo si está instalado con privilegios de root, debemos ser root, o hacer sudo si está disponible).

Antes de empezar

WP-CLI puede administrar múltiples instancias de WordPress en un mismo servidor, tanto si tienes una instalación para cada blog WordPress como si dispones de configuración multisitio7.
Es recomendable, antes de utilizar WP-CLI acceder al directorio del servidor donde tenemos la instalación de WordPress (a no ser que lo estemos instalando), de la siguiente forma:

$ cd www/mi_blog/www/
$ wp core version

Aunque, también podemos hacer lo siguiente (aunque puede ser algo incómodo):

$ wp core version –path=www/mi_blog/www

Tareas básicas

Ahora viene lo interesante, todo lo que podemos hacer con WP-CLI, al menos algunas tareas comunes como las siguientes:

Instalación de WordPress

Para hacer la instalación, debemos dar varios pasos previos:

  • Descarga de archivos: seguro que alguna vez te has descargado WordPress, lo has descomprimido en tu ordenador y lo has subido al servidor por FTP. Al tratarse de muchos archivos, este método es lento, necesita mucha interacción humana, además, la conexión a Internet de un ordenador personal suele ser mucho más lenta que la de un servidor. Por otro lado, el servidor puede hacer muchas cosas, si has usado SSH antes, sabrás lo que quiero decir. WP-CLI nos permite descargar y descomprimir WordPress con sólo un comando.

    $ wp download –path=directorio_local –locale=idioma

  • Configuración de WordPress: el primer paso, tras la instalación es decir el host, nombre de usuario, clave y demás información relativa a la base de datos. Pero esto lo podemos automatizar, quitar el mensaje de bienvenida y ahorrar un precioso tiempo:

    $ wp core config –dbname=”BASEDEDATOS” –dbuser=”USUARIODB” –dbpass=”PASSDB” –dbhost=”HOSTDB” –dbprefix=”PREFIJODB” –locale=”idioma”

  • Instalación de WordPress: tras enviar la información de base de datos, nos pedirá información sobre el blog; darle un nombre, un usuario administrador y una contraseña. Esto lo podemos hacer con:

    $ wp core install –url=”DIRECCION” –title=”TITULO DEL BLOG” –admin_user=”USUARIO_ADMINISTRADOR” –admin_password=”PASSWORD” –admin_email=”MAIL ADMINISTRADOR”

  • Un ejemplo real

    Queremos instalar un WordPress en español en www.midominio.com/blog; la base de datos estará en localhost (en el mismo servidor web), el usuario será dbuser, la clave dbpassword, la base de datos, blogs y el prefijo “wp_”. El usuario administrador de WordPress será blogadmin y la clave “passwordcomplicado”. El título del blog será “Un blog sobre WP-CLI”. Podremos hacerlo ejecutando tres comandos:

    $ wp download –path=www/blog –locale=”es_ES”
    $ cd www/blog
    $ wp core config –dbname=”blogs” –dbuser=”dbuser” –dbpass=”dbpassword” –dbhost=”localhost” –dbprefix=”wp_” –locale=”es_ES”
    $ wp core install –url=”http://midominio.com/blog” –title=”Un blog sobre WP-CLI” –admin_user=”blogadmin” –admin_password=”passwordcomplicado” –admin_email=”info@midominio.com”

    O si queremos algo más general… incluso para que nos dé un password generado, tal y como hace un WordPress moderno:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    DB_HOST="localhost"
    DB_USER="dbuser"
    DB_PASSWORD="dbpassword"
    DB_NAME="blogs"
    DB_PREFIX="wp_"

    WP_TITLE="Un blog sobre WP-CLI"
    WP_LOCALE="es_ES"
    WP_URL="http://midominio.com/blog"

    ADMIN_PASSWORD=$(pwgen -sy 12 1)
    ADMIN_USER="blogadmin"
    ADMIN_MAIL="info@midominio.com"

    wp download --path=www/blog --locale="$WP_LOCALE"
    cd www/blog
    wp core config --dbname="$DB_NAME" --dbuser="$DB_USER" --dbpass="$DB_PASSWORD" --dbhost="$DB_HOST" --dbprefix="$DB_PREFIX" --locale="$WP_LOCALE"
    wp core install --url="$WP_URL" --title="$WP_TITLE" --admin_user="$ADMIN_USER" --admin_password="$ADMIN_PASSWORD" --admin_email="$ADMIN_MAIL"
    echo "El password es: "$ADMIN_PASSWORD

    Esto nos puede permitir automatizar al máximo la creación de blogs. Por ejemplo si tenemos varias webs alojadas en el mismo servicio de hospedaje, o un VPS. Esto nos puede hacer ahorrar muchísimo tiempo.
    ¿Parece poco ahorro? Bueno, como veremos más adelante, podremos instalar plugins desde aquí, podemos crear un pequeño script que automatice la instalación de WordPress, plugins y algo de configuración básica.

    Copia de seguridad

    Podemos importar y exportar la base de datos de forma muy rápida con las siguientes órdenes:

    $ wp db export backup.sql

    Y luego

    $ wp db import backup.sql

    Lo que nos puede ayudar bastante para las copias de seguridad. No está de más hacer una copia de los archivos, si el directorio de WordPress está en /home/usuario/www/blog/ podemos ir a /home/usuario y hacer lo siguiente:

    $ tar cvjpf blog_backup.tar.bz2 www/blog

    para realizar la copia y,

    $ tar xvjpf blog_backup.tar.bz2

    para restaurarla.

    De todas formas, existen plugins que pueden interactuar con WP-CLI para realizar una copia completa de seguridad8

    Actualizar versión

    Si hacemos:

    $ wp core version
    4.5.0

    Nos mostrará la versión que tenemos instalada actualmente (El post está publicado el 17 de junio de 2016). Nota: no me gusta hacer actualizaciones del core o de plugins/temas/etc sin haber hecho un backup completo primero. En el pasado, hacerlo así me ha salvado la vida varias veces.

    A partir de aquí podemos hacer una actualización:

    $ wp core update

    Automáticamente se actualizará y se instalará la actualización. No está de más hacer justo después:

    $ wp core update-db

    Ahora probamos nuestro blog, y navegamos un poco para ver que todo está bien.

    Ejecutar SQL directamente

    Esto me encanta. Normalmente puedo acceder a la base de datos ejecutando el comando mysql, con usuario y password de un usuario con privilegios (al tener varios blogs, tengo varios usuarios de base de datos con passwords generados, no me los sé todos y me da mucha pereza mirarlos).
    De esta forma, al ejecutar WP-CLI sobre un blog determinado, se ejecutará la consulta sólo sobre el usuario de dicho blog, por lo que la seguridad no será ya un problema.
    Podemos hacer:

    $ wp db query “SHOW TABLES;”

    o si tenemos la consulta SQL en un archivo:

    $ wp db query < consultas.sql

    ¿Quieres saber qué puedes hacer desde aquí? Visita este post para coger ideas.

    Configurar (de todo)

    Una de las tareas más arduas cuando instalas WordPress es configurarlo, recorrer todas las opciones y pasar por varias pantallas hasta finalizar todos los parámetros de configuración disponibles. Algunos los definimos, otros los revisamos, pero entre opciones del tema, plugins, generales, etc serán varias pantallas y si tenemos que configurar varios blogs, podemos perder muchísimo tiempo en estas tareas.

    Para ello tenemos:

    wp option

    Que nos permitirá consultar y definir valores de configuración de WordPress. Para empezar, podemos listar los elementos que nos deja configurar:

    $ wp option list

    Con esto veremos un listado de todas las opciones presentes, algo parecido a esto:
    Screenshot 14-06-2016-230644

    También tenemos las órdenes:

    $ wp option get [opcion]

    Pero claro, en este gestor de contenidos, si hemos revisado alguna vez las opciones del plugin (o hemos hecho un traslado de dominio a través de una copia de seguridad de la base de datos) veremos que muchas configuraciones vienen serializadas, es decir, tienen la siguiente forma:

    |widget_categories|
    a:2:{i:2;a:4:{s:5:”title”;s:0:””;s:5:”count”;i:0;s:12:”hierarchical”;i:0;s:8:”dropdown”;i:0;}s:12:”_multiwidget”;i:1;}

    Personalmente no me gusta, pero en WordPress no tenemos muchas más formas de categorizar una configuración y, desde el punto de vista de PHP es muy fácil y rápido serializar un array para escribir dicha configuración en base de datos. Aunque wp option get nos permite visualizar la variable de configuración con naturalidad, así:

    array (
    2 =>
    array (
    ‘title’ => ”,
    ‘count’ => 0,
    ‘hierarchical’ => 0,
    ‘dropdown’ => 0,
    ),
    ‘_multiwidget’ => 1,
    )

    De igual forma, podemos definir valores a las opciones de WordPress, como siempre, con vistas a configurar blogs de forma automática, utilizando:

    $ wp option set [opción] [valor]

    Tal y como sucedía con el ejemplo anterior, los nombres de las opciones, los podemos conseguir cuando obtenemos la lista, una de las cosas que podemos definir es:

    $ wp option set rss_use_excerpt 1

    El problema, como antes, surge cuando queremos cambiar uno de los valores que vienen en un array serializado, lo cual podríamos hacerlo de varias formas, entre ellas:

    • Podemos obtener el dato serializado en json:

      $ wp option get widget_categories –format=json

      luego editar el dato dentro del json resultante, por ejemplo el título, y volver a cargar en JSON las opciones:

      $ wp option set widget_categories –format=json ‘{“2”:{“title”:”Categor”,”Counts”:0,”hierarchical”:0,”dropdown”:0},”_multiwidget”:1}’

      aunque de esta forma necesitaríamos algo de interacción, o crear una expresión regular.

    • No obstante podemos utilizar PHP para convertir el JSON en un array, editar el contenido desde el array y volverlo a pasar a JSON:

      wp option set widget_categories “$(echo “{2}->title=’Categorias’; echo json_encode(\$original);” | php -n)”

      Estamos haciéndolo todo del tirón desde un script de bash. Veámoslo detenidamente:

      • wp option set widget_categories “VALOR” : definirá el valor en las opciones de WordPress. Aunque para definir el valor, vamos a utilizar una secuencia de comandos.
      • $(echo “<?php ÓRDENES PHP;” | php)” : Interpretará las órdenes en PHP y las pasará como argumento (al comando anterior)
      • $(wp option get widget_categories –format=json) : Obtendrá el valor en JSON de la opción widget_categories y lo pasará como argumento (que lo hemos metido dentro del PHP que estamos interpretando).
      • Como las variables PHP y las variables de BASH empiezan por $ para definir una variable en PHP tenemos que escapar el símbolo de $ poniendo una \ delante.

    Información sobre los posts

    Podemos, también obtener información sobre los posts publicados, como listarlos:

    $ wp post list

    donde obtendremos IDs, títulos, slugs, fechas y estados (si está publicado, borrador, programado…), aunque si leemos la documentación veremos opciones para filtrar la búsqueda por diferentes criterios; o bien, obtener información completa de un post concreto como:

    $ wp post get 1

    donde 1, en este caso es el ID del post que queremos visualizar, devolviéndonos algo como esto:

    +-----------------------+-----------------------------------------------------+
    | Field                 | Value                                               |
    +-----------------------+-----------------------------------------------------+
    | ID                    | 1                                                   |
    | post_author           | 1                                                   |
    | post_date             | 2016-06-12 13:37:08                                 |
    | post_date_gmt         | 2016-06-12 13:37:08                                 |
    | post_content          | Bienvenido a WordPress. Esta es tu primera entrada. |
    |                       |  Edítala o bórrala, ¡y comienza a escribir!         |
    | post_title            | ¡Hola mundo!                                        |
    | post_excerpt          |                                                     |
    | post_status           | publish                                             |
    | comment_status        | open                                                |
    | ping_status           | open                                                |
    | post_password         |                                                     |
    | post_name             | hola-mundo                                          |
    | to_ping               |                                                     |
    | pinged                |                                                     |
    | post_modified         | 2016-06-12 13:37:08                                 |
    | post_modified_gmt     | 2016-06-12 13:37:08                                 |
    | post_content_filtered |                                                     |
    | post_parent           | 0                                                   |
    | guid                  | http://mi-blog.com/?p=1                             |
    | menu_order            | 0                                                   |
    | post_type             | post                                                |
    | post_mime_type        |                                                     |
    | comment_count         | 1                                                   |
    +-----------------------+-----------------------------------------------------+
    

    Esto puede ser útil, incluso si ponemos –format=json en la llamada anterior para obtener toda la información del post y pasarla a otro programa o a un script y aplicarle un tratamiento, podríamos hacer búsquedas por contenido.

    Borrar posts automáticamente

    Igual que podemos crear, podemos destruir. Puede que alguna vez hayamos creado un post con fecha de caducidad, cuya información no es válida o no tiene sentido pasada una fecha, por ejemplo, si hacemos una campaña de publicidad de un producto o servicio. Podemos hacer que cuando llegue la fecha límite, dicha publicidad desaparezca:

    $ wp post delete ID

    que manda el post a la papelera la primera vez que se ejecuta (la segunda vez borra definitivamente el post) o,

    $ wp post delete ID –force

    que lo borra directamente.

    Aunque, si hemos generado varios posts de prueba, podemos eliminarlos todos de la siguiente manera:

    $ wp post delete {1..100}

    que borraría todos los posts con IDs comprendidas entre 1 y 100.

    Un escritor automático

    Para terminar con el listado de opciones de WP-CLI en este post (porque este programa da muchísimo más de sí), vamos a hablar de la escritura de posts de forma automática. En primer lugar, podemos generar una serie de posts idénticos, lo que nos puede servir para hacer pruebas con temas o plugins de la siguiente forma:

    $ curl http://loripsum.net/api/5 | wp post generate –post_content –count=10

    Así, primero nos bajamos un texto de lorem ipsum y luego lo pasamos al generador de posts, que creará 10 posts con ese contenido. Podríamos crear también páginas si añadimos (–post_type=page) o modificar la fecha con (–post-date “yyyy-mm-dd”).

    Aunque lo que de verdad se lleva la palma es la capacidad de enviar posts. Es decir, podríamos hacer un programa o script que creara un post o página automáticamente con contenidos de diferentes fuentes en diversas condiciones. Podemos poner como ejemplo un post que se envíe automáticamente cuando da lluvia a través de una web meteorológica o si queremos dejar volar nuestra imaginación, cuando nuestro proyecto con Arduino detecta lluvias; o incluso un post que se despida del mundo cuando estemos muertos si, por ejemplo, llevamos mucho tiempo sin entrar en el servidor o hacer una tarea rutinaria, sólo por poner algunos ejemplos.
    A la hora de enviar el post debemos hacer lo siguiente:

    $ wp post create [fichero_de_contenidos] –post-type=post –post-title=”Título de mi post” –post-category=12,32,54

    De esta forma leeremos un fichero de texto con el contenido del post (que también podemos generarlo con un script o descargarlo…), en el tipo podríamos especificar post o página, el título lo podemos personalizar también así como la categoría (que tiene que ir por número).

    También podemos programar un post si especificamos –post-status=future –post-date=”yyyy-mm-dd HH:MM:SS”.

    Y mucho más…

    Podría rellenar varios posts con las capacidades de WP-CLI, pero debemos dejar algo a la imaginación y la investigación. ¿Qué más cosas podemos hacer?

    • Administrar usuarios
    • Administrar los permisos de los diferentes roles de usuarios (wp cap)
    • Administrar cachés (wp cache)
    • Administrar tareas programadas o cron jobs (wp cron)
    • Administrar menús
    • Administrar plugins del propio WP-CLI que nos permitirán funciones personalizadas (wp package)
    • Muchísimo más

    WP-CLI en Siteground

    Siteground España es un proveedor especializado en servicios de hosting WordPress profesionales con servidores robustos y que facilita enormemente la labor de administrar un blog con WordPress manteniendo constantemente todos los sistemas al día.

    Y, por supuesto, no podían dejar a los amantes de la consola de lado, proporcionando un acceso por SSH a los servidores, y por supuesto, disponemos de una instalación de WP-CLI siempre actualizada.

    Para conectar por SSH a nuestro sitio de SiteGround, primero, debemos acceder a cPanel y buscar en las opciones Acceso SSH Shell
    Screenshot 16-06-2016-000641
    Luego, en la siguiente pantalla, debemos configurar nuestra clave RSA, para ello, aunque SiteGround nos permite generar un par de claves desde el entorno web y descargarnos nuestra clave privada (que luego tendremos que copiar en nuestro equipo), yo prefiero ejecutar lo siguiente en mi terminal:

    $ ssh-keygen -b 4096

    Luego puedo guardar mi clave en mi ordenador, y subir la clave pública (copiar y pegar) donde pone Upload SSH key:
    Screenshot 16-06-2016-000649

    Luego, una vez hecho esto, basta con acceder al SSH de nuestro servidor en SiteGround desde un terminal:

    $ ssh -p 18765 [usuario]@[dominio.com]

    Donde el usuario es el mismo que utilizas para entrar en el panel de control de SiteGround y el dominio es tu dominio principal del hosting.

    Ahora, sólo puedo decir una cosa… ¡ a disfrutar !

    Referencias

    Al ser un post patrocinado, y como hice otras veces, los enlaces externos que incluyo a lo largo del post, los resumo aquí, y que los enlaces de la marca sean los primeros.

  1. Wordperfect
  2. Andreas Creten
  3. Cristi Burcă
  4. Daniel Bachhuber
  5. WP-CLI oficial
  6. Installing WP-CLI
  7. Cómo activar MultiSitio en WordPress
  8. Backup WordPress Plugin
  9. 21 Consultas SQL para administrar fácilmente nuestro WordPress

Foto: Austin Schmid

También podría interesarte...

Leave a Reply