Excluindo o iPad do wp_is_mobile

8

Estou experimentando um problema muito chato. Eu construí meu site com consultas de mídia e is_mobile (pensar is_mobile seria o mesmo que telas menores. Que tolo de mim.) Mas depois de alguns testes aparentemente o iPad meio que estraga tudo (ok, na verdade eu fiz).

Todos os meus problemas poderiam ser facilmente resolvidos se eu pudesse excluir um iPad da função wp_is_mobile. Como reescrevo essa função?

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

Como eu mudaria isso?

    
por Bram Vanroy 16.09.2013 / 19:07

3 respostas

11
A resposta de p me fez pensar. Na verdade, posso usar a função principal e adaptá-la como quiser, mas basta colocar tudo em uma nova função. Então aqui vai:

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;
}
    
por Bram Vanroy 16.09.2013 / 21:39
4

Você também pode usar a classe PHP Mobile Detect regularmente atualizada para criar uma função personalizada para detectar celulares, excluindo tablets (ou seja, iPads). No momento de escrever esta resposta, o repositório do Github foi atualizado recentemente para incluir a detecção para novos tablets Samsung a partir de 3 meses atrás.

Supondo que você coloque o arquivo requerido no diretório chamado /includes/ em seu tema, então você pode adicionar este código ao seu 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;
  }

}

use a função md_is_mobile() como substituto de wp_is_mobile() .

    
por Astrotim 07.02.2015 / 10:23
1

Eu reescrevi (e, na minha opinião, otimizado) sua função um pouco:

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

// EDIT:

Ok, mais uma vez ...

Escreva uma nova função que usa internamente a função principal e estenda :

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

Agora você pode usar sua nova função my_wp_is_mobile onde quiser.

    
por tfrommen 16.09.2013 / 19:52