'La sérialisation de' SimpleXMLElement 'n'est pas autorisée lors de l'enregistrement dans WordPress post_meta
Je suis en train de travailler sur un affilié amazon page wordpress.
Pour cela, je suis en utilisant le aws_signed_request fonction pour obtenir le prix et le lien d'amazon.
Ici est la aws_signed_request fonction retournant le 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;
}
}
Après que je reçois l'asin de la poste et de générer le lien et le prix
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.";
}
Tout cela fonctionne très bien quand je fais echo $lien et $de prix. Mais je veux enregistrer les valeurs dans les champs personnalisés de wordpress post, donc je n'ai pas à l'exécution de la fonction à chaque fois.
update_post_meta($post->ID, 'Price', $price);
update_post_meta($post->ID, 'Link', $link);
Ceci s'ajoute le prix de la valeur correcte, mais quand je veux ajouter le lien j'obtiens ce message d'erreur:
Uncaught exception 'Exception' with message 'Sérialisation de
'SimpleXMLElement" n'est pas autorisée " dans...
Mais quand j'ai enlever le $parsed_xml=... fonction, il enregistre une valeur vide.
source d'informationauteur user2078789
Vous devez vous connecter pour publier un commentaire.
(Presque) tout est revenu lorsque vous traversez un objet SimpleXML est en fait un autre objet SimpleXML. C'est ce qui permet d'écrire des
$item->OfferSummary->LowestNewPrice->Amount
: demande de->OfferSummary
sur le$item
objet renvoie un objet représentant leOfferSummary
nœud XML, de sorte que vous pouvez demander->LowestNewPrice
sur cet objet, et ainsi de suite. Notez que ceci s'applique aux attributs trop$someNode['someAttribute']
sera un objet, pas une chaîne de!Afin d'obtenir la chaîne de contenu d'un élément ou d'attribut, vous avez à "jeter", à l'aide de la syntaxe
(string)$variable
. Parfois, PHP va savoir que vous vouliez faire cela, et de le faire pour vous - par exemple lors de l'utilisation deecho
- mais en général, il est de bonne pratique de toujours jeté à la chaîne manuellement de sorte que vous n'aurez pas de surprise si vous modifiez votre code plus tard. Vous pouvez aussi jeter un entier en utilisant(int)
ou un flotteur à l'aide de(float)
.La deuxième partie de votre problème, c'est que SimpleXML objets sont stockés plutôt spécialement dans la mémoire, et ne peut pas être "sérialisé" (c'est à dire transformé en une chaîne de caractères qui décrit complètement l'objet). Cela signifie que si vous essayez de les enregistrer dans une base de données ou de la session, vous recevrez le message d'erreur que vous voyez. Si vous avez réellement voulu sauver un bloc entier de XML, vous pouvez utiliser
$foo->asXML()
.Donc, en résumé:
$link = (string)$item->DetailPageURL;
pour obtenir une chaîne de caractères plutôt que d'un objetupdate_post_meta($post->ID, 'ItemXML', $item->asXML());
si jamais vous voulez stocker l'intégralité de l'élément