Wordpress post_meta에 저장할 때 'SimpleXMLement' 직렬화가 허용되지 않습니다.
저는 아마존 어필리에이트 워드프레스 페이지에서 일하고 있습니다.그 때문에, amazon으로부터 가격과 링크를 취득하기 위해서, 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;
}
}
그 후 포스트에서 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를 반복하면 이 모든 것이 잘 작동합니다.단, Wordpress post 커스텀 필드에 값을 저장하여 매번 기능을 실행할 필요가 없습니다.
update_post_meta($post->ID, 'Price', $price);
update_post_meta($post->ID, 'Link', $link);
그러면 가격이 올바른 값으로 추가되지만 링크를 추가할 때 다음 오류 메시지가 나타납니다.
'SimpleXMlement의 직렬화는 허용되지 않습니다'라는 메시지와 함께 예외 '예외'가 검출되지 않았습니다...
그러나 $parsed_xml=을 제거하면...함수는 빈 값을 저장합니다.
(거의) SimpleXML 오브젝트를 통과할 때 반환되는 모든 것은 실제로는 다른 SimpleXML 오브젝트입니다.이것이 당신이 글을 쓸 수 있게 해주는 것이다.$item->OfferSummary->LowestNewPrice->Amount
: 요청 중->OfferSummary
에서$item
object는 다음을 나타내는 개체를 반환합니다.OfferSummary
XML 노드, 즉 사용자가 요청할 수 있습니다.->LowestNewPrice
그 물건에 대해서요.이는 Atribute에도 적용됩니다.$someNode['someAttribute']
문자열이 아닌 객체가 됩니다!
요소 또는 속성의 문자열 내용을 가져오려면 구문을 사용하여 "캐스팅"해야 합니다.(string)$variable
때때로 PHP는 당신이 이 일을 하려고 했다는 것을 알고 당신을 위해 그것을 할 것입니다 - 예를 들어, 사용했을 때echo
·일반적으로, 나중에 코드를 변경해도 놀라지 않도록, 항상 수동으로 스트링에 캐스트 하는 것이 좋습니다.다음 방법으로 정수로 캐스팅할 수도 있습니다.(int)
, 또는 를 사용하여 플로트(float(float)
.
문제의 두 번째 부분은 SimpleXML 객체가 특별히 메모리에 저장되기 때문에 "시리얼라이즈"할 수 없다는 것입니다(즉, 객체를 완전히 설명하는 문자열로 변환됩니다).즉, 데이터베이스 또는 세션에 저장하려고 하면 오류가 나타납니다.XML 블록 전체를 실제로 저장하려면$foo->asXML()
.
요컨대:
- 사용하다
$link = (string)$item->DetailPageURL;
(물건이 아닌) 끈을 잡다 - 사용하다
update_post_meta($post->ID, 'ItemXML', $item->asXML());
아이템 전체를 저장하고 싶다면
언급URL : https://stackoverflow.com/questions/14912551/serialization-of-simplexmlelement-is-not-allowed-when-saving-in-wordpress-pos
'source' 카테고리의 다른 글
react-select v2에서 optgroup을 작성하려면 어떻게 해야 합니까? (0) | 2023.02.09 |
---|---|
오류 TS2339: 유형 '에 대한 속성'이 없습니다.HTML Props' (0) | 2023.02.09 |
SQL 오류: ORA-00942 테이블 또는 뷰가 존재하지 않습니다. (0) | 2023.02.09 |
농담, 효소:불변 위반:또는 Router()를 외부에서 사용하여서는 안 됩니다. (0) | 2023.02.09 |
Angular 5의 URL에서 쿼리 파라미터를 얻는 방법 (0) | 2023.02.09 |