use*_*789 16 php wordpress simplexml amazon-web-services
我正在亚马逊联盟wordpress页面上工作.为此,我使用aws_signed_request函数来获取亚马逊的价格和链接.
这是返回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;
}
}
Run Code Online (Sandbox Code Playgroud)
之后我从帖子中获取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.";
}
Run Code Online (Sandbox Code Playgroud)
当我回复$ link和$ price时,这一切都很好.但我想将值保存在wordpress帖子的自定义字段中,所以我不必每次都运行该函数.
update_post_meta($post->ID, 'Price', $price);
update_post_meta($post->ID, 'Link', $link);
Run Code Online (Sandbox Code Playgroud)
这会将价格添加为正确的值,但是当我想添加链接时,我收到以下错误消息:
未被捕获的异常'异常',消息'序列化'SimpleXMLElement'不允许'在...中
但是当我删除$ parsed_xml = ...函数时,它会保存一个空值.
IMS*_*SoP 35
(几乎)当您遍历SimpleXML对象时返回的所有内容实际上是另一个SimpleXML对象.这是允许您编写的内容$item->OfferSummary->LowestNewPrice->Amount:->OfferSummary对$item对象的请求返回表示OfferSummaryXML节点的对象,因此您可以请求->LowestNewPrice该对象,依此类推.请注意,这也适用于属性 - $someNode['someAttribute']将是一个对象,而不是一个字符串!
为了获取元素或属性的字符串内容,您必须使用语法"强制转换"它(string)$variable.有时,PHP会知道你打算这样做,并为你做 - 例如在使用时echo- 但一般情况下,总是手动转换为字符串是一种好习惯,这样如果以后更改代码就不会有任何意外.您也可以使用(int)或使用浮点数转换为整数(float).
问题的第二部分是SimpleXML对象存储在内存中,而不是"序列化"(即变成完全描述对象的字符串).这意味着如果您尝试将它们保存到数据库或会话中,您将收到您所看到的错误.如果您确实想要保存整个XML块,则可以使用$foo->asXML().
简而言之:
$link = (string)$item->DetailPageURL;得到一个字符串,而不是一个对象update_post_meta($post->ID, 'ItemXML', $item->asXML());如果你想存储整个项目| 归档时间: |
|
| 查看次数: |
21871 次 |
| 最近记录: |