by Popularity Contest 日本語版
WordPress には、Snoopy という HTTP 通信用のライブラリが以前から使われています。自前で用意するには結構大変なので、拙作の AmazonLink でも利用しています。
WordPress 2.7.0 では、これに変わるものとして HTTP API が導入されました。ライブラリの変更ではなく、WordPress の持つ機能の1つという扱いです。
- HTTP API - Version 2.7(Wordpress.日本語 Codex)
- HTTP API(WordPress.ORG Codex)
導入された段階では実験的な扱いでしたが、次第に多くの部分で使われるようになり、WordPress 3.0 でついに Snoopy が非推奨扱いとなっています。HTTP API が十分熟したと判断したのでしょう。
- 開発・テーマ・プラグイン - Version 3.0(Wordpress.日本語 Codex)
これを機会に、AmazonLink でも導入してみることにしました。現時点では Snoopy と併用するか完全に切り替えてしまうかは検討中ですが、最終的には完全な切り替えを行うことになると思います。
Snoopy の場合は別のライブラリということで、ファイルのインクルードを行い、Class のオブジェクトを取得し、実際に使用するという3段階の作業が必要です。
-
include_once(ABSPATH.'wp-includes/class-snoopy.php');
-
$Snoopy = new Snoopy();
-
-
$url = 'http://www.example.com';
-
$Snoopy->fetch($url);
-
$content = $Snoopy->results;
これに対して、HTTP API の場合は自動的にオブジェクトを取得してくれるので、いきなり実行することができます。WordPress に組み込まれているおかげです。
-
$url = 'http://www.example.com';
-
$result = wp_remote_get($url);
-
$content = $result['body'];
ほかにもいろいろな機能が含まれています。残念ながら本家 Codex でもドキュメントが充実しているとは言えない状況ですので、興味のある方は実際のコードを参照してみてください。ファイルは wp-includes/http.php です。Codex 以上の説明があり、かなり参考になると思います。
ちなみに、自動的にオブジェクトを取得してくれる仕組みですが、内部でそのための関数を呼び出しています。
-
/**
-
* Retrieve the raw response from the HTTP request using the GET method.
-
*
-
* @see wp_remote_request() For more information on the response array format.
-
*
-
* @since 2.7.0
-
*
-
* @param string $url Site URL to retrieve.
-
* @param array $args Optional. Override the defaults.
-
* @return WP_Error|array The response or WP_Error on failure.
-
*/
-
$objFetchSite = _wp_http_get_object();
-
return $objFetchSite->get($url, $args);
-
}
その関数の定義はこちら。プライベート関数なので直接利用するのは厳禁です。
注目するべきは、10行目の static $http; という部分。関数から出てもこの変数は維持され、再利用が可能になります。このような手法をメモ化と言うようです。10年以上プログラムを扱ってきましたが、単語自体知りませんでした。まだまだです。
PHP のメモ化については、次のサイトを参考にしました。
- PHP :: static を使って関数をメモ化する(Tipsというかメモ)
ベンチマーク結果を見るとかなりの高速化が期待できそうです。HTTP 通信を行うプラグインが複数動く場合には効果的かもしれません。最近はコアでも通信を行っているようですし。
