RSS

月別アーカイブ: 2月 2012

WordPress.ORGからプラグインの情報を取得出来るplugins_api()関数

WordPress.ORGからプラグインのダウンロード数を取得するPHPスクリプト」を書いた時にAPIは無いのかと思ったが、よく考えるとダッシュボードからプラグインを追加する際に、WordPress自身も明らかにWordPress.ORGからデータを取得している。

で、調べてみると「/wp-admin/includes/plugin-install.php」の中にplugins_api()という関数があり、これを使えば各種データを取得できる。

この関数を使えば、多くの情報を正確に取得できるのだが、結局、特殊なページをwp_remote_post()しているだけなので、パフォーマンス面ではメリットはない。

実際に使ってみたが取得する情報量が非常に多いので、パフォーマンスは良くない。

特殊な情報が必要でない限り、wp_remote_post()でプラグインページのHTMLを取得して、正規表現で切り出したほうが自サイトにもWordPress.ORGにも優しいと思う。

ちなみに「plugin-install.php」は、常に読み込まれているわけではないようなので、プラグインなどでplugins_api()を使う場合は、require_once()すること。

広告
 
コメントする

投稿者: : 2012/02/20 投稿先 Knowledges

 

WordPressでHTTP request

WordPressのプラグイン内で外部サイトのページをリクエストする場合は、wp_remote_get()wp_remote_post()、wp_remote_head()などが便利。

※これらの関数は、wp-includes/http.php内で定義されている。

例えば、前記事の「WordPress.ORGからプラグインのダウンロード数を取得するPHPスクリプト」のコードをwp_remote_get()を使って書きなおすと、次のようになる。

<?php
/**
Author: redcocker
Update: redcocker 2012/2/17
**/

function stat_count() {
	// Setting
	$address = 'プラグインページのURL';

	$stat_count = -1;
	$response_data = wp_remote_get($address);

	if (is_wp_error($response_data) || $response_data['response']['code'] !== 200) {
		return $stat_count;
	}

	$stat_count = get_stat_count($response_data['body']);

	return $stat_count;
}

function get_stat_count($data) {

	preg_match("@<strong>Downloads: </strong>(.*?)<br />@", $data, $matches);

	$str = str_replace(',','',$matches[1]);

	settype($str, 'integer');

	return number_format($str);
}

?>

レスポンスがエラーだったり200以外の場合は、つまりは、想定したURLでページが見つからなかった場合は、-1を返す。
転送されているケースは考慮していないが、移転先もヘッダーから取得できそうな気が。

 
コメントする

投稿者: : 2012/02/17 投稿先 Codes, Knowledges

 

WordPress.ORGからプラグインのダウンロード数を取得するPHPスクリプト

WordPress.ORGの「Plugin Directory」に登録されているプラグインのダウンロード数を取得する。

WP-Stats-Dashboardからコードを流用。

設定: プラグインの個別ページのURL。
ダウンロード数の取得: stat_count()を実行。

<?php
/**
Author: dligthart
Origin: WP-Stats-Dashboard(WPSDStats.php, WPSDPluginStats.php)
Update: redcocker 2012/2/13
**/

function stat_count() {
	// Setting
	$address = 'プラグインページのURL';

	$xml = fetchDataRemote($address);

	$stat_count = get_stat_count($xml);

	return $stat_count;
}

function fetchDataRemote($url, $agent = 1) {

	if ('' == $url) return false;

	$xml = '';

	if (function_exists('curl_init')) {

		$ch = curl_init();

		$timeout = 2;

		curl_setopt($ch, CURLOPT_URL, $url);

		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

		curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);

		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);

		switch ($agent) {
		default:
		case 1:
			curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.A.B.C Safari/525.13");
			break;
		case 2:
			curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.8) Gecko/20100722 BTRS86393 Firefox/3.6.8 ( .NET CLR 3.5.30729; .NET4.0C)");
			break;
		case 3:
			curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.1) Gecko/20061204 Firefox/2.0.0.1");
			break;
		}

		$xml = curl_exec($ch);

		curl_close($ch);
	}
	else {

		$xml = file_get_contents($url);
	}

	return $xml;
}

function get_stat_count($data) {

	preg_match("@<strong>Downloads: </strong>(.*?)<br />@", $data, $matches);

	$str = str_replace(',','',$matches[1]);

	settype($str, 'integer');

	return number_format($str);
}

?>

これだけのために余計なトラフィックを生むのが難点。APIがあれば・・・。

 
コメントする

投稿者: : 2012/02/13 投稿先 Codes, Knowledges

 

タグ: ,