PHPでのデバイス分岐を簡易的に導入

このエントリーをはてなブックマークに追加

モバイルの時は一覧での画像を小さいのを表示させよう!と考えた時に、デバイスの分岐が必要になった。そんなことを考えていた今日、なにやら人気記事にショートコードを利用する方法がでていました。

[WordPress]まだなら今すぐ入れたい!PC、スマホで表示を分けるショートコード

ショートコード使えるのは便利だなーと思いつつも、エントリーごとで必要だったわけではないので、自分はもっと簡易な分岐を利用することにした。

WordPress 標準の関数 wp_is_mobile()

WordPress には、3.4 からモバイルデバイスを分岐するための関数が導入されています。その関数を使い、簡易的に分岐させてしまいました。

PHP:簡易版分岐コード

if(wp_is_mobile()) {
  // モバイル向けのコード
} else {
  // モバイル以外へのコード
};

分岐条件詳細

ちなみに 3.8 での wp_is_mobile() の中身は下記のようになっていました。

wp-includes/vars.php

/**
* 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;
}

上記コードの状態の日

See timeline at 10/30/13 19:36:39

参照:vars.php in tags/3.8/src/wp-includes – WordPress Trac

チェックしているのはユーザーエージェントに単語が含まれているかどうかで、その単語は Mobile Android Silk/ Kindle BlackBerry Opera Mini Opera Mobi ですね。

MobileAndroid でチェックしていることもあって、タブレット関係も true になります。

ネタ元のようにショートコードを作成して利用するのも、内容通り便利なのだろうとはわかりますが、絶対に必要というわけでもないため、今回は独自に分岐しました。

ネタ元の内容で気になる「物足りない点をカスタマイズで解決する」方法

今回参照させて頂いたブログの記事では、下記のような分岐のカスタマイズについてふれられていました。

さて、今回のショートコードは、WordPressの公式関数、wp_is_mobileを利用しています。この関数、「iPadもモバイルと判定する」など、ブラウザーを判別する精度がゆるめです。より完璧にしたい場合は、カスタマイズをする必要があります。

参照:vars.php in tags/3.8/src/wp-includes – WordPress Trac

そう、iPad もモバイルと判定している点のみを触れていますので、iPadが除外されるようにカスタマイズされたようなコードが利用されています。つまり、 Android のタブレットもモバイルとして判定されているため、タブレットとしての分岐ではないというところです。

Android のタブレットとモバイルをチェックする場合は、先に Android かつ Mobile かの判定をいれ、その後に再度、Androidかどうかのチェックをすることでおおよそは分岐されるはずです。

以上、ちょっと気になったことも含めたモバイルの分岐判定方法でした。