J'essaie d'utiliser la get_transient()
méthode dans mon Wordpress, j'ai lu le document et semble faire ce qui a été décrit dans la documentation.
Je dois afficher la météo sur mon site Web et j'utilise une API météo tierce qui est mise à jour toutes les 6 heures.
Nous créons un cache local de la météo afin que l'API ne soit appelée qu'après expiration. (Autre raison: limitation du débit de l'API)
Voici mon code:
$country = 'India';
$API_Key = 'xxxxxxxxxxxxxx';
$url = 'http://weatherAPI.com/feed/weather.ashx?q='.$latlong.'&format=json&num_of_days=4&key='.$API_Key;
$weather = get_transient($location);
if (false === $weather) {
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 0);
$weather = curl_exec($ch);
curl_close($ch);
set_transient($location, $weather, 60*60*6);
}
Lorsque j'envoie un emplacement pour obtenir la météo ( say delhi
) et s'il n'est pas là dans le cache, je m'attendais à ce qu'il revienne false
pendant qu'il me renvoie la chaîne suivante
'{ "data": { "error": [ {"msg": "Unable to find any matching weather location to the query submitted!" } ] }}'
J'avais l'habitude var_dump($weather);
de vérifier la valeur de$weather
Quelqu'un peut-il me corriger là où je fais mal?
get_transient()
- mais à la demande d'API: comme indiqué par le message d'erreur. En plus de vous recommander d'utiliser,wp_remote_post
vous devrez simplement vous assurer que la demande envoyée est valide.if (false === $weather)
. J'ai mis à jour ma questionRéponses:
Capture des données distantes de l'API météo
Le
msg
, que vous montrez dans votre question est essentiellement le résultat de l'API météo. Et il est dit qu'aucune donnée n'est disponible pour votre emplacement.La première chose que vous voulez faire est une recherche dans le Codex et la "WP HTTP API" .
La bonne façon / WP pour saisir des données à distance
Après avoir découvert l'API HTTP WP, vous verrez que la façon la plus courante de le faire est (simplifiée comme ceci):
S'il y a une erreur (comme indiqué dans votre exemple), vous pourrez l'attraper en utilisant la
WP_Error
classe:Il est alors temps d'obtenir les données appropriées. Cela montrera
200
etOK
, si tout sur le côté distant a fonctionné. IMPORTANT: Les données distantes ne suivront probablement aucune norme que leur interne. Il peut donc y avoir des erreurs, mais vous obtiendrez toujours le200/OK
message positif de leur part.Obtenez le résultat
Enfin, il est temps d'inspecter le résultat. Tout d'abord, nous nous débarrassons des espaces blancs avant / arrière. Dans l'exemple suivant, vous voyez comment utiliser l'API HTTP WP pour vérifier l'en-tête. Si nous avons attrapé
JSON
, alors nous allons avecjson_decode()
et si nous avonsXML
, alors nous allons avec laSimpleXML
classe native PHP .Dans le cas d'un fichier CSV, vous devrez trouver une solution personnalisée ou rechercher une classe PHP sur les interwebs. Mais honnêtement: s'ils utilisent CSV, il est plus facile de rechercher un autre service.
Cachez les données avec un transitoire
L' API transitoire offre une assez belle façon de procéder:
Vous devriez alors pouvoir attraper le transitoire avec
get_transient()
.Erreurs courantes
Une erreur souvent rencontrée est que la vérification SSL ne fonctionne pas. Heureusement, vous pouvez l'activer / le désactiver assez facilement:
Il y a une chose assez drôle, comme vous le découvrirez en inspectant le fichier core approprié: Core a également un filtre pour les requêtes locales . Mais ne vous laissez pas berner par celui-ci. Ce filtre est uniquement destiné à être utilisé dans le cas où vous A) fournissez un service à distance depuis votre installation WP et B) le consommez vous-même! Je sais, cela peut être un bon
#WTF?!
moment que ce n'est pas un commutateur pour que vous utilisiez différents paramètres de vérification SSL entre votre installation locale et votre environnement / serveur de production, mais il a également une idée derrière: c'est pour tester les services que vous fournissez-vous comme je l'ai également expliqué à la communauté WP G + ici .Débogage de la requête et de ses résultats
Sans creuser trop profondément dans le processus de mise à jour, mais l'API HTTP WP utilise la classe WP_HTTP. Il offre également une bonne chose: un crochet de débogage.
Où
$response
peut aussi être unWP_Error
objet qui vous en dit peut-être plus.Remarque: à partir d'un bref test, ce filtre semble ne fonctionner (pour une raison quelconque) que si vous le placez aussi près de l'endroit où vous effectuez réellement la demande. Alors peut-être que vous devez l'appeler à partir d'un rappel sur l'un des filtres ci-dessous.
OUI NON CURL?
Facile. Tout le côté génial de l '"API HTTP WP", que j'ai montré ci-dessus, est essentiellement un wrapper basé sur les fonctions pour les
WP_HTTP
internes de classe, qui agit comme classe de base (et sera étendu pour différents scénarios). Les étendant lesWP_HTTP_*
classes sontFsockopen
,Streams
,Curl
,Proxy
,Cookie
,Encoding
. Si vous accrochez un rappel à l''http_api_debug'
action, le troisième argument vous indiquera quelle classe a été utilisée pour votre demande. Vous n'avez pas besoin d'appeler directement les classes. Utilisez simplement les fonctions.À l'intérieur de la
WP_HTTP_curl
classe, vous trouverez larequest()
méthode. Cette méthode propose deux filtres pour intercepter le comportement SSL: un pour les requêtes locales'https_local_ssl_verify'
et un pour les requêtes distantes'https_ssl_verify'
. WP définira probablementlocal
aussilocalhost
et ce que vous obtenez dansreturn
deget_option( 'siteurl' );
.la source
wp_remote_request()
avec votre URL, puis allez plus loin avec la réponse. C'est un tutoriel assez complet et vous montre la bonne façon de faire des requêtes HTTP dans WP. Pour clarifier un peu plus: vous n'avez pas besoin d'appeler laWP_HTTP_curl
classe, car WordPress le fait déjà pour vous, lorsque vous utilisez les fonctions ci-dessus.Le problème n'est pas avec la fonction «transitoires». Cela ressemble à un message d'erreur renvoyé par votre API tierce. Vous devrez probablement vérifier cela avant d'utiliser
set_transient
.set_transient
insérera tout ce qui lui est donné etget_transient
récupérera tout ce qui se trouve dans la base de données. En d'autres termes, je suis assez sûr que le problème n'est pas là où vous le pensez.Je pense à une partie de la sortie de votre API météo, vous devrez donc peut-être l'ajuster pour obtenir les résultats souhaités.
Remarque: votre API retourne JSON. Votre exemple décode pour:
la source
if (false === $weather)
déclaration. Je n'étais pas au courant que laWP_HTTP_curl
classe essaiera de l'utiliser