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:
$response = wp_remote_request( 'http://example.com?some=parameter', array(
'ssl_verify' => true
) );
Wenn ein Fehler auftritt (wie in Ihrem Beispiel gezeigt), können Sie ihn mithilfe der folgenden WP_Error
Klasse abfangen :
is_wp_error( $response ) AND printf(
'There was an ERROR in your request.<br />Code: %s<br />Message: %s',
$response->get_error_code(),
$response->get_error_message()
);
Dann ist es Zeit, die entsprechenden Daten zu erhalten. Dies wird angezeigt 200
und OK
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 positive 200/OK
Nachricht von ihnen zurück.
$response_code = wp_remote_retrieve_response_code( $response );
$response_status = wp_remote_retrieve_response_message( $response );
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 mit json_decode()
und wenn wir haben XML
, dann gehen wir mit PHPs Native SimpleXML
Class.
// Prepare the data:
$content = trim( wp_remote_retrieve_body( $response ) );
// Convert output to JSON
if ( strstr( wp_remote_retrieve_header( $response, 'content-type' ), 'json' ) )
{
$content = json_decode( $content );
}
// … else, after a double check, we simply go with XML string
elseif ( strstr(
wp_remote_retrieve_header( $response, 'content-type' ),
'application/xhtml+xml'
) )
{
// Lets make sure it is really an XML file
// We also get cases where it's "<?XML" and "<?xml"
if ( '<?xml' !== strtolower( substr( $content, 0, 5 ) ) )
return false;
// Also return stuff wrapped up in <![CDATA[Foo]]>
$content = simplexml_load_string( $content, null, LIBXML_NOCDATA );
}
// If both didn't work out, then we maybe got a CSV, or something else...
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:
// Set Transient
$transient = set_transient(
'Your cache key',
$content,
60*60*6
);
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:
// ON:
add_filter( 'https_ssl_verify', '__return_true' );
// OFF:
add_filter( 'https_ssl_verify', '__return_false' );
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 .
// Debug your own service without SSL verification.
add_filter( 'https_local_ssl_verify', '__return_false' );
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.
do_action( 'http_api_debug', $response, 'response', $class, $args, $url );
Wo $response
kann auch ein WP_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ängerungs WP_HTTP_*
Klassen sind Fsockopen
, 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.
Bei den meisten Remote- / HTTP-API-Anforderungen handelt es sich um die WP_HTTP_curl
Klasse, die ein Wrapper für die native PHP- curl
Bibliothek ist.
In der WP_HTTP_curl
Klasse finden Sie die request()
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
wie localhost
und was Sie in erhalten return
aus get_option( 'siteurl' );
.
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.