Ich versuche, die get_transient()
Methode in meinem Wordpress zu verwenden. Ich habe das Dokument gelesen und scheine das zu tun, was in den Dokumenten beschrieben wurde.
Ich muss das Wetter auf meiner Website anzeigen und verwende eine Wetter-API eines Drittanbieters, die alle 6 Stunden aktualisiert wird.
Wir erstellen einen lokalen Wetter-Cache, damit die API erst nach Ablauf der Zeit aufgerufen wird. (Anderer Grund: API-Ratenbegrenzung)
Das ist mein 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);
}
Wenn ich einen Ort sende, um Wetter ( say delhi
) zu erhalten, und wenn er nicht im Cache vorhanden ist, habe ich erwartet, dass er zurückkehrt, false
während er mir die folgende Zeichenfolge zurückgibt
'{ "data": { "error": [ {"msg": "Unable to find any matching weather location to the query submitted!" } ] }}'
Ich habe var_dump($weather);
den Wert von überprüft$weather
Kann mich jemand korrigieren, wo ich falsch mache?
get_transient()
- sondern mit der API-Anforderung zusammen: wie in der Fehlermeldung angegeben. Abgesehen davon, dass Sie die Verwendung empfehlen, müssenwp_remote_post
Sie nur sicherstellen, dass die gesendete Anfrage gültig ist.if (false === $weather)
Ich habe meine Frage aktualisiertAntworten:
Abrufen der Remote-Daten der Wetter-API
Das
msg
, was Sie in Ihrer Frage anzeigen, ist im Grunde das Ergebnis der Wetter-API. Und es heißt, dass für Ihren Standort keine Daten verfügbar sind.Das erste, was Sie tun möchten, ist eine Recherche im Codex und in der "WP HTTP API" .
Der richtige / WP-Weg, um entfernte Daten zu erfassen
Nachdem Sie sich mit der WP-HTTP-API vertraut gemacht haben, werden Sie feststellen, dass die übliche Vorgehensweise (wie folgt vereinfacht) lautet:
Wenn ein Fehler auftritt (wie in Ihrem Beispiel gezeigt), können Sie ihn mithilfe der folgenden
WP_Error
Klasse abfangen :Dann ist es Zeit, die entsprechenden Daten zu erhalten. Dies wird angezeigt
200
undOK
wenn alles auf der Remote-Seite geklappt hat. WICHTIG: Die Remote-Daten folgen wahrscheinlich keinem anderen Standard als dem internen. Es kann also zu Fehlern kommen, aber Sie erhalten trotzdem die positive200/OK
Nachricht von ihnen zurück.Holen Sie sich das Ergebnis
Schließlich ist es Zeit, das Ergebnis zu überprüfen. Zuerst entfernen wir führende / nachfolgende Leerzeichen. Im folgenden Beispiel sehen Sie, wie Sie die WP-HTTP-API zum Überprüfen des Headers verwenden. Wenn wir gefangen haben
JSON
, dann gehen wir mitjson_decode()
und wenn wir habenXML
, dann gehen wir mit PHPs NativeSimpleXML
Class.Im Falle einer CSV-Datei müssen Sie eine benutzerdefinierte Lösung finden oder in den Interwebs nach einer PHP-Klasse suchen. Aber ehrlich: Wenn sie CSV verwenden, ist es einfacher, nach einem anderen Dienst zu suchen.
Zwischenspeichern Sie die Daten mit einem Transienten
Die Transient-API bietet eine gute Möglichkeit, dies zu tun:
Sie sollten dann in der Lage sein, den Übergang mit zu fangen
get_transient()
.Häufige Fehler
Ein häufig auftretender Fehler ist, dass die SSL-Überprüfung nicht funktioniert. Gerne können Sie es ganz einfach ein- und ausschalten:
Es gibt eine ziemlich lustige Sache, wie Sie bei der Überprüfung der entsprechenden Kerndatei herausfinden werden: Core hat auch einen Filter für lokale Anforderungen. Aber lassen Sie sich von diesem nicht täuschen. Dieser Filter ist nur für den Fall gedacht, dass Sie A) einen Remote-Dienst innerhalb Ihrer WP-Installation bereitstellen und B) ihn auch selbst verbrauchen! Ich weiß, dies kann ein ziemlicher
#WTF?!
Moment sein, in dem dies kein Wechsel für Sie ist, um unterschiedliche SSL-Überprüfungseinstellungen zwischen Ihrer lokalen Installation und Ihrer Produktionsumgebung / Ihrem Server zu verwenden, aber es steckt auch eine Idee dahinter: Es geht darum, Dienste zu testen, die Sie verwenden Stellen Sie sich selbst zur Verfügung, wie ich es auch der WP G + Community hier erklärt habe .Debuggen der Anfrage und ihrer Ergebnisse
Ohne zu tief in den Aktualisierungsprozess einzudringen, verwendet die WP-HTTP-API jedoch die WP_HTTP-Klasse. Es bietet auch eine schöne Sache: Ein Debug-Hook.
Wo
$response
kann auch einWP_Error
Objekt sein, das Ihnen vielleicht mehr sagt.Hinweis: Nach einem kurzen Test scheint dieser Filter (aus irgendeinem Grund) nur zu funktionieren, wenn Sie ihn so nahe an der Stelle platzieren, an der Sie die Anforderung tatsächlich ausführen. Vielleicht müssen Sie es innerhalb eines Rückrufs auf einem der folgenden Filter aufrufen.
Y NO CURL?
Einfach. Die oben gezeigte Funky der "WP HTTP API" ist im Grunde ein funktionsbasierter Wrapper für die
WP_HTTP
Klasseninternale, der als Basisklasse fungiert (und für verschiedene Szenarien erweitert wird). Die VerlängerungsWP_HTTP_*
Klassen sindFsockopen
,Streams
,Curl
,Proxy
,Cookie
,Encoding
. Wenn Sie einen Rückruf in die'http_api_debug'
-action einbinden, gibt das dritte Argument an, welche Klasse für Ihre Anforderung verwendet wurde. Sie müssen die Klassen nicht direkt aufrufen. Verwenden Sie einfach die Funktionen.In der
WP_HTTP_curl
Klasse finden Sie dierequest()
Methode. Diese Methode bietet zwei Filter zum Abfangen des SSL-Verhaltens: einen für lokale Anforderungen'https_local_ssl_verify'
und einen für Remote-Anforderungen'https_ssl_verify'
. WP wird wahrscheinlich definieren ,local
wielocalhost
und was Sie in erhaltenreturn
ausget_option( 'siteurl' );
.quelle
wp_remote_request()
mit Ihrer URL zurückbekommen , und fahren Sie dann mit der Antwort fort. Es ist ein ziemlich vollständiges Tutorial und zeigt Ihnen , wie Sie HTTP-Anforderungen in WP richtig stellen können. Um einen Bissen mehr zu verdeutlichen: Sie müssen dieWP_HTTP_curl
Klasse nicht aufrufen , da WordPress dies bereits für Sie erledigt, wenn Sie die oben gezeigten Funktionen verwenden.Das Problem liegt nicht bei der Funktion "Transienten". Das sieht aus wie eine Fehlermeldung, die von Ihrer Drittanbieter-API zurückgegeben wird. Sie müssen dies wahrscheinlich überprüfen, bevor Sie es verwenden
set_transient
.set_transient
fügt alles ein, was angegeben ist, undget_transient
ruft alles ab, was sich in der Datenbank befindet. Mit anderen Worten, ich bin mir ziemlich sicher, dass das Problem nicht dort liegt, wo Sie denken, dass es liegt.Ich vermute einige der Ausgaben Ihrer Wetter-API, daher müssen Sie diese möglicherweise anpassen, um die gewünschten Ergebnisse zu erzielen.
Hinweis: Ihre API gibt JSON zurück. Ihr Beispiel dekodiert zu:
quelle
if (false === $weather)
Anweisung erfolgt. Ich war mir nicht bewusst, dass dieWP_HTTP_curl
Klasse versuchen wird, dies zu verwenden