Exclure l'iPad de wp_is_mobile

9

Je rencontre un problème très ennuyeux. J'ai construit mon site Web avec des requêtes multimédias et is_mobile (penser que is_mobile serait le même que des écrans plus petits. Quelle bêtise de ma part.) Mais après quelques tests, apparemment, l'iPad le visse (d'accord, en fait, je l'ai fait).

Tous mes problèmes pourraient facilement être résolus si je pouvais exclure un iPad de la fonction wp_is_mobile. Comment réécrire cette fonction?

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 ) {
            $is_mobile = true;
    } else {
        $is_mobile = false;
    }

    return $is_mobile;
}

Comment pourrais-je changer cela?

Bram Vanroy
la source

Réponses:

13

La réponse de tf m'a fait réfléchir. En fait, je peux utiliser la fonction principale et l'adapter à ma guise, mais tout simplement mettre tout dans une nouvelle fonction. Alors voilà:

function my_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'], '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 ) {
            $is_mobile = true;
    } elseif (strpos($_SERVER['HTTP_USER_AGENT'], 'Mobile') !== false && strpos($_SERVER['HTTP_USER_AGENT'], 'iPad') == false) {
            $is_mobile = true;
    } elseif (strpos($_SERVER['HTTP_USER_AGENT'], 'iPad') !== false) {
        $is_mobile = false;
    } else {
        $is_mobile = false;
    }

    return $is_mobile;
}
Bram Vanroy
la source
Il est toujours bon de trouver ses propres solutions, donc +1 pour cela. Cependant, j'ai également mis à jour ma réponse. J'avais une faute de frappe stupide là-dedans: j'ai vérifié ===alors que j'aurais dû vérifier à la !==place - je ne sais pas comment cela s'est produit, mais maintenant je corrige cela. Donc, la réponse ci-dessus devrait également fonctionner - ce que je ne dis absolument pas pour vous faire accepter! C'est juste que, essentiellement, nos réponses / fonctions font la même chose - donc je voulais juste trouver (et corriger) ce qui n'allait pas.
tfrommen
@tf C'est de cela que parlait mon commentaire! Mais, je vais accepter ma propre réponse car je sais que celle-ci fonctionne et je n'ai pas testé votre code. Je ne veux pas que quiconque lise ceci et utilise votre réponse si je ne l'ai pas testée. Je me sens en quelque sorte responsable de ce fil. J'espère que tu comprends. Merci quand même pour l'effort!
Bram Vanroy
Avez-vous réussi à le tester en direct sur un iPad? J'essaie en ce moment sans succès, ipad air, localement.
Kevin
@kevin l'a testé sur un iPAD 3, qui a fonctionné.
Bram Vanroy
4

Vous pouvez également utiliser la classe PHP Mobile Detect régulièrement mise à jour pour créer une fonction personnalisée de détection des mobiles à l'exclusion des tablettes (donc des iPads). Au moment de la rédaction de cette réponse, le dépôt Github avait été mis à jour le plus récemment pour inclure la détection des nouvelles tablettes Samsung il y a 3 mois.

En supposant que vous placez le fichier requis dans le répertoire appelé /includes/dans votre thème, vous pouvez alors ajouter ce code à vos fonctions.php

require_once(get_template_directory() . '/includes/Mobile_Detect.php');

function md_is_mobile() {

  $detect = new Mobile_Detect;

  if( $detect->isMobile() && !$detect->isTablet() ){
    return true;
  } else {
    return false;
  }

}

puis utilisez la fonction md_is_mobile()comme substitut de wp_is_mobile().

Astrotim
la source
Cette solution ne dépend-elle pas de l'installation d'un plugin contenant la classe Mobile Detect?
Brad Dalton
La dépendance de la classe Mobile Detect est gérée par la première ligne du bloc de code ci-dessus; aucun plugin supplémentaire n'est requis. Je dois noter que des plugins WordPress basés sur cette classe existent, tels que WP Mobile Detect , mais cela n'a pas été mis à jour depuis près de 2 ans, donc je préfère personnellement utiliser directement la classe PHP, qui semble être activement développée.
Astrotim
C'est une bonne réponse, mais vous devez installer le fichier Mobile_Detect.php que j'appelle le plugin.
Brad Dalton, le
C'est assez juste!
Astrotim
2

Je sais que c'est vieux, mais je voulais le mettre à jour avec la bonne façon WordPress de mettre en œuvre les solutions précédentes. À partir de la version 4.9.0, plutôt que d'implémenter une autre fonction, ils devraient filtrer le résultat de wp_is_mobile (). Donc:

function myprefix_exclude_ipad( $is_mobile ) {
    if (strpos($_SERVER['HTTP_USER_AGENT'], 'iPad') !== false) {
        $is_mobile = false;
    }
    return $is_mobile ;
}
add_filter( 'wp_is_mobile', 'myprefix_exclude_ipad' );

CEPENDANT Ce qui aurait vraiment dû être fait était de mordre la balle et de réécrire le thème pour qu'il fonctionne correctement sur les tablettes. Il y avait / il y a plus de fabricants de tablettes qu'Apple.

Brian Layman
la source
1

J'ai réécrit (et, à mon avis, optimisé) un peu votre fonction:

function wp_is_mobile() {
    static $is_mobile;

    if (isset($is_mobile))
        return $is_mobile;

    if (
        ! empty($_SERVER['HTTP_USER_AGENT'])

        // bail out, if iPad
        && false === strpos($_SERVER['HTTP_USER_AGENT'], 'iPad')

        // all the other mobile stuff
        && (
            false !== strpos($_SERVER['HTTP_USER_AGENT'], 'Mobile')
            || false !== 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')
        )
    ) $is_mobile = true;
    else $is_mobile = false;

    return $is_mobile;
}

// ÉDITER:

D'accord, encore une fois ...

Écrivez une nouvelle fonction qui utilise en interne la fonction principale et étendez -la:

function my_wp_is_mobile() {
    if (
        ! empty($_SERVER['HTTP_USER_AGENT'])

        // bail out, if iPad
        && false !== strpos($_SERVER['HTTP_USER_AGENT'], 'iPad')
    ) return false;
    return wp_is_mobile();
} // function my_wp_is_mobile

Vous pouvez maintenant utiliser votre nouvelle my_wp_is_mobilefonction où vous le souhaitez.

tfrommen
la source
Donc, je peux simplement mettre cela dans mon fichier functions.php et cela remplacera automatiquement la fonction principale?
Bram Vanroy
Oups, désolé, mon mauvais - je n'ai jamais utilisé cela (et donc je ne savais pas que c'était WP core). Puisque la fonction n'est pas enfichable, vous ne pouvez pas simplement la mettre dans votre functions.phpfichier. Je mettrai à jour ma réponse dans une minute ...
tfrommen
Cela ne semble pas fonctionner. Mais l'agent utilisateur pour iPad ne devrait-il pas retourner vrai?
Bram Vanroy
Hm? J'ai compris que vous vouliez exclure les iPads d'être traités comme des appareils mobiles - comme ils le feraient par wp_is_mobile...? Alors, qu'est-ce qui ne fonctionne pas (comme vous aimeriez le faire)?
tfrommen
Malheureusement, je n'ai pas d'iPad moi-même, je dois donc me fier aux informations que je reçois d'amis. Mais actuellement, j'ai un design qui charge une barre latérale si un agent utilisateur "! Is_mobile" (n'est pas mobile), mais ce n'est pas nécessaire pour l'iPad car sa résolution est suffisamment grande. Mes amis me disent que même si j'ai utilisé if(!my_wp_is_mobile() )la barre latérale, elle n'est toujours pas affichée. D'où je déduis que la fonction ne fonctionne pas.
Bram Vanroy