2013-02-16 15 views
11

Sto lavorando su una pagina wordpress di affiliazione su Amazon. Per quello sto usando la funzione aws_signed_request per ottenere il prezzo e il link da Amazon.'La serializzazione di' SimpleXMLElement 'non è consentita durante il salvataggio in Wordpress post_meta

Ecco la funzione aws_signed_request restituire il xml:

function aws_signed_request($region, $params, $public_key, $private_key, $associate_tag) { 
    $method = "GET"; 
    $host = "ecs.amazonaws.".$region; 
    $uri = "/onca/xml"; 

    $params["Service"]   = "AWSECommerceService"; 
    $params["AWSAccessKeyId"] = $public_key; 
    $params["AssociateTag"]  = $associate_tag; 
    $params["Timestamp"]  = gmdate("Y-m-d\TH:i:s\Z"); 
    $params["Version"]   = "2009-03-31"; 

    ksort($params); 

    $canonicalized_query = array(); 

    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; 

    /* calculate the signature using HMAC, SHA256 and base64-encoding */ 
    $signature = base64_encode(hash_hmac("sha256", 
            $string_to_sign, $private_key, True)); 

    /* encode the signature for the request */ 
    $signature = str_replace("%7E", "~", rawurlencode($signature)); 

    /* create request */ 
    $request = "http://".$host.$uri."?".$canonicalized_query."&Signature=".$signature; 

    /* I prefer using CURL */ 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL,$request); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 15); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 

    $xml_response = curl_exec($ch); 

    if ($xml_response === False) 
    { 
     return False; 
    } 
    else 
    { 
     $parsed_xml = @simplexml_load_string($xml_response); 
     return ($parsed_xml === False) ? False : $parsed_xml; 
    } 
} 

Dopo che ho l'ASIN dal post e generare il link e il prezzo

global $post; 
$asin = get_post_meta($post->ID, 'ASIN', true); 

$public_key = 'xxxxxxxxxxx'; 
$private_key = 'xxxxxxxxxxx'; 
$associate_tag = 'xxxxxxxxxxx'; 

$xml = aws_signed_Request('de', 
array(
    "MerchantId"=>"Amazon", 
    "Operation"=>"ItemLookup", 
    "ItemId"=>$asin, 
    "ResponseGroup"=>"Medium, Offers"), 
$public_key,$private_key,$associate_tag); 

$item = $xml->Items->Item; 

$link = $item->DetailPageURL; 
$price_amount = $item->OfferSummary->LowestNewPrice->Amount; 
if ($price_amount > 0) { 
    $price_rund = $price_amount/100; 
    $price = number_format($price_rund, 2, ',', '.'); 
} else { 
    $price= "n.v."; 
} 

Tutto questo funziona abbastanza bene quando mi associo il $ link e $ prezzo. Ma voglio salvare i valori nei campi personalizzati del post wordpress in modo da non dover eseguire la funzione ogni volta.

update_post_meta($post->ID, 'Price', $price); 
update_post_meta($post->ID, 'Link', $link); 

Questo aggiunge il prezzo come il valore corretto, ma quando voglio aggiungere il link ottengo questo messaggio di errore:

Uncaught eccezione 'Eccezione' con il messaggio 'La serializzazione di 'SimpleXMLElement' non è consentito 'in ...

Ma quando rimuovo la funzione $ parsed_xml = ..., salva un valore vuoto.

+0

possibile duplicato del [eccezione Uncaught 'Eccezione' con messaggio 'La serializzazione di' SimpleXMLElement 'non è consentita'] (http://stackoverflow.com/questions/6058966/uncaught-exception-exception-with-message-serialization-of-simplexmlelement) – hakre

risposta

27

(Quasi) tutto restituito quando si attraversa un oggetto SimpleXML è in realtà un altro oggetto SimpleXML. Questo è ciò che consente di scrivere $item->OfferSummary->LowestNewPrice->Amount: la richiesta di ->OfferSummary nell'oggetto $item restituisce un oggetto che rappresenta il nodo XML OfferSummary, quindi è possibile richiedere ->LowestNewPrice su tale oggetto e così via. Nota che questo vale anche per gli attributi - $someNode['someAttribute'] sarà un oggetto, non una stringa!

Per ottenere il contenuto di stringa di un elemento o attributo, è necessario "eseguirne il cast", utilizzando la sintassi (string)$variable. A volte, PHP saprà che intendevi farlo e farlo per te - ad esempio quando usi echo - ma in generale, è buona norma eseguire il cast dello in modo da stringere manualmente in modo da non avere sorprese se cambi il tuo codice più tardi. È inoltre possibile eseguire il cast su un numero intero utilizzando (int) o un valore float utilizzando (float).

La seconda parte del problema è che gli oggetti SimpleXML sono memorizzati in modo speciale nella memoria e non possono essere "serializzati" (cioè trasformati in una stringa che descrive completamente l'oggetto). Ciò significa che se provi a salvarli in un database o sessione, otterrai l'errore che stai vedendo. Se si desidera effettivamente salvare un intero blocco di XML, è possibile utilizzare $foo->asXML().

Così, in breve:

  • uso $link = (string)$item->DetailPageURL; per ottenere una stringa piuttosto che un oggetto
  • uso update_post_meta($post->ID, 'ItemXML', $item->asXML()); se mai desidera memorizzare l'intero oggetto