モバイルとアップロード判定@ WordPress のTips

2014年8月20日

PluginやThemeの制作時に分岐判定で使うかも知れず備忘録。

ユーザーエージェントでの判定となる。変数はstatic化されていて、セッションが持続している間は処理が省略されるので割と気軽に扱える。パッと見iOSが無いと思ったもののstrpos 'Mobile’で一括りにされている模様。エージェントにMobileを付加しないAndroid端末って何だろう…。

WordPress 閲覧時のモバイル判定

/**
 * Test if the current browser runs on a mobile device (smart phone, tablet, etc.)
 *
 * @return bool true|false
 */
function wp_is_mobile() {
	static $is_mobile;

	if ( isset($is_mobile) )
		return $is_mobile;

	if ( empty($_SERVER['HTTP_USER_AGENT']) ) {
		$is_mobile = false;
	} elseif ( strpos($_SERVER['HTTP_USER_AGENT'], 'Mobile') !== false // many mobile devices (all iPhone, iPad, etc.)
		|| strpos($_SERVER['HTTP_USER_AGENT'], 'Android') !== false
		|| strpos($_SERVER['HTTP_USER_AGENT'], 'Silk/') !== false
		|| strpos($_SERVER['HTTP_USER_AGENT'], 'Kindle') !== false
		|| strpos($_SERVER['HTTP_USER_AGENT'], 'BlackBerry') !== false
		|| strpos($_SERVER['HTTP_USER_AGENT'], 'Opera Mini') !== false
		|| strpos($_SERVER['HTTP_USER_AGENT'], 'Opera Mobi') !== false ) {
			$is_mobile = true;
	} else {
		$is_mobile = false;
	}

	return $is_mobile;
}

アップロード可能かどうかの判定

これにAppleのモバイル端末が加わる。専用アプリを使えと言う感じではあるものの、少々乱暴な気もします。

/**
 * Test if the current device has the capability to upload files.
 *
 * @since 3.4.0
 * @access private
 *
 * @return bool true|false
 */
function _device_can_upload() {
	if ( ! wp_is_mobile() )
		return true;

	$ua = $_SERVER['HTTP_USER_AGENT'];

	if ( strpos($ua, 'iPhone') !== false
		|| strpos($ua, 'iPad') !== false
		|| strpos($ua, 'iPod') !== false ) {
			return preg_match( '#OS ([\d_]+) like Mac OS X#', $ua, $version ) && version_compare( $version[1], '6', '>=' );
	}

	return true;
}