WordPress: usare i web services nei temi

WordPress: usare i web services nei temi

WordPress può interagire facilmente con i web services messi a disposizione dalle varie piattaforme. In questo articolo vedremo come implementare un esempio di tale integrazione nei temi.

Come funziona un web service

Un web service funziona mediante un’architettura client-server. Noi (client) effettuiamo una richiesta e il server remoto esegue un’azione restituendo solitamente un output che ci informa sull’esito dell’azione oppure ci fornisce dei dati che abbiamo richiesto.

Solitamente i verbi HTTP usati sono GET e POST. Un web service può anche scegliere di far eseguire le sue azioni solo in POST se il suo design è concepito in tale modo.

Per esempio per inserire un file su Amazon S3 effettueremo una richiesta e il web service ci comunicherà se il trasferimento ha avuto successo.

Come avviene tutto questo? Tramite le API messe a disposizione dal web service di cui dovremmo studiare esempi e documentazione ed eventualmente scaricare un SDK in PHP.

Quando si usa un SDK occorre verificare la compatibilità con la versione di PHP in uso sul server: infatti alcune feature potrebbero funzionare solo da una determinata versione di PHP in poi (come i namespace).

Usare le API di Amazon per reperire informazioni sui prodotti

Possiamo usare le API AWS (Amazon Advertising API) per reperire informazioni relative ai prodotti presenti su Amazon.

Per far questo ci occorrono le credenziali di accesso alle API.

Per prima cosa definiamo una funzione per effettuare la richiesta. Ci servono anche il codice ASIN del prodotto e la regione di riferimento.


function my_aws_signed_request( $region, $params ) {
 
	$public_key = "chiave pubblica";
	$private_key = "chiave privata";
 
	$method = "GET";
	$host = "ecs.amazonaws." . $region;
	$host = "webservices.amazon." . $region;
	$uri = "/onca/xml";
 
	$params["Service"] = "AWSECommerceService";
	$params["AssociateTag"] = "affiliate-20"; // Il vostro codice Affiliate
	$params["AWSAccessKeyId"] = $public_key;
	$params["Timestamp"] = gmdate( "Y-m-d\TH:i:s\Z" );
	$params["Version"] = "2015-06-20";
 
	ksort( $params );
 
	$canonicalized_query = array();
	
	// Prepariamo la query con i parametri passati
	
	foreach ( $params as $param => $value ) {
		$param = str_replace( "%7E", "~", rawurlencode( $param ) );
		$value = str_replace("%7E", "~", rawurlencode( $value ) );
		$canonicalized_query[] = $param . "=" . $value;
	}
 
	$canonicalized_query = implode( "&", $canonicalized_query );
 
	$string_to_sign = $method . "\n" . $host . "\n" . $uri . "\n" . $canonicalized_query;
	
	// Prepariamo la firma (signature)
	
	$signature = base64_encode( hash_hmac( "sha256", $string_to_sign, $private_key, true ) );
	$signature = str_replace( "%7E", "~", rawurlencode( $signature ) );
 
	$request = "http://" . $host . $uri . "?" . $canonicalized_query . "&Signature=" . $signature;
	$response = wp_remote_get( $request );
 
	if( !is_wp_error( $response ) ) {
 
		$pxml = @simplexml_load_string( $response["body"] );
		
		if ( $pxml === false ) {
			return false;
		} else {
			return $pxml;
		}
	} else {
		return false;
	}
}

Amazon restituisce una risposta in formato XML. Dobbiamo quindi effettuare il parsing del documento XML restituito:


function my_aws_get_product_info( $region, $asin ) {
 
	$xml = my_aws_signed_request( $region, array(
		"Operation" => "ItemLookup", // Richiediamo informazioni
		"ItemId" => $asin, // Codice ASIN
		"IncludeReviewsSummary" => false, // Nessuna recensione
		"ResponseGroup" => "Medium,OfferSummary" // Informazioni di base
	));
	
	$info = null;
 
	$item = $xml->Items->Item;
	
	$title = htmlentities( ( string ) $item->ItemAttributes->Title );
	$url = htmlentities( ( string ) $item->DetailPageURL );
	$image = htmlentities( ( string ) $item->MediumImage->URL );
	$price = htmlentities( ( string ) $item->OfferSummary->LowestNewPrice->Amount );
	$code = htmlentities( ( string ) $item->OfferSummary->LowestNewPrice->CurrencyCode );
	$qty = htmlentities( ( string ) $item->OfferSummary->TotalNew );
 
	if ( $qty !== "0" ) { // Solo se il prodotto è disponibile
		$info = array(
			"code" => $code,
			"price" => number_format( ( float ) ( $price / 100 ), 2, '.', '' ),
			"image" => $image,
			"url" => $url,
			"title" => $title
		);
	}
 
	return $info;
}

Abbiamo ottenuto il titolo del prodotto, l'URL della sua pagina, l'URL della sua immagine, il prezzo, la valuta e la quantità.

La funzione può essere usata in questo modo:


$product_info = my_aws_get_product_info( "com", "B00KQPGRRE" );
if( !is_null( $product_info ) ) {
	//...
}

Conclusione

Lavorare con i web services nei temi di WordPress non è differente dall'operare in altri contesti. Quello che è importante è capire bene come funzionano le API di riferimento. Per far ciò occorre studiare con attenzione la documentazione fornita.

Torna su