*

【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]

関連記事

【バーチャルホスト】サブドメイン・DNSの設定覚書 設定(サーバ)編 いざ!版

これの続き では、いよいよ設定です。 まず設定するファイルは一個だけ

記事を読む

愛車 エブリー

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

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

記事を読む

【WordPress】プラグインBackWPupを3.1.2にアプデしたらDropboxに保存するときにERROR: Dropbox API: (59) ってエラーが出た時の対処法

バックアップと親孝行は後悔した時には遅いので出来るうちにしておけ! という名言がないとかないと

記事を読む

【apacheモジュール】mod_pagespeedのキャッシュの削除の仕方

あいも変わらずgoogle先生はとんでもないものを作りますね!! インストールするだけ! お手

記事を読む

【WordPress】WP-PageNaviがデフォルト設定が左寄せだもんで、真中揃えにする方法

WordPressの人気プラグインでWP-PageNaviってやつがあります。 何のプラグイン

記事を読む

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

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

記事を読む

「chikirin.com」「chikirin.net」ドメイン取ったよ!

電車が混雑していたらお年寄りに席を譲りましょう。 ってことで席を譲ると、「あたしゃ年寄りじゃな

記事を読む

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

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

記事を読む

愛車 エブリー

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

ボクの愛車「スズキ・エブリー」です。 ボロいでしょ? エアコンも無くて、窓もパワ

記事を読む

「ssh port 変更 さくら 専用サーバ できない」 などのワードで検索引っかかってこい

ずーと前からさくらの専用サーバのsshのポートを22から変更しなくちゃ危ないって思っていたけど、人間

記事を読む

Message

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

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

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

  • 高橋拓郎歳)
    愛知県知多市生まれ。
    大学在学中に個人で始めた事業を、大学院中退後法人化(法人化のために中退が正しいかも)。
    簡単にコンタクトとれるのでt@takuro.infoまで何か御用があればなんなりと。
    ブログの感想やご意見も大歓迎です!
人生はサウナ理論~結婚するあなたへ~

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

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

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

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

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

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

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

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

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

→もっと見る

PAGE TOP ↑