Chiamate remote a URL con WordPress

Quando si vuole integrare WordPress con sistemi esterni, spesso si passa per le API dei servizi stessi, ovvero effettuare chiamate in maniera programmatica a URL ben definiti, i quali rispondono con un set di dati che andremo poi ad elaborare.

Ora, tipicamente, quando detti servizi inseriscono nella documentazione degli esempi in PHP da seguire, il codice riportato fa uso di cURL, una libreria ampiamente diffusa che serve, appunto, a chiamare un URL e conservare il contenuto della risposta.

Sebbene perfettamente adeguato allo scopo, due sono, per quel che mi riguarda, i problemi nell’utilizzare cURL.

Per cominciare, la sua sintassi non è di immediata memorizzazione:

$curl = curl_init( 'https://andreagandino.com' );
curl_setopt( $curl, CURLOPT_POST, true );
curl_setopt( $curl, CURLOPT_POSTFIELDS, array( 'field1' => 'primo parametro', 'field2' => 'secondo parametro' ) );
curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true );
$response = curl_exec( $curl );
curl_close( $curl );

Inoltre, su alcuni server cURL potrebbe, per ragioni di sicurezza, essere disabilitato, rendendo completamente vano il codice riportato sopra.

In casi come questo, WordPress viene incontro allo sviluppatore, mettendo a disposizione funzioni di alto livello che consentono non solo di bypassare la verbosità del codice precedentemente illustrato, ma di fornire anche un fallback, qualora cURL non sia disponibile.

È il caso delle funzioni wp_remote_get e wp_remote_post, le quali consentono di effettuare chiamate a URL remoti, senza preoccuparsi tropp dei dettagli tecnici sottesi alle chiamate stesse (per chi volesse approfondire, entrambe le funzioni si basano sulla classe WP_Http).

La parola chiave di tutto questo discorso è però l’aggettivo “remoto”.

Può capitare, com’è successo a noi quando stavamo progettando l’infrastruttura del nostro shop, di dover simulare, sulla stessa macchina, sia il server, sia un client; dal momento che WordPress, diciamo, valida gli URL che chiama tramite le proprie funzioni, ogni chiamata verso un indirizzo locale verrà irrimediabilmente rigettata.

Esiste, però, un filtro molto utile in questo caso che, se applicato, consente di “far credere” a WordPress che qualsiasi chiamata effettuata tramite la HTTP API sia diretta ad un host remoto, anche quando così non fosse.

add_filter( 'http_request_host_is_external', '__return_true' );

Ovviamente, questa direttiva deve tassativamente essere applicata esclusivamente in fase di sviluppo e, qualora decidessimo di utilizzarla, dovremo successivamente assicurarci che non faccia parte del sorgente di produzione.