Leggere, scrivere e/o modificare i contenuti su WordPress non sempre può essere fatto da un’interfaccia di amministrazione (sia questa web, mobile o app). Ci possono essere esigenze in cui è necessario automatizzare alcuni processi appoggiandosi a strumenti esterni.
WordPress ci viene incontro con “una cosa” nota come XML-RPC.
In pratica si tratta di un componente che ci permette di dialogare secondo un protocollo standard attraverso internet. In questo modo un sito e/o applicazione esterna potrebbe pilotare la nostra installazione facendogli fare qualsiasi cosa.
In realtà “qualsiasi cosa” non è ancora prevista ma dalla nuova versione 3.4 ne saranno aggiunte parecchie. Ricordatevi solo di abilitarlo che di default è disattivato.
Il titolo di questo articolo però è “Estendere il server XML-RPC” non “Usare il server XML-RPC” quindi iniziamo a vedere cosa ci dice il codex: XML-RPC Extending
Like the rest of WordPress, the XML-RPC API contains numerous hooks to customize or extend its behavior.
Nel caso volessimo estendere il servizio XML-RPC attraverso un plugin in grado di restituire gli ultimi post non dovremo quindi fare altro che aggiugnere una roba come questa:
// aggiungo il fitro
add_filter( 'xmlrpc_methods', 'mycustom_methods');
// dichiaro i nuovi metodi
function mycustom_methods( $methods ) {
$methods['getlastposts'] = 'get_LastPosts';
return $methods;
}
/*
* restisuisco gli ultimi n. post in formato serializzato
*/
function get_LastPosts( $params ) {
$args = $params[0]
$defaults = array(
'numberposts' => 5,
'post_type' => 'post',
'post_status' => 'publish'
);
$args = wp_parse_args( $args, $defaults );
$posts = get_posts( $args );
// restituisco l'oggetto serializzato
return serialize($posts);
}
Questo invece un esempio di come poter usare il vostro “nuovo” metodo usando il client offerto dalla libreria Zend
$client = new Zend_XmlRpc_Client('http://tuosito.com/xmlrpc.php');
$response = $client->call('getlastposts');
$posts = deserialize($response)
//con passaggio di parametri
$client = new Zend_XmlRpc_Client('http://tuosito.com/xmlrpc.php');
$args = array(
'numberposts' => 3,
'post_type' => 'page'
);
$response = $client->call('getlastposts' , array( $args));
$posts = deserialize($response)
Le cose nella pratica non sono così semplici e potrebbe servire un sistema di autenticazione.
Poi dato che spesso parlo di performance male non farebbe un piccolo sistema di cache.
Ecco quindi una nuova versione di “get_LastPosts” che accetta come parametri $blog_id, $username, $password e poi array con gli argomenti necessari a getposts.
function get_LastPosts( $params ) {
$blog_id = $params[0]
$username = $params[1]
$password = $params[2]
$args = $params[3]
$defaults = array(
'numberposts' => 5,
'post_type' => 'post',
'post_status' => 'publish'
);
$args = wp_parse_args( $args, $defaults );
extract( $args, EXTR_SKIP );
if ( !$user = $this->login($username, $password) ) {
// user o password non validi
return false;
} else {
// creo una chiave univoca per la cache
$cache_key = "_xmlrpc_" . $username. md5( $numberposts . $post_type);
$posts = get_transient( $cache_key );
if (false === $posts) {
$posts = get_posts( $args );
set_transient( $cache_key , $posts, 60*60*4 );
}
// restituisco l'oggetto serializzato, compresso, ed in base64
// per ripristinarlo: unserialize(gzuncompress(base64_decode($posts)));
return base64_encode(gzcompress(serialize($posts)));
}
}
Bene, adesso potete fare un po’ di prove e se nel fare copia e incolla ho sbagliato qualche cosa ditemlo che lo correggo.
