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.