Dominare WordPress con la linea di comando

Qualche volta i classici strumenti di manutenzione di WordPress non sono abbastanza se vogliamo avere un maggiore controllo sulla manutenzione del nostro sito. In questi casi, se il fornitore di hosting ci consente gli accessi via terminale SSH, uno script a linea di comando può essere una soluzione più efficace.

Diciamo che abbiamo bisogno di importare o esportare dei dati da un file di backup molto grande, di circa 50.000 articoli e 200.000 categorie e tag, e che ogni oggetto debba essere a sua volta elaborato (es. ripulitura del codice, scaricamento delle immagini, ecc).

Con uno script web possiamo facilmente andare incontro ad alcuni tipici problemi:

  • l'esecuzione dello script dura troppo a lungo e viene terminata dal server
  • lo script necessita di più memoria di quella fornita dal server

Se il vostro problema è di questo tipo, può essere risolto agilmente con uno script a linea di comando. Inoltre, sempre se il vostro fornitore lo consente, potete impostare un vero script di cron anzichè affidarvi alla funzione pseudo-cron di WordPress per gestire gli eventi temporizzati. Ma cominciamo a vedere un po' di codice.

Passo 1 - Impostiamo il nostro ambiente

La prima cosa da fare è creare un ambiente in cui possiamo eseguire i nostri script. Una soluzione possibile è la creazione di una directory wp-content/bin in cui ospitare tutti i nostri script.

Il primo e più importante file che andiamo a creare è chiamato cli.php, contiene il codice comune a tutti gli script (una sola istruzione per il momento) e deve assolutamente essere incluso in tutti gli script, vediamo perché:

if ('cli' != php_sapi_name()) exit("Not this way babe!\n");

Questa istruzione dice al nostro interprete PHP che lo script deve essere eseguito solo ed esclusivamente se lo stiamo chiamando da una console. È possibile aggiungere altre funzioni comuni a questa libreria, ma per il momento questa è la più importante. Ora andiamo a scrivere il nostro primo script che si chiamerà test-posts.php e recupererà la lista degli articoli più recenti.

Passo 2 - Impostazioni di sicurezza

Non è un passo obbligatorio, ma caldamente raccomandato: possiamo impostare il nostro script in modo che possa essere eseguito solo da alcuni utenti e inoltre possiamo anche impostare una password da passare alla riga di comando.

Importante: Assicuratevi che i permessi di accesso ai vostri script siano impostati in modo da impedire l'accesso e l'esecuzione ad utenti non autorizzati. Questo dipende da come è impostato il vostro sistema, ma in generale impostando i permessi a 600 potrà essere eseguito solo dal proprietario con il comando

$ php -f test-posts.php

Quindi con queste righe di codice possiamo impostare una restrizione a livello utente.

$users = array('someuser', 'anotheruser');
$cli_user = exec('whoami');
if (!empty($users)) {
    if (!in_array($cli_user, $users)) {
        echo "Your username ({$cli_user}) is not in my list babe!\n";
        exit(1);
    } // end if
} // end if

Poi potremmo voler richiedere il passaggio di una chiave segreta alla riga di comando, per esempio:

$ php -f test-posts.php -- --key=SuperSecretKey

Possiamo ottenere questo con queste istruzioni:

if (!defined('CLI_SECRET')) define('CLI_SECRET', 'SuperSecretKey');
if (CLI_SECRET !== '') {

    // Check for arguments
    if ($argc < 2) {
        echo "Invalid arguments: a super secret code is needed to run this script!\n";
        printf("Usage: /path/to/php -f %s -- --key=<supersecret>\n", basename(__FILE__));
        exit(2);
    } // end if

    // Parsing arguments: move the secret key (if present) to $_GET['key'] var.
    $args = split('=', $argv[1]);
    if ('--key' == $args[0]) $_GET['key'] = $args[1];

        // Do stuff
        if(CLI_SECRET !== $_GET["key"]){

        echo "Access denied!\n";
        exit(3);

    } // end if

} // end if

Passo 3 - Carichiamo WordPress

Ora possiamo caricare l'ambiente di WordPress all'interno del nostro script e con il prossimo passo andremo invece a scrivere il nostro codice personalizzato.

Dobbiamo tenere conto che alcuni plugin potrebbero interferire con questa fase, in particolare quei plugin che fanno uso di cookie o intestazioni HTTP potrebbero lamentarsi se visualizziamo qualcosa a video prima che il caricamento di WordPress sia terminato.

Con la prossima istruzione ci assicuriamo innanzitutto che i plugin di gestione della cache tipo WPSuperCache vengano disattivati.

$_POST['wp_cache_status'] = 'none';

Poi includiamo i file necessari per il caricamento di WordPress (il percorso esatto dipende da dove si trovano i file nella vostra installazione).

$wpLoader = realpath(dirname(__FILE__) . '/../../wp-load.php');
require_once($wpLoader);

A questo punto se non ci sono errori possiamo accedere ai dati di WordPress.

Passo 4 - Accesso e gestione dei dati

Giunti a questa fase possiamo utilizzare tutte le API fornite da WordPress e dai plugin correntemente attivati. Il codice di esempio qui di seguito recupera l'elenco dei post più recenti:

$posts = get_posts();
foreach ($posts as $post) {
    setup_postdata($post);
    echo " - ";
    the_title();
    echo "\n";
} // end foreach

Possiamo eseguire lo script con il comando:

php -f test-posts.php -- --key=SuperSecretKey

E l'output sarà simile a:

WordPress successfully loaded!

 - Lorem ipsum dolor sit amet
 - Consectetur adipisicing elit
 - Duis aute irure dolor in reprehenderit
 - ...
 - Last post of the list

Un buon punto di partenza

Utilizzando questo esempio come un template, possiamo fare più o meno tutto quello che vogliamo sul nostro blog. Il limite è come sempre la nostra fantasia.

Vi invito quindi a scaricare il codice sorgente degli script e a postare nei commenti le vostre opinioni, domande e suggerimenti.

Articolo pubblicato in Tips & Tricks, Wordpress ed etichettato , , . Aggiungi il permalink ai segnalibri. Segui i commenti a questo articolo con il suo Feed RSS. Post a comment or leave a trackback: Trackback URL.