18

私はアマゾンのアフィリエイトワードプレスページに取り組んでいます。そのために、aws_signed_request関数を使用して、Amazonから価格とリンクを取得しています。

xmlを返すaws_signed_request関数は次のとおりです。

    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;
    }
} 

その後、私は投稿からasinを取得し、リンクと価格を生成します

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."; 
}

$linkと$priceをエコーすると、これはすべてかなりうまく機能します。しかし、ワードプレスの投稿のカスタムフィールドに値を保存したいので、毎回関数を実行する必要はありません。

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

これにより、価格が正しい値として追加されますが、リンクを追加すると、次のエラーメッセージが表示されます。

キャッチされなかった例外「例外」とメッセージ「「SimpleXMLElement」のシリアル化は許可されていません」。

しかし、$ parsed_xml = ...関数を削除すると、空の値が保存されます。

4

1 に答える 1

36

(ほぼ) SimpleXML オブジェクトをトラバースしているときに返されるものはすべて、実際には別の SimpleXML オブジェクトです。オブジェクトをリクエストすると、 XML ノードを表すオブジェクトが返されるので、そのオブジェクトを$item->OfferSummary->LowestNewPrice->Amountリクエストできます。これは属性にも適用されることに注意してください -文字列ではなくオブジェクトになります!->OfferSummary$itemOfferSummary->LowestNewPrice$someNode['someAttribute']

要素または属性の文字列コンテンツを取得するには、構文を使用して「キャスト」する必要があります(string)$variable。時々、PHP はあなたがこれを行うつもりであることを認識し、あなたのためにそれをecho行います。 . を使用して整数にキャストすることも、 を使用し(int)て浮動小数点数にキャストすることもでき(float)ます。

問題の 2 番目の部分は、SimpleXML オブジェクトがかなり特別にメモリに格納され、「シリアル化」できないことです (つまり、オブジェクトを完全に説明する文字列に変換されます)。これは、それらをデータベースまたはセッションに保存しようとすると、表示されているエラーが発生することを意味します。実際に XML のブロック全体を保存したい場合は、$foo->asXML().

つまり、要するに:

  • $link = (string)$item->DetailPageURL;オブジェクトではなく文字列を取得するために使用します
  • update_post_meta($post->ID, 'ItemXML', $item->asXML());アイテム全体を保管したい場合に使用します
于 2013-02-16T21:26:44.283 に答える