WordPressから別のウェブサイトの情報を取得する方法です。「別のウェブサイトの情報を取得する」「公開されているAPIにWordPressからアクセスする」といった場合に役立ちます。
wp_remote_get()関数
外部のウェブサイトの情報を取得するときには、そのウェブサイトにリクエストを送ります。 パソコンやスマホからだと、ブラウザを開いてアクセスしますね。この、「ブラウザを開いてアクセス」に相当する処理を実行するわけです。 HTTPリクエストを生成する、と呼びます。
WordPressでは、このHTTPリクエストを生成する処理を実行するための関数群が用意されています。
$url = "https://example.com/api/get/articles/10" ;
wp_remote_get( $url ) ; // 第1引数で、通信先のURLを指定する
wp_remote_get()関数の詳細な設定
wp_remote_get()
関数は、第2引数で、詳細を指定できます。
例えば、タイムアウトまでの時間(秒)を10にする場合は以下のようになります。(デフォルトではタイムアウト時間は5秒)
$args = array(
'timeout' => 10,
);
wp_remote_get( $url, $args ) ; // 第2引数で、詳細を指定する
その他にも、ヘッダー、クッキー、ユーザーエージェントなどを指定してHTTPリクエストを送ることもできます。
エラーハンドリング
外部のウェブサイトと通信する場合、必ずしも正常に処理が終了するとは限りません。 通信先が込み合っていたり、メンテナンスが行われていたりするかもしれません。APIなら仕様変更やエンドポイント変更の可能性もあります。
このため、wp_remote_get()
関数を使う場合は、リクエストが正常に終了しなかった場合の処理も記載しておくことが推奨されます。
wp_remote_get()
関数のドキュメントを見ると、リクエスト失敗するとWP_Errorが返ってくる、とあるので、まずはエラーかどうかを確認します。
確認する関数として、is_wp_error()
が用意されていますので、こちらを使いましょう。
サンプルコードは下のようになります。
$allowed_response_code = array(200, 304);
if ( is_wp_error( $response ) ) { // リクエストがエラーかどうかを判定する
$error_message = $response->get_error_message(); // エラーメッセージを取得
error_log('error: ' . $error_message); // ログに書き込む
} else if (!in_array(wp_remote_retrieve_response_code( $response ), $allowed_response_code) { // レスポンスが正常(200,304)かどうかを判定する
error_log('response code: ' . wp_remote_retrieve_response_code( $response )); // ログに書き込む
} else {
// 正常時の処理を書く
}
上の例では、レスポンス結果が正常でない場合も条件判定しています。正常は200(OK)と304(Not Modified)としています。その他の場合、例えば404 Not Found 等はエラーログに記録します。
wp_remote_get()関数の仲間の関数
wp_remote_get()
関数には、仲間の関数が有ります。
- wp_remote_get() : GET メソッドでリクエストする
- wp_remote_head() : HEAD メソッドでリクエストする
- wp_remote_post() : POST メソッドでリクエストする
- wp_remote_request() : メソッドを指定してリクエストする
PHPのfile_get_contents()関数との違い
PHPに用意されているfile_get_contents()
関数を使っても、外部ウェブサイトの情報を取得できます。
ただし、上手く取得できなかった場合の処理なども自分で書く必要があります。
wp_remote_***
を使うと、WordPressが簡易フレームワーク的な役割を担ってくれます(細々とした処理をある程度面倒みてくれます)。
更新日: