WordPressで外部APIなどに接続する

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 = [
    'timeout' => 10,
];
wp_remote_get( $url, $args ) ; // 第2引数で、詳細を指定する

その他にも、ヘッダー、クッキー、ユーザーエージェントなどを指定してHTTPリクエストを送ることも出来ます。

エラーハンドリング

外部のウェブサイトと通信する場合、必ずしも正常に処理が終了するとは限りません。 通信先が込み合っていたり、メンテナンスが行われていたりするかもしれません。APIなら仕様変更やエンドポイント変更の可能性もあります。

このため、wp_remote_get関数を使う場合は、リクエストが正常に終了しなかった場合の処理も記載しておくことが推奨されます。

wp_remote_get関数のドキュメントを見ると、リクエスト失敗するとWP_Errorが返ってくる、とあるので、まずはエラーかどうかを確認します。

確認する関数として、is_wp_errorが用意されていますので、こちらを使いましょう。

サンプルコードは下のようになります。

if ( is_wp_error( $response ) ) { // リクエストがエラーかどうかを判定する
    $error_message = $response->get_error_message(); // エラーメッセージを取得
    error_log('error' . $error_message); // ログに書き込む
} else if (wp_remote_retrieve_response_code( $response ) !== 200) { // レスポンスが正常(200)かどうかを判定する
    error_log('response code: ' . wp_remote_retrieve_response_code( $response )); // ログに書き込む
} else {
    // 正常時の処理を書く
}

上の例では、レスポンス結果が200でない場合(401、404等)も条件判定しています。

wp_remote_get関数の仲間の関数

wp_remote_get関数には、仲間の関数が有ります。

file_get_contentsとの違い

PHPに用意されているfile_get_contents関数を使っても、外部ウェブサイトの情報を取得できます。 ただし、上手く取得できなかった場合の処理なども自分で書く必要があります。 wp_remote_*** を使うと、WordPressがフレームワーク的な役割を担ってくれます(細々とした処理をある程度面倒みてくれます)。