*

【PHP,WordPress,Contactform7】ユーザーエージェント(UA)から「デバイス(PC,スマホ,タブレット)」「OS」「ブラウザ」を取得する→これをContactform7に実装



ユーザーエージェント(UA)から「デバイス(PC,スマホ,タブレット)」「OS」「ブラウザ」を取得しようと思った理由


これの続きです。

【PHP】ユーザーエージェント(UA)から「デバイス(PC,スマホ,タブレット)」「OS」「ブラウザ」を取得する

もともと、ユーザーエージェント(UA)から「デバイス(PC,スマホ,タブレット)」「OS」「ブラウザ」を取得しようと思ったキッカケですが。

Contactform7というWordPressに簡単にお問い合わせフォームが実装できるプラグインがあるのですが。

これを結構僕使っていて。

で、問い合わせをしたユーザーの環境を調査したいなって思ってまして。

で、Contactform7にはデフォルトでそういったいわゆる特別なタグがついています。

特別なメールタグ

[_remote_ip] このタグは送信者の IP アドレスで置換されます。
[_user_agent] このタグは送信者のユーザーエージェント情報で置換されます。
[_url] このタグはコンタクトフォームの URL で置換されます。
[_date] このタグは送信された日付で置換されます。
[_time] このタグは送信された時刻で置換されます。
[_post_id] このタグはコンタクトフォームを含んだ投稿の ID で置換されます。
[_post_name] このタグはコンタクトフォームを含んだ投稿の名前(スラッグ)で置換されます。
[_post_title] このタグはコンタクトフォームを含んだ投稿のタイトルで置換されます。
[_post_url] このタグはコンタクトフォームを含んだ投稿のパーマリンクで置換されます。
[_post_author] このタグはコンタクトフォームを含んだ投稿の作成者の名前で置換されます。
[_post_author_email] このタグはコンタクトフォームを含んだ投稿の作成者のメールアドレスで置換されます。

で、特にその中で、

[_user_agent] このタグは送信者のユーザーエージェント情報で置換されます。

と、ユーザーエージェントを取得するタグも有るのですが、どうしてもこれだと、
Mozilla/5.0 (Windows NT 6.1; Trident/7.0; MAFSJS; rv:11.0) like Gecko
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.152 Safari/537.36
Mozilla/5.0 (iPhone; CPU iPhone OS 7_0_4 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11B554a Safari/9537.53

ってな感じで、よく見るとiPhoneだな?とかWindowsでIE11かな?Macのchromeかな?なんて分かるのですが、直感的にわかりにくいですよね?

だもんで、これを前書いた記事のようにプログラムで分解して、それぞれリスト表示されるようにしたいと。




Contactform7にオリジナルのタグ(独自タグ)を追加する方法


で、Contactform7でデフォルトで用意されたタグ以外に自分で作ったオリジナルのタグ(独自タグ)を作る方法はもちろんあります。

この辺りの記事を参考にしました。

Contact Form 7で使える特別メールタグや独自タグの作成方法など
Contact Form 7の特別なメールタグをfunctions.phpで追加
[Wordpress]Contactform7でPHPコードが使えなくて困った件!

ほんで、これらを参考に超シンプルに作ってみました。


で、実際にいじっていくファイルはテーマファイルの中のfunctions.phpです。

具体的には

http://(WordPressをインストしたところ)/wp-content/themes/(使ってるテーマ)/functions.php

です。

間違ってもプラグインのContactform7の中のファイルをいじらないように。

これをいじっちゃうと、Contactform7のアップデートの際に自分が書き加えたやつが上書きされて消えちゃいます。

また本件にかぎらず、プラグインのファイルや、WordPressのコアファイルなどはいじると同様にアップデートの時に上書きされる恐れがあります。

ですので原則はこういった改変はテーマファイル内(の特にfunctions.php)をいじるようにしましょう。

※ただし、テーマファイルもオリジナルじゃなくってフリーで配ってたり、有料で売ってるやつなどの場合はアップデートが入ると同様のことが起こる可能性があるので、いじるのはなるべくせず、子テーマを使ったり、どうしようもない場合は、改変した部分を控えておくようにしましょう!


実際に追記した内容


細かいプログラムや動作などの説明は前回書いたので、具体気な方法とソースだけ。

前の章で説明したように、テーマファイルの中のfunctions.phpをいじっていきます。

ページの一番最後に追記していきます。

※もし、phpのとじタグ「?>」があればその直前にね。

順番に説明していきます。


/**
Contactform7 ユーザーエージェントの判別
**/

// Contactform7にフックを紐付ける
add_filter('第一引数(引っ掛けるフックの名前)', '第二引数(任意のユーザー関数)',第三引数(優先度),第四引数(フックから取得できる変数の数);


まずは、Contactform7に今回追加する新たな関数を読み込むように「add_filter()」という命令を使って指定します。

これをフックを紐付けるって言ったりします。

で、今回は

◆第一引数(引っ掛けるフックの名前):wpcf7_special_mail_tags
→先に説明したContactform7で用意されている「独自タグ」が明記されているフックの名前です。
→必ずこれを指定しましょう。

◆第二引数(任意のユーザー関数):my_special_mail_tags
→これは任意なのでなんでもいいです。今回はわかりやすい名前になってます。

◆第三引数(優先度):10
→このフックを利用するユーザー関数がもし複数有った場合の優先度です。
→とりあえず大きめに10にしておけばのちのちトラブルが少ないでしょう。

◆第四引数(フックから取得できる変数の数):2
→参考ページではあまり必要性がないとのことですが、省略すると1つしか取得できなくなる。
→今回は一応2としておきます。よくわからんもんで。

参考:http://www.welcart.com/community/archives/1697


で、実際に値を入力します。

そして、第二引数で任意に決めたユーザー関数をでは実際に作っていきましょう。


/**
Contactform7 ユーザーエージェントの判別
**/

// Contactform7にフックを紐付ける
add_filter('wpcf7_special_mail_tags', 'my_special_mail_tags',10,2);

// ユーザー関数(my_special_mail_tags)
function my_special_mail_tags($output, $name) {

(関数の中身)

}

function my_special_mail_tags($output, $name)の$output, $nameの2つの関数はContactform7の画面でのショートコードを埋め込むために使います。

まあこの辺り説明も面倒なので興味あれば「function 関数」とかで検索してみて。

とりあえず動けばいいや。ってひとはひとまずこのまま使ってみ。



で、まず初めは前回書いたユーザーエージェントを取得して、それらから
  • デバイス(PCorスマホorタブレット)
  • OS
  • ブラウザ
に分解していくプログラムですよね。(前の記事のファイル名でいうua.class.php)

こいつをそのままコピペしちゃいます。



/**
Contactform7 ユーザーエージェントの判別
**/

// Contactform7にフックを紐付ける
add_filter('wpcf7_special_mail_tags', 'my_special_mail_tags',10,2);

// ユーザー関数(my_special_mail_tags)
function my_special_mail_tags($output, $name) {

    /** ユーザーエージェント取得 */
    if (empty($user_agent)) {
    $user_agent = $_SERVER['HTTP_USER_AGENT'];
    }

    /** os判定 */
    if (preg_match('/Windows NT 6.3/', $user_agent)) {
        $os = 'Windows 8.1';
    } elseif (preg_match('/Windows NT 6.2/', $user_agent)) {
        $os = 'Windows 8';
    } elseif (preg_match('/Windows NT 6.1/', $user_agent)) {
        $os = 'Windows 7';
    } elseif (preg_match('/Windows NT 6.0/', $user_agent)) {
        $os = 'Windows Vista';
    } elseif (preg_match('/Windows NT 5.2/', $user_agent)) {
        $os = 'Windows Server 2003 / Windows XP x64 Edition';
    } elseif (preg_match('/Windows NT 5.1/', $user_agent)) {
        $os = 'Windows XP';
    } elseif (preg_match('/Windows NT 5.0/', $user_agent)) {
        $os = 'Windows 2000';
    } elseif (preg_match('/Windows NT 4.0/', $user_agent)) {
        $os = 'Microsoft Windows NT 4.0'; 
    } elseif (preg_match('/Mac OS X ([0-9\._]+)/', $user_agent, $matches)) {
        $os = 'Macintosh Intel ' . str_replace('_', '.', $matches[1]);
    } elseif (preg_match('/Linux ([a-z0-9_]+)/', $user_agent, $matches)) {
        $os = 'Linux ' . $matches[1];
    } elseif (preg_match('/OS ([a-z0-9_]+)/', $user_agent, $matches)) {
        $os = 'iOS ' . str_replace('_', '.', $matches[1]);
    } elseif (preg_match('/Android ([a-z0-9\.]+)/', $user_agent, $matches)) {
        $os = 'Android ' . $matches[1];
    } else {
        $os = '不明';
    }
    
    
    /** ブラウザ判定(PC以外はスマホと表示) */
    // マイナー
    if (preg_match('/(Iron|Sleipnir|Maxthon|Lunascape|SeaMonkey|Camino|PaleMoon|Waterfox|Cyberfox)\/([0-9\.]+)/', $user_agent, $matches)) {
        $browser = $matches[1];
        $version = $matches[2];
    // 主要
    } elseif (preg_match('/(^Opera|OPR).*\/([0-9\.]+)/', $user_agent, $matches)) {
        $browser = 'Opera';
        $version = $matches[2];
    } elseif (preg_match('/Chrome\/([0-9\.]+)/', $user_agent, $matches)) {
        $browser = 'Chrome';
        $version = $matches[1]; 
    } elseif (preg_match('/Firefox\/([0-9\.]+)/', $user_agent, $matches)) {
        $browser = 'Firefox';
        $version = $matches[1];
    } elseif (preg_match('/(MSIE\s|Trident.*rv:)([0-9\.]+)/', $user_agent, $matches)) {
        $browser = 'Internet Explorer';
        $version = $matches[2];
    } elseif (preg_match('/\/([0-9\.]+)(\sMobile\/[A-Z0-9]{6})?\sSafari/', $user_agent, $matches)) {
        $browser = 'Safari';
        $version = $matches[1];
    // ゲーム機
    } elseif (preg_match('/Nintendo (3DS|WiiU)/', $user_agent, $matches)) {
        $browser = 'Nintendo';
        $version = $matches[1];
    } elseif (preg_match('/PLAYSTATION (3|Vita)/', $user_agent, $matches)) {
        $browser = 'PLAYSTATION';
        $version = $matches[1];
    // BOT
    } elseif (preg_match('/(Googlebot|bingbot)\/([0-9\.]+)/', $user_agent, $matches)) {
        $browser = $matches[1];
        $version = $matches[2];
    } else {
        $browser = '不明';
        $version = '';
    }
    
    
    /** デバイス判定 */
    if (preg_match('/iPhone;/', $user_agent)) {
        $device = 'iPhone';
    } elseif (preg_match('/iPod/', $user_agent)) {
        $device = 'iPod';
    } elseif (preg_match('/iPad/', $user_agent)) {
        $device = 'iPad';      
    } elseif (preg_match('/Android/', $user_agent)) {
        $device = 'Android';
    } elseif (preg_match('/Windows Phone/', $user_agent)) {
        $device = 'Windows Phone';
    } elseif (preg_match('/(BlackBerry|BB)/', $user_agent)) {
        $device = 'BlackBerry';
    } elseif (preg_match('/PlayStation Vita/', $user_agent)) {
        $device = 'PlayStation Vita';
    } elseif (preg_match('/PlayStation Portable/', $user_agent)) {
        $device = 'PlayStation Portable';
    } elseif (preg_match('/(PS2|PLAYSTATION 3|PlayStation 4)/', $user_agent)) {
        $device = 'PlayStation';
    } elseif (preg_match('/Nintendo 3DS/', $user_agent)) {
        $device = 'Nintendo 3DS';
    } elseif (preg_match('/Nintendo (Wii|WiiU)/', $user_agent)) {
        $device = 'Nintendo Wii(U)';
    } else {
        $device = 'PC';
    }
}

これでユーザーエージェント($user_agent つまり $_SERVER[‘HTTP_USER_AGENT’])から
  • $device(デバイス)
  • $os(OS)
  • $browser(ブラウザ)
  • $version(ブラウザのバージョン)
に分解出来ました。

このままでもいいんですが、一応Contactform7で特別なタグの命名文句的に恐らく他のショートコードと重複しないための工夫として、関数名(ショートコード名)の頭に「_(アンダーバー)」をつける慣習があります。

更に自分でカスタマイズした独自タグの場合は更に名称の重複を防ぐために任意の接頭語をつけるのが良いとされています。

その慣習に習ってこの、
  • $device(デバイス)
  • $os(OS)
  • $browser(ブラウザ)
  • $version(ブラウザのバージョン)

4つの関数名を変えます。全部書き換えるのめんどくさいから横着して。


/**
Contactform7 ユーザーエージェントの判別
**/

// Contactform7にフックを紐付ける
add_filter('wpcf7_special_mail_tags', 'my_special_mail_tags',10,2);

// ユーザー関数(my_special_mail_tags)
function my_special_mail_tags($output, $name) {

(ua.class.php部分を省略してます)

    $_mytag_device = $device;
    $_mytag_os = $os;
    $_mytag_browser = $browser;
    $_mytag_version = $version;

}

関数名を変えました。先頭に「_(アンダーバー)」をつけて、接頭語に任意の「mytag_」を付けてみました。

で、最後はショートコードにするための処理ですが、このあたりはContactform7で独自タグをつくるときの決まり文句的ななので。

興味ある人は色々調べてみて。動きゃいいひとはそのまま使えばいいよ。

で、僕みたいな素人がハマるのが、今回みたいに複数の関数を出力しているので、returnで毎回戻り値にしてあげないとうまく動かなかったりするよ。

と偉そうに言ってますが、何度か動かずreturn適当に何箇所か入れてみたら動いた的なやつだもんで僕も(笑)



完成形とショートコードの追加


完成形がこちらです。


//Contactform7 ユーザーエージェント
add_filter('wpcf7_special_mail_tags', 'my_special_mail_tags',10,2);

function my_special_mail_tags($output, $name) { 
    /** ユーザーエージェント取得 */
    if (empty($user_agent)) {
    $user_agent = $_SERVER['HTTP_USER_AGENT'];
    }

    /** os判定 */
    if (preg_match('/Windows NT 6.3/', $user_agent)) {
        $os = 'Windows 8.1';
    } elseif (preg_match('/Windows NT 6.2/', $user_agent)) {
        $os = 'Windows 8';
    } elseif (preg_match('/Windows NT 6.1/', $user_agent)) {
        $os = 'Windows 7';
    } elseif (preg_match('/Windows NT 6.0/', $user_agent)) {
        $os = 'Windows Vista';
    } elseif (preg_match('/Windows NT 5.2/', $user_agent)) {
        $os = 'Windows Server 2003 / Windows XP x64 Edition';
    } elseif (preg_match('/Windows NT 5.1/', $user_agent)) {
        $os = 'Windows XP';
    } elseif (preg_match('/Windows NT 5.0/', $user_agent)) {
        $os = 'Windows 2000';
    } elseif (preg_match('/Windows NT 4.0/', $user_agent)) {
        $os = 'Microsoft Windows NT 4.0'; 
    } elseif (preg_match('/Mac OS X ([0-9\._]+)/', $user_agent, $matches)) {
        $os = 'Macintosh Intel ' . str_replace('_', '.', $matches[1]);
    } elseif (preg_match('/Linux ([a-z0-9_]+)/', $user_agent, $matches)) {
        $os = 'Linux ' . $matches[1];
    } elseif (preg_match('/OS ([a-z0-9_]+)/', $user_agent, $matches)) {
        $os = 'iOS ' . str_replace('_', '.', $matches[1]);
    } elseif (preg_match('/Android ([a-z0-9\.]+)/', $user_agent, $matches)) {
        $os = 'Android ' . $matches[1];
    } else {
        $os = '不明';
    }
    
    
    /** ブラウザ判定(PC以外はスマホと表示) */
    // マイナー
    if (preg_match('/(Iron|Sleipnir|Maxthon|Lunascape|SeaMonkey|Camino|PaleMoon|Waterfox|Cyberfox)\/([0-9\.]+)/', $user_agent, $matches)) {
        $browser = $matches[1];
        $version = $matches[2];
    // 主要
    } elseif (preg_match('/(^Opera|OPR).*\/([0-9\.]+)/', $user_agent, $matches)) {
        $browser = 'Opera';
        $version = $matches[2];
    } elseif (preg_match('/Chrome\/([0-9\.]+)/', $user_agent, $matches)) {
        $browser = 'Chrome';
        $version = $matches[1]; 
    } elseif (preg_match('/Firefox\/([0-9\.]+)/', $user_agent, $matches)) {
        $browser = 'Firefox';
        $version = $matches[1];
    } elseif (preg_match('/(MSIE\s|Trident.*rv:)([0-9\.]+)/', $user_agent, $matches)) {
        $browser = 'Internet Explorer';
        $version = $matches[2];
    } elseif (preg_match('/\/([0-9\.]+)(\sMobile\/[A-Z0-9]{6})?\sSafari/', $user_agent, $matches)) {
        $browser = 'Safari';
        $version = $matches[1];
    // ゲーム機
    } elseif (preg_match('/Nintendo (3DS|WiiU)/', $user_agent, $matches)) {
        $browser = 'Nintendo';
        $version = $matches[1];
    } elseif (preg_match('/PLAYSTATION (3|Vita)/', $user_agent, $matches)) {
        $browser = 'PLAYSTATION';
        $version = $matches[1];
    // BOT
    } elseif (preg_match('/(Googlebot|bingbot)\/([0-9\.]+)/', $user_agent, $matches)) {
        $browser = $matches[1];
        $version = $matches[2];
    } else {
        $browser = '不明';
        $version = '';
    }
    
    
    /** デバイス判定 */
    if (preg_match('/iPhone;/', $user_agent)) {
        $device = 'iPhone';
    } elseif (preg_match('/iPod/', $user_agent)) {
        $device = 'iPod';
    } elseif (preg_match('/iPad/', $user_agent)) {
        $device = 'iPad';      
    } elseif (preg_match('/Android/', $user_agent)) {
        $device = 'Android';
    } elseif (preg_match('/Windows Phone/', $user_agent)) {
        $device = 'Windows Phone';
    } elseif (preg_match('/(BlackBerry|BB)/', $user_agent)) {
        $device = 'BlackBerry';
    } elseif (preg_match('/PlayStation Vita/', $user_agent)) {
        $device = 'PlayStation Vita';
    } elseif (preg_match('/PlayStation Portable/', $user_agent)) {
        $device = 'PlayStation Portable';
    } elseif (preg_match('/(PS2|PLAYSTATION 3|PlayStation 4)/', $user_agent)) {
        $device = 'PlayStation';
    } elseif (preg_match('/Nintendo 3DS/', $user_agent)) {
        $device = 'Nintendo 3DS';
    } elseif (preg_match('/Nintendo (Wii|WiiU)/', $user_agent)) {
        $device = 'Nintendo Wii(U)';
    } else {
        $device = 'PC';
    }
    $_mytag_device = $device;
    $_mytag_os = $os;
    $_mytag_browser = $browser;
    $_mytag_version = $version;

	if('_mytag_device' == $name){ 
		$output = $_mytag_device;
		return $output;
	}
	
	if('_mytag_os' == $name){ 
		$output = $_mytag_os;
		return $output;
	}
	
	if('_mytag_browser' == $name){ 
		$output = $_mytag_browser;
		return $output;
	}
	
	if('_mytag_version' == $name){ 
		$output = $_mytag_version;
		return $output;
	}
	return $output;
}


で、Contactform7内でショートコードとして使うのはこんな感じで。

ついでにデフォルトでついてる、ipアドレスなんかも取得するといいよね。

cf7

■ IPアドレス
 [_remote_ip]

□ デバイス
 [_mytag_device]

■ OS
 [_mytag_os]

□ ブラウザ
 [_mytag_browser] [_mytag_version]



関連記事

【PHP】曜日と時間を検出して、いつまでに対応するかを表示する

営業時間中であれば、お問合わせいただいてから何分以内に対応しますよという文句を自動で表示したい。

記事を読む

愛車 エブリー

20年戦士のオンボロ愛車をパワーアップ(スズキ・エブリーにNARDI取り付け)

少し前にカーステを取り替えた愛車の青春カー! ※青春カーの命名はN君です。

記事を読む

【バーチャルホスト】サブドメイン・DNSの設定覚書 設定(サーバ)編 予備知識版

これの続きです。 前はDNSの設定編で今回は2ステップの最後サーバの設定です。

記事を読む

【jQuery】Chart.jsを使って簡単にカッコイイレーダーチャートを実装するの巻

友達の結婚式のプロフィールムービーが終わって一息ついていた頃。。。 いつもお世話になっている弁

記事を読む

起業するときにおすすめのサービス【PCFAXでペーパーレス】 02

前回のやつ 前回の流れから、ミニマムに商売をはじめるためのおすすめのサービスの紹介です。

記事を読む

注文住宅(マイホーム)購入ならスーモカウンターがおすすめ(賛否あるけど) 2/3

注文住宅(マイホーム)購入ならスーモカウンターがおすすめ(賛否あるけど) 1/3

記事を読む

注文住宅(マイホーム)を建てる 凄い工務店発見 キミドリ建築の謎

貧乏人も夢を見てもいいじゃない、というわけで。 前回3回に分けて工務店の探し方としてスーモカウ

記事を読む

お金がなくて、時給が低いことの楽しさ

こんなサイトをたまたま見つけました。 はじめての自作PCで自宅サーバーをはじめた PCケ

記事を読む

【結婚式二次会のゲームなどにおすすめ】めくりフリップ 自作 手作り 作り方 材料 で検索にひっかかれ!!

先日友達の結婚式の二次会の幹事をやりました。 その中でゲームの中でめくりフリップあった方がいい

記事を読む

【WordPress】Contact Form 7でEnterキーを押すと勝手に送信されてしまう問題を解決する魔法のコード(JavaScript)

アイキャッチ画像はギャグとして(笑) 就職活動中の女子大生にJavaとJavaScri

記事を読む

Message

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

  • 高橋拓郎(33歳)
    愛知県知多市生まれ。
    大学在学中に個人で始めた事業を、大学院中退後法人化(法人化のために中退が正しいかも)。
    簡単にコンタクトとれるのでt@takuro.infoまで何か御用があればなんなりと。
    ブログの感想やご意見も大歓迎です!
【javaScript】2017年版 法人税実効税率 シミュレーション 自動計算機(コードも置いとくね)

今日は4/3だからこれは嘘じゃないよ!! 法人税実効税率

【ユーザー車検】軽トラを無料でGETしたけど車検代が無いから初の軽自動車ユーザー車検に挑戦!

青春カーと悲しい別れ どうも。貧乏が板に付いてきて久しい僕で

【LINEbot】LINEbotが作れるからphpで作ってみたの巻 ~さくらの共有SSLでも動くよ~

BOT API Trial Accountってのが、公開されたので、L

【電気自動車】日産リーフの無料モニターに当選して2週間使ってみたけれども。。。結論的に購入は時期尚早??

どうも。実写版とってもラッキーマンこと僕です! とっても!ラッキ

追尾メニューのAdSense削除の件

このサイトへのお問い合わせで、以下のような内容のご指摘を頂きました。

→もっと見る

PAGE TOP ↑