*

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

ユーザーエージェントとは、サイトにアクセスしてきたユーザーの情報を表したものです。 こちらのペ

記事を読む

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

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

記事を読む

【訴状雛形(ワード)あり】少額訴訟のすゝめ 「少額訴訟の訴状テンプレート(ダウンロード)」~裁判と仲良しになろう~

お金が払ってもらえない時どうする? フリーランスとして活動されているウェブ屋さんや、ス

記事を読む

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

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

記事を読む

【感想】Netflixオリジナルドラマ『Jimmy〜アホみたいなホンマの話〜』 オクレさんもはや本人でしょ??

Netflixオリジナルドラマ『Jimmy〜アホみたいなホンマの話〜』 くそ珍しい3泊4日

記事を読む

zenbookのACアダブターを間違えて買ったので、プラグだけ買って作り直すの巻

zenbookかっちょいいですね!MacBook Airのパクリインスパイア系のウルトラブッ

記事を読む

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

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

記事を読む

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

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

記事を読む

【覚書】 WordPress 301 リダイレクト URL変更 htaccess 下層ページ そのまま

このブログのURLを http://www.takahashi-takuro.com か

記事を読む

Dropbox proが1TBで1,200円/月(年払い12,000円)とかいうギャグで、クラウドでバックアップツールとして最強過ぎる件 世代管理もできるという

クラウドストレージの老舗Dropboxがギャグを展開中(笑) Dropbox / IN 30

記事を読む

Message

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

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

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

  • 高橋拓郎歳)
    愛知県知多市生まれ。
    大学在学中に個人で始めた事業を、大学院中退後法人化(法人化のために中退が正しいかも)。
    簡単にコンタクトとれるのでt@takuro.infoまで何か御用があればなんなりと。
    ブログの感想やご意見も大歓迎です!
no image
確定申告がなかなかできないやつは甘え~僕みたいな貧乏人は1分1秒でも早くやるんだわ~

確定申告の時期ですね。 で、決まってこの時期になると、 確

人生はサウナ理論~結婚するあなたへ~

人生はサウナ理論。 というのを、敬愛するさんちゃんの名言「生きて

e-taxでの確定申告のもにょもにょ(noteからの転載)

この記事は2016年にnoteに投稿した記事の転載です。 ちょう

【感想】Netflixオリジナルドラマ『Jimmy〜アホみたいなホンマの話〜』 オクレさんもはや本人でしょ??

Netflixオリジナルドラマ『Jimmy〜アホみたいなホンマの話〜』

【javaScript】2017年版 法人税実効税率 シミュレーション 自動計算機(コードも置いとくね)

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

→もっと見る

PAGE TOP ↑