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.
- */
- function wp_remote_get($url, $args = array()) {
- $objFetchSite = _wp_http_get_object();
- return $objFetchSite->get($url, $args);
- }
その関数の定義はこちら。プライベート関数なので直接利用するのは厳禁です。
- /**
- * Returns the initialized WP_Http Object
- *
- * @since 2.7.0
- * @access private
- *
- * @return WP_Http HTTP Transport object.
- */
- function &_wp_http_get_object() {
- static $http;
- if ( is_null($http) )
- $http = new WP_Http();
- return $http;
- }
注目するべきは、10行目の static $http;
という部分。関数から出てもこの変数は維持され、再利用が可能になります。このような手法をメモ化と言うようです。10年以上プログラムを扱ってきましたが、単語自体知りませんでした。まだまだです。
PHP のメモ化については、次のサイトを参考にしました。
- PHP :: static を使って関数をメモ化する(Tipsというかメモ)
ベンチマーク結果を見るとかなりの高速化が期待できそうです。HTTP 通信を行うプラグインが複数動く場合には効果的かもしれません。最近はコアでも通信を行っているようですし。