Excluindo o iPad do wp_is_mobile

9

Estou experimentando um problema muito irritante. Eu construí meu site com consultas de mídia e is_mobile (pensar que is_mobile seria o mesmo que telas menores. Que tolice da minha parte.) 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?

Bram Vanroy
fonte

Respostas:

13

A resposta de tf me fez pensar. Na verdade, eu posso usar a função principal e adaptá-la como eu quiser, mas apenas coloco 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;
}
Bram Vanroy
fonte
É sempre bom encontrar soluções próprias , então marque com +1 isso. No entanto, eu também atualizei minha resposta. Eu tinha um erro estúpido lá dentro: verifiquei ===enquanto deveria ter verificado !==- não faço ideia de como isso aconteceu, mas agora resolvi isso. Então, a resposta acima deve funcionar tão bem - o que eu absolutamente me não dizendo para fazer você aceitá-lo! É que, em essência, nossas respostas / funções fazem o mesmo - então eu só queria encontrar (e consertar) o que estava errado.
tfrommen
@tf Foi sobre isso que meu comentário! Mas vou aceitar minha própria resposta porque sei que essa funciona e não testei seu código. Não quero que ninguém leia isso e use sua resposta se ainda não a testei. Eu me sinto um pouco responsável por esse tópico. Espero que entenda. Obrigado pelo esforço!
Bram Vanroy
Vocês realmente conseguiram testá-lo ao vivo em um ipad? Estou tentando agora sem sucesso, localmente.
kevin
A @kevin testou isso em um iPAD 3, que funcionou.
Bram Vanroy
4

Você também pode usar a classe Mobile Detect PHP atualizada regularmente para criar uma função personalizada para detectar celulares, exceto tablets (portanto, iPads). No momento em que escrevemos essa resposta, o repositório do Github havia sido atualizado recentemente para incluir a detecção de novos tablets Samsung a partir de três meses atrás.

Supondo que você coloque o arquivo necessário no diretório chamado /includes/em seu tema, adicione esse código às suas funções.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;
  }

}

então use a função md_is_mobile()como um substituto para wp_is_mobile().

Astrotim
fonte
Essa solução não depende da instalação de um plug-in que contém a classe Mobile Detect?
Brad Dalton
A dependência da classe Mobile Detect é tratada pela primeira linha do bloco de código acima; nenhum plug-in adicional é necessário. Devo observar que existem plugins do WordPress baseados nessa classe, como o WP Mobile Detect , mas isso não é atualizado há quase 2 anos, então eu pessoalmente prefiro usar a classe PHP diretamente, que parece estar ativamente desenvolvida.
Astrotim
É uma resposta justa, no entanto, você precisa instalar o arquivo Mobile_Detect.php ao qual estou me referindo como o plugin.
Brad Dalton
Isso é justo o suficiente!
Astrotim
2

Eu sei que isso é antigo, mas eu queria atualizá-lo com a maneira correta do WordPress de implementar as soluções anteriores. A partir da versão 4.9.0, em vez de implementar outra função, eles deveriam filtrar o resultado de wp_is_mobile (). Portanto:

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' );

No entanto, o que realmente deveria ter sido feito era morder a bala e reescrever o tema para funcionar corretamente em tablets. Havia / há mais fabricantes de tablets que a Apple.

Brian Layman
fonte
1

Reescrevi (e, na minha opinião, otimizei) 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 use internamente a função principal e estenda -a:

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 my_wp_is_mobilefunção onde quiser.

tfrommen
fonte
Então, eu posso colocar isso dentro do meu arquivo functions.php e ele substituirá automaticamente a função principal?
Bram Vanroy 16/09
Opa, desculpe, meu mal - eu nunca usei isso (e, portanto, não sabia que era o núcleo do WP). Como a função não é conectável, você não pode simplesmente colocar isso no seu functions.phparquivo. Eu vou atualizar a minha resposta em um minuto ...
tfrommen
Isso não parece funcionar. Mas o agente do usuário do iPad não deve retornar verdadeiro?
Bram Vanroy
Hum? Eu entendi como se você quisesse excluir os iPads de serem tratados como dispositivos móveis - como se fossem wp_is_mobile...? Então, o que não funciona (como você gostaria de fazer)?
tfrommen
Infelizmente, eu não tenho um iPad, então tenho que confiar nas informações que recebo dos amigos. Mas atualmente tenho um design que carrega uma barra lateral se um agente de usuário "! Is_mobile" (não for móvel), mas isso não é necessário para o iPad porque sua resolução é grande o suficiente. Meus amigos me dizem que, embora eu usei if(!my_wp_is_mobile() )a barra lateral, ainda não está sendo exibida. Da qual deduzo que a função não funciona.
Bram Vanroy 16/09