【PHP,WordPress,Contactform7】ユーザーエージェント(UA)から「デバイス(PC,スマホ,タブレット)」「OS」「ブラウザ」を取得する→これをContactform7に実装
公開日:
:
how to, ウェブ・ネット・PC(パソコン), サーバ・プログラム
目次
ユーザーエージェント(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アドレスなんかも取得するといいよね。
■ IPアドレス
[_remote_ip]
□ デバイス
[_mytag_device]
■ OS
[_mytag_os]
□ ブラウザ
[_mytag_browser] [_mytag_version]
関連記事
-
20年戦士のオンボロ愛車をパワーアップ(スズキ・エブリーにカーステ取り付け)
ボクの愛車「スズキ・エブリー」です。 ボロいでしょ? エアコンも無くて、窓もパワ
-
【覚書】 WordPress 301 リダイレクト URL変更 htaccess 下層ページ そのまま
このブログのURLを http://www.takahashi-takuro.com か
-
【CentOS,vsftp,Linux(UNIX)】FTPユーザーアカウントの作成とディレクトリのアクセス制限覚書
外注先にサイトの作成やシステムの構築などを依頼する場合に、特定のディレクトリ(フォルダ)以外にアクセ
-
「いま、IS01を想う。」に想う。。。おっさんくさい話。
川脇議員に貴重なお時間を割いていただき、インタビューをさせて頂いたのですが。 知多市議会議員「
-
注文住宅(マイホーム)を建てる 凄い工務店発見 キミドリ建築の謎
貧乏人も夢を見てもいいじゃない、というわけで。 前回3回に分けて工務店の探し方としてスーモカウ
-
SDカードからデジカメで撮影した写真が消えてしまった時の復元方法~データ削除したけど実際には消えていない?~
恋人への愛してるとバックアップは定期的に という有名な格言がなかったりなかったりしますが、バッ
-
【WordPress】WP-PageNaviがデフォルト設定が左寄せだもんで、真中揃えにする方法
WordPressの人気プラグインでWP-PageNaviってやつがあります。 何のプラグイン
-
注文住宅(マイホーム)購入ならスーモカウンターがおすすめ(賛否あるけど) 3/3
注文住宅(マイホーム)購入ならスーモカウンターがおすすめ(賛否あるけど) 1/3 注文住宅(マイホ
-
【WordPress】phpMyAdminを使った移行でsqlインポートが「504 Gateway Time-out」で出来ない場合 SSHのコマンドラインで直接やっちまえ
例によってタイトル激長でうざいですが。。。 WordPressのサーバ移行は意外とよくやります
-
【バーチャルホスト】サブドメイン・DNSの設定覚書 概要編
サブドメインをやろうと思いました。 サブドメインをやる目的は自分のサイトがexam