Estendere il server XML-RPC di WordPress

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.

Lascia una risposta

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *