RSS

カテゴリー別アーカイブ: Codes

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

 

タグ: ,

メールアドレスの正当性をチェックするクラス

Mail_CheckUser

完全ではないようだが・・・。

PHPライセンス

 
コメントする

投稿者: : 2011/09/15 投稿先 Codes

 

タグ: ,

var_dump( )の出力結果を多少、見易くする

WordPressのグローバル関数「$wp_query」の例。

echo "<pre>";
var_dump($wp_query);
echo "</pre>";
 
コメントする

投稿者: : 2011/09/13 投稿先 Codes

 

タグ: ,

GDライブラリで透過形式の画像をリサイズするのに便利な関数

Smart Image Resizing while Preserving Transparency With PHP and GD Library

function smart_resize_image( $file, $width = 0, $height = 0, $proportional = false, $output = 'file', $delete_original = true, $use_linux_commands = false )
   {
     if ( $height        return false;
     }

    $info = getimagesize($file);
     $image = '';

    $final_width = 0;
     $final_height = 0;
     list($width_old, $height_old) = $info;

    if ($proportional) {
       if ($width == 0) $factor = $height/$height_old;
       elseif ($height == 0) $factor = $width/$width_old;
       else $factor = min ( $width / $width_old, $height / $height_old);

      $final_width = round ($width_old * $factor);
       $final_height = round ($height_old * $factor);

    }
     else {
       $final_width = ( $width        $final_height = ( $height = 0) {

         // Get the original image's transparent color's RGB values
         $trnprt_color    = imagecolorsforindex($image, $trnprt_indx);

         // Allocate the same color in the new image resource
         $trnprt_indx    = imagecolorallocate($image_resized, $trnprt_color['red'], $trnprt_color['green'], $trnprt_color['blue']);

         // Completely fill the background of the new image with allocated color.
         imagefill($image_resized, 0, 0, $trnprt_indx);

         // Set the background color for new image to transparent
         imagecolortransparent($image_resized, $trnprt_indx);

      }
      // Always make a transparent background color for PNGs that don't have one allocated already
       elseif ($info[2] == IMAGETYPE_PNG) {

         // Turn off transparency blending (temporarily)
         imagealphablending($image_resized, false);

         // Create a new transparent color for image
         $color = imagecolorallocatealpha($image_resized, 0, 0, 0, 127);

         // Completely fill the background of the new image with allocated color.
         imagefill($image_resized, 0, 0, $color);

         // Restore transparency blending
         imagesavealpha($image_resized, true);
       }
     }

    imagecopyresampled($image_resized, $image, 0, 0, 0, 0, $final_width, $final_height, $width_old, $height_old);

    if ( $delete_original ) {
       if ( $use_linux_commands )
         exec('rm '.$file);
       else
         @unlink($file);
     }

    switch ( strtolower($output) ) {
       case 'browser':
         $mime = image_type_to_mime_type($info[2]);
         header("Content-type: $mime");
         $output = NULL;
       break;
       case 'file':
         $output = $file;
       break;
       case 'return':
         return $image_resized;
       break;
       default:
       break;
     }

    switch ( $info[2] ) {
       case IMAGETYPE_GIF:
         imagegif($image_resized, $output);
       break;
       case IMAGETYPE_JPEG:
         imagejpeg($image_resized, $output);
       break;
       case IMAGETYPE_PNG:
         imagepng($image_resized, $output);
       break;
       default:
         return false;
     }

    return true;
   }
 
コメントする

投稿者: : 2011/09/11 投稿先 Codes

 

タグ: , ,

テキストエリアの内の選択範囲を取得、加工

textareaの選択範囲を取得し、前後に文字列を挿入する

Javaスクリプト


function getAreaRange(obj) {
var pos = new Object();

if (isIE) {
obj.focus();
var range = document.selection.createRange();
var clone = range.duplicate();

clone.moveToElementText(obj);
clone.setEndPoint( 'EndToEnd', range );

pos.start = clone.text.length - range.text.length;
pos.end   = clone.text.length - range.text.length + range.text.length;
}

else if(window.getSelection()) {
pos.start = obj.selectionStart;
pos.end   = obj.selectionEnd;
}

return pos;
// alert(pos.start + "," + pos.end);
}
var isIE = (navigator.appName.toLowerCase().indexOf('internet explorer')+1?1:0);

function surroundHTML(tag, obj) {
var target = document.getElementById(obj);
var pos = getAreaRange(target);

var val = target.value;
var range = val.slice(pos.start, pos.end);
var beforeNode = val.slice(0, pos.start);
var afterNode  = val.slice(pos.end);
var insertNode;

if (range || pos.start != pos.end) {
insertNode = '<' + tag + '>' + range + '</' + tag + '>';
target.value = beforeNode + insertNode + afterNode;
}

else if (pos.start == pos.end) {
insertNode = '<' + tag + '>' + '</' + tag + '>';
target.value = beforeNode + insertNode + afterNode;
}
}

フォームまわり

<form action="" method="post" id="testForm" onsubmit="">
<p>
<a href="javascript:void(0);" onclick="surroundHTML('p','testedit');">&lt;p&gt;</a> |
<a href="javascript:void(0);" onclick="surroundHTML('a','testedit');">&lt;a&gt;</a> |
<a href="javascript:void(0);" onclick="surroundHTML('strong','testedit');">&lt;strong&gt;</a><br />
<textarea name="text" cols="42" rows="16" name="text" id="testedit">テスト</textarea>
</p>
</form>
 
コメントする

投稿者: : 2011/09/10 投稿先 Codes

 

タグ:

フォームの前にコメントを表示する

https://gist.github.com/1155486

<?php
 function akv3_social_comment_block_order($order) {
 return array('comments', 'form');
 }
 add_filter('social_comment_block_order', 'akv3_social_comment_block_order');

コメントフォームの前にコメントを表示するコード。

 
コメントする

投稿者: : 2011/09/10 投稿先 Codes

 

タグ: ,