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.
