WordPress è un famosissimo CMS alla base di moltissimi siti web oramai. Nato per creare e gestire blog (come InformaticaLab), grazie alla sua flessibilità viene utilizzato anche per la realizzazione di siti vetrina o come sistema di backend per applicazioni.

Il problema principale di utilizzare un software dinamico come wordpress è che richiedono manutenzione periodica.
Un sito vetrina come ad esempio il sito di un tabaccaio, viene spesso creato per essere in “sola lettura”, ovvero non prevede frequenti aggiornamenti di contenuti. Questo ci porta inevitabilmente a dimenticare la necessaria manutenzione, come ad esempio l’aggiornamento dei plugins o del core di WordPress.

Non aggiornare un sistema vulnerabile, porta inevitabilmente all’exploiting da parte di un malintenzionato.

Ospitando poi multipli siti sullo stesso hosting, se non abbiamo previsto un sistema di utenti o di permessi efficace potremmo ritrovarci in guai seri.

Solo per questo motivo secondo me, vale la pena l’idea di considerare WP-CLI: un tool da linea di comando creato dagli autori di WordPress (Automattic) che fra le varie funzionalità consente di aggiornare plugin, core e temi.

Come installare il tool

L’installazione è molto facile e indolore. Scarichiamo il file phar:

curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar

Verifichiamo che sia stato scaricato correttamente:

php wp-cli.phar --info

E lo spostiamo in una posizione raggiungibile dal nostro path. Per installarlo per tutti gli utenti ad esempio:

chmod +x wp-cli.phar
sudo mv wp-cli.phar /usr/local/bin/wp

Comandi utili

Di comandi ce ne sono parecchi. Alcuni dei comandi che mi sono tornati utili finora sono:

  • wp core download: per scaricare l’ultima versione di wordpress, già unzippata e pronta per l’installazione.
  • wp core install --url=example.com --title=Example --admin_user=supervisor --admin_password=strongpassword --admin_email=info@example.com: Per installare wordpress
  • wp core update: Aggiorna l’installazione di WordPress all’ultima versione
  • wp plugin list: Lista i plugins installati
  • wp plugin update --all: Aggiorna tutti i plugin
  • wp core verify-checksums: Per verificare che i nostri file siano integri.

Tenere le installazioni aggiornate

Visto che abbiamo questa fantastica cli, potrebbe essere utile creare un file bash per tenere aggiornate tutte le installazioni (core e plugins) sul nostro hosting.
Ecco un esempio di script in bash che potrebbe fare al caso nostro:

#!/bin/bash
updateWp ()
{
    DIR=$1
    pushd .
    cd $DIR/public_html
    if $(wp core is-installed 2> /dev/null); then
        echo "Updating: " $DIR  
        wp core update
        wp plugin update --all
        wp theme update --all
    fi
    popd

}
for dir in *
 do
    updateWp $dir
done

Con esecuzione:

/var/www /var/www
Updating:  informaticalab.com
Success: WordPress is up to date.
Enabling Maintenance mode...
Downloading update from https://downloads.wordpress.org/plugin/wordpress-seo.8.1.zip...
Unpacking the update...
Installing the latest version...
Removing the old version of the plugin...
Plugin updated successfully.
Disabling Maintenance mode...
+---------------+-------------+-------------+---------+
| name          | old_version | new_version | status  |
+---------------+-------------+-------------+---------+
| wordpress-seo | 8.0         | 8.1         | Updated |
+---------------+-------------+-------------+---------+
Success: Updated 1 of 1 plugins.

L’ideale sarebbe quindi di prendere questo script e inserirlo all’interno di un cronjob, ed eseguirlo quotidianamente.

Caveat

  • WordPress ha una funziona di auto aggiornamento del core (disattivabile dall’utente), ma non mi pare ci sia per i plugins solitamente la parte più vulnerabile di un’instanza WordPress.
  • Aggiornare WordPress potrebbe portare a problemi di incompatibilità con plugin o temi. Per siti non aggiornati da un bel po’.
  • Lo script dovrebbe essere eseguito dal proprietario dell’installazione (e non da root o altri utenti). Dovrebbe essere possibile modificare lo script per includere questa funzionalità.