web-dev-qa-db-fra.com

Exclure l'iPad de wp_is_mobile

Je suis confronté à un problème très ennuyant. J'ai construit mon site Web avec des requêtes de médias et is_mobile (penser qu'is_mobile serait la même chose que de plus petits écrans. C'est ridicule de ma part.) Mais après quelques tests, apparemment, le genre d'iPad s'enfuit (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 puis-je 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?

9
Bram Vanroy

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

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;
}
13
Bram Vanroy

Vous pouvez également utiliser la classe Mobile Detect PHP _ régulièrement mise à jour -/pour créer une fonction personnalisée de détection des mobiles autres que les tablettes (donc les iPad). Au moment de la rédaction de cette réponse, le Github repo avait récemment été mis à jour pour inclure la détection des nouvelles tablettes Samsung il y a 3 mois.

En supposant que vous placiez le fichier requis dans le répertoire appelé /includes/ dans votre thème, vous pouvez ensuite ajouter ce code à votre functions.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;
  }

}

utilisez ensuite la fonction md_is_mobile() pour remplacer wp_is_mobile().

4
Astrotim

Je sais que cela est ancien, mais je voulais le mettre à jour avec la méthode WordPress appropriée pour implémenter les solutions précédentes. À partir de la version 4.9.0, au lieu d'implémenter une autre fonction, ils devraient filtrer le résultat de wp_is_mobile (). Ainsi:

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 QU'IL aurait vraiment dû être fait était de mordre la balle et de réécrire le thème pour fonctionner correctement sur les tablettes. Il y avait/il y a plus de fabricants de tablettes qu'Apple.

1
Brian Layman

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

// MODIFIER:

Ok, encore une fois ...

Ecrivez une nouvelle fonction qui utilise en interne la fonction principale et extend it:

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

Maintenant, vous pouvez utiliser votre nouvelle fonction my_wp_is_mobile où vous voulez.

1
tfrommen