Détection avancée des mobiles en PHP

Il m’est arrivé de devoir trouver des fonctions permettant de détecter si l’internaute visitant mon site utilise un téléphone mobile. Cela s’inscrit dans le Responsive Web Design et dans mon désir d’offrir aux utilisateurs de mobile la meilleur expérience utilisateur possible. Mobile first est d’ailleurs une approche adaptée par un grand nombre de site.

Alors voila, pour vous aider dans votre démarche, vous pouvez utiliser cette classe PHP. Vous pouvez aussi l’intégrer à WordPress, dans le functions.php. Vous pouvez télécharger la classe ici, néanmoins, en voici le code :

Edit : une nouvelle version a été mise en ligne en Janvier 2013. Cliquez ici pour la télécharger.

class Mobile_Detect
{
    protected $accept;
    protected $userAgent;
    protected $isMobile = false;
    protected $isAndroid = null;
    protected $isAndroidtablet = null;
    protected $isIphone = null;
    protected $isIpad = null;
    protected $isBlackberry = null;
    protected $isBlackberrytablet = null;
    protected $isOpera = null;
    protected $isPalm = null;
    protected $isWindows = null;
    protected $isWindowsphone = null;
    protected $isGeneric = null;
    protected $devices = array("android" => "android.*mobile", "androidtablet" => "android(?!.*mobile)", "blackberry" => "blackberry", "blackberrytablet" => "rim tablet os", "iphone" => "(iphone|ipod)", "ipad" => "(ipad)", "palm" => "(avantgo|blazer|elaine|hiptop|palm|plucker|xiino)", "windows" => "windows ce; (iemobile|ppc|smartphone)", "windowsphone" => "windows phone os", "generic" => "(kindle|mobile|mmp|midp|pocket|psp|symbian|smartphone|treo|up.browser|up.link|vodafone|wap|opera mini)");

    public function __construct()
    {
        $this->userAgent = $_SERVER['HTTP_USER_AGENT'];
        $this->accept = $_SERVER['HTTP_ACCEPT'];
        if (isset($_SERVER['HTTP_X_WAP_PROFILE']) || isset($_SERVER['HTTP_PROFILE'])) {
            $this->isMobile = true;
        } elseif (strpos($this->accept, 'text/vnd.wap.wml') > 0 || strpos($this->accept, 'application/vnd.wap.xhtml+xml') > 0) {
            $this->isMobile = true;
        } else {
            foreach ($this->devices as $device => $regexp) {
                if ($this->isDevice($device)) {
                    $this->isMobile = true;
                }
            }
        }
    }

    /** * isAndroid() | isAndroidtablet() | isIphone() | isIpad() | isBlackberry() | isBlackberrytablet() | isPalm() | isWindowsphone() | isWindows() | isGeneric() through isDevice() * * @param string $name * @param array $arguments * @return bool */
    public function __call($name, $arguments)
    {
        $device = substr($name, 2);
        if ($name == "is" . ucfirst($device) && array_key_exists(strtolower($device), $this->devices)) {
            return $this->isDevice($device);
        } else {
            trigger_error("Method $name not defined", E_USER_WARNING);
        }
    }

    /** * Retourne true si c'est un mobile, peu importe le type * @return bool */
    public function isMobile()
    {
        return $this->isMobile;
    }

    protected function isDevice($device)
    {
        $var = "is" . ucfirst($device);
        $return = $this->$var === null ? (bool)preg_match("/" . $this->devices[strtolower($device)] . "/i", $this->userAgent) : $this->$var;
        if ($device != 'generic' && $return == true) {
            $this->isGeneric = false;
        }
        return $return;
    }
}

Pour l’utiliser, c’est très simple :

include("Mobile_Detect.php");
$detect = new Mobile_Detect();
if ($detect->isMobile()) {
    echo "coucou, je suis un mobile";
}

Pour une détection avancée :

if ($detect->isAndroid()) {
    echo "Hey, je tourne sur android";
}

Les différentes méthodes disponibles sont :

  • isAndroid()
  • isAndroidtablet()
  • isIphone()
  • isIpad()
  • isBlackberry()
  • isBlackberrytablet()
  • isPalm()
  • isWindowsphone()
  • isWindows()
  • isGeneric()
Prestashop : affichage d'un produit indisponible dans le panier
LESS CSS : le langage qui a du style

12 Comments on “Détection avancée des mobiles en PHP”

  1. Génial et très facile à utiliser. Jusqu’à présent je ne connaissais que detectmobilebrowsers.com pour pouvoir adapter mes projets aux mobiles et tablette. Mais malheureusement c’est moins flexible puisque ça prend le user agent qu’avec un seul preg_match() (pas possible de classer par catégorie tel que mobile ou tablette …). Merci pour cette classe et le partage d’information.

  2. Merci pour cette classe merveilleuse ! Très pratique et simple à utiliser, elle permet de tester pas mal de choses sur une appli web. Merci pour ce temps gagné !

  3. Exactement le code que je recherchais… c’est super ! Merci.
    une question cependant : je ne suis pas un pro du développement (loin de là) et je me demandais comment je devais utiliser cette classe en utilisant le fichier functions.php. Suffit-il de copier le code ‘tel quel’ dans le fichier functions.php ? et ensuite comment appelle-t-on la fonction depuis une page ou un post ?

    1. Je n’utilise pas cette fonction dans le functions.php, je fais un include. Sinon tu peux probablement l’ajouter tel quel dans le fichier functions.php.
      Puis, a la fin du fichier :
      $detect = new Mobile_Detect();

      et l’appeler de son thème :
      isMobile()) {

      (a tester)

  4. Bonjour, peut être une question un peut bête mais ou doit on placer le include(‘mobile_detect.php’) pour que la détection soit exercė?
    Que dois-je rajouter pour une redirection sur un autre style.css ou directement un sous domaine ?

    1. Bonjour,

      Il faut placer l’include et la détection dans le même fichier. Si vous utilisez WordPress, ça sera header.php, si vous utilisez Prestashop, ça sera header.tpl et ainsi de suite. Dans le cas ou vous souhaitez afficher des fichiers css différents selon le visiteurs, vous pouvez faire :

      include("Mobile_Detect.php");
      $detect = new Mobile_Detect();
      if ($detect->isMobile()) {
          echo '';
      }else {
          echo '';
      }
      1. Bonjour et merci Jérôme,
        Oui j’utilise wordpress je vais donc essayer de le placer dans le header.php
        Merci pour votre aide.

  5. Bonjour,
    merci bien pour cette classe bien utile !
    Savez-vous comment se comportent les bots avec votre classe et une redirection en php

    header(« Location: http://www.mobile.example.com/« )

    Je pense notamment à googlebot-mobile.
    Savez-vous si il existe un risque de duplicate content, ou de mauvais référencement?
    Merci

    1. Bonjour Manon,

      j’utilise principalement cette technique dans le cas de sites responsive pour empêcher le chargement de certains éléments. Si vous cachez des images ou des blocs de contenu en CSS, le mobile doit tout de même le charger pour le cacher. C’est ce que je souhaite éviter ici.

      Si vous utilisez cette bibliothèque pour rediriger un mobile vers une autre version de votre site, il y a plusieurs solutions pour faire comprendre à Google qu’un site est mobile et l’autre pour pc :
      – le robots.txt :
      sur le site pour pc :

      User-agent: Googlebot
      User-agent: Slurp
      User-agent: bingbot
      Allow: /
      
      User-agent: Googlebot-Mobile
      User-Agent: YahooSeeker/M1A1-R2D2
      User-Agent: MSNBOT_Mobile
      Disallow: /
      

      Sur le site mobile :

      User-agent: Googlebot
      User-agent: Slurp
      User-agent: bingbot
      Disallow: /
      
      User-agent: Googlebot-Mobile
      User-Agent: YahooSeeker/M1A1-R2D2
      User-Agent: MSNBOT_Mobile
      Allow: /
      

      – faire un sitemap pour mobile : http://support.google.com/webmasters/bin/answer.py?hl=en&answer=34648
      – ajouter la meta viewport sur le site mobile
      – etc.

      1. Merci Jérôme de votre réponse.
        PS : pour les lecteurs, cette classe marche très bien, claire et facile à utiliser.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *