Weather APIリモートデータの取得
msg
、あなたがあなたの質問に見せていることは基本的に天候APIからの結果です。そして、それはあなたの場所のために利用可能なデータがないと言います。
最初に行いたいのは、コーデックスと「WP HTTP API」での調査です。
リモートデータを取得するための適切な方法
WP HTTP APIについて学んだ後、それを行う一般的な方法が(このように簡略化されている)であることがわかります。
$response = wp_remote_request( 'http://example.com?some=parameter', array(
'ssl_verify' => true
) );
(例に示されているように)エラーが発生した場合は、WP_Error
クラスを使用してエラーをキャッチできます。
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()
);
次に、適切なデータを取得します。これが表示されます200
とOK
、リモート側のすべてが働いた場合は、。重要:リモートデータは、内部データよりも標準に準拠していない可能性があります。したがって、エラーが発生する可能性がありますが、それでも肯定的な200/OK
メッセージが返されます。
$response_code = wp_remote_retrieve_response_code( $response );
$response_status = wp_remote_retrieve_response_message( $response );
結果を得る
最後に、結果を検査します。最初に、先頭/末尾の空白を削除します。次のサンプルでは、WP HTTP APIを使用してヘッダーを確認する方法を示しています。キャッチした場合はJSON
それjson_decode()
で、を得た場合はXML
PHPのネイティブSimpleXML
クラスを使用します。
// 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...
CSVファイルの場合は、カスタムソリューションを見つけるか、インターウェブでPHPクラスを検索する必要があります。しかし正直なところ、CSVを使用している場合は、別のサービスを検索する方が簡単です。
一時的にデータをキャッシュする
一時APIはこれを行うにはかなりいいの方法を提供しています:
// Set Transient
$transient = set_transient(
'Your cache key',
$content,
60*60*6
);
その後、を使用して一時的なエラーをキャッチできるはずget_transient()
です。
一般的なエラー
よく発生するエラーは、SSL検証が機能しないことです。嬉しいことに、非常に簡単にオン/オフを切り替えることができます。
// ON:
add_filter( 'https_ssl_verify', '__return_true' );
// OFF:
add_filter( 'https_ssl_verify', '__return_false' );
適切なコアファイルを調べるとわかるように、面白い点が1つあります。コアには、ローカルリクエスト用のフィルターもあります。しかし、これにだまされないでください。このフィルターは、A)WPインストール内からリモートサービスを提供し、B)自分で使用している場合にのみ使用することを目的としています。#WTF?!
これは、ローカルインストールと運用環境/サーバー間で異なるSSL検証設定を使用するためのスイッチではないことはわかっていますが、その背後にあるアイデアもあります。それは、サービスをテストすることです。ここでWP G +コミュニティにも説明したように、自分自身を提供してください。
// Debug your own service without SSL verification.
add_filter( 'https_local_ssl_verify', '__return_false' );
リクエストとその結果のデバッグ
更新プロセスを深く掘り下げることなく、WP HTTP APIはWP_HTTPクラスを使用します。また、デバッグフックという優れた機能も提供します。
do_action( 'http_api_debug', $response, 'response', $class, $args, $url );
どこに$response
もWP_Error
、おそらくあなたにもっと教えてくれるオブジェクトがあります。
注:簡単なテストから、このフィルターは、(何らかの理由で)実際にリクエストを行っている場所の近くに配置した場合にのみ機能するようです。したがって、以下のフィルターのいずれかのコールバック内から呼び出す必要があるかもしれません。
カールなし?
簡単です。上記で示した「WP HTTP API」のすべてのファンキーさは、基本的にはWP_HTTP
クラス内部の関数ベースのラッパーであり、基本クラスとして機能します(さまざまなシナリオで拡張されます)。拡張WP_HTTP_*
クラスはFsockopen
、Streams
、Curl
、Proxy
、Cookie
、Encoding
。コールバックを'http_api_debug'
-actionにフックすると、3番目の引数で、要求に使用されたクラスがわかります。クラスを直接呼び出す必要はありません。関数を使用するだけです。
ほとんどのリモート/ HTTP APIリクエストの場合WP_HTTP_curl
、これはクラスであり、PHPのネイティブcurl
ライブラリのラッパーです。
WP_HTTP_curl
クラスの中には、request()
メソッドがあります。このメソッドは、SSL動作をインターセプトする2つのフィルターを提供します。1つはローカルリクエスト用で'https_local_ssl_verify'
、もう1つはリモートリクエスト用'https_ssl_verify'
です。WPは、あなたが何から何を得るかを定義local
しlocalhost
ます。return
get_option( 'siteurl' );
get_transient()
が、APIリクエストの場合:エラーメッセージで示されます。使用wp_remote_post
を推奨する以外に、送信されるリクエストが有効であることを確認する必要があります。