Escludere iPad da wp_is_mobile

16 set 2013, 20:07:59
Visualizzazioni: 21.8K
Voti: 12

Sto riscontrando un problema molto fastidioso. Ho costruito il mio sito web con media queries e is_mobile (pensando che is_mobile fosse la stessa cosa degli schermi più piccoli. Che ingenuità da parte mia.) ma dopo alcuni test apparentemente l'iPad ha creato dei problemi (ok, in realtà sono stato io).

Tutti i miei problemi potrebbero essere facilmente risolti se potessi escludere un iPad dalla funzione wp_is_mobile. Come posso riscrivere questa funzione?

function wp_is_mobile() {
    static $is_mobile;

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

    if ( empty($_SERVER['HTTP_USER_AGENT']) ) {
        $is_mobile = false;
    } elseif ( 
        // Verifica se è un dispositivo mobile ma NON un iPad
        (strpos($_SERVER['HTTP_USER_AGENT'], 'Mobile') !== false && strpos($_SERVER['HTTP_USER_AGENT'], 'iPad') === 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') !== false ) {
            $is_mobile = true;
    } else {
        $is_mobile = false;
    }

    return $is_mobile;
}

Come posso modificare questo codice?

0
Tutte le risposte alla domanda 4
4
17

La risposta di t f mi ha fatto riflettere. In effetti, posso usare la funzione core e adattarla come preferisco, ma semplicemente racchiudendo tutto in una nuova funzione. Ecco qui:

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;
}
16 set 2013 22:39:23
Commenti

È sempre bene trovare soluzioni proprie, quindi +1 per questo. Tuttavia, ho anche aggiornato la mia risposta. Avevo un stupido errore di battitura lì dentro: controllavo per === mentre avrei dovuto controllare per !== invece - non so come sia successo, ma ora l'ho corretto. Quindi, la risposta sopra dovrebbe funzionare anche - cosa che non sto assolutamente dicendo per fartela accettare! È solo che, in sostanza, le nostre risposte/funzioni fanno lo stesso - quindi volevo solo trovare (e correggere) cosa c'era di sbagliato.

tfrommen tfrommen
16 set 2013 23:44:45

@tf Questo è ciò di cui parlava il mio commento! Ma, accetterò la mia risposta perché so che questa funziona e non ho testato il tuo codice. Non voglio che qualcuno legga questo e usi la tua risposta se non l'ho testata. Mi sento in qualche modo responsabile per questo thread. Spero che tu capisca. Grazie comunque per lo sforzo!

Bram Vanroy Bram Vanroy
17 set 2013 11:43:12

Ragazzi, siete riusciti davvero a testarlo live su un iPad? Sto provando proprio ora senza successo, iPad Air, localmente.

kevin kevin
8 gen 2014 22:18:29

@kevin ha testato questo su un iPAD 3 e ha funzionato.

Bram Vanroy Bram Vanroy
8 gen 2014 22:25:56
0

So che questo è vecchio, ma volevo aggiornarlo con il modo corretto di WordPress per implementare le soluzioni precedenti. A partire dalla versione 4.9.0, invece di implementare un'altra funzione, si dovrebbe filtrare il risultato di wp_is_mobile(). Quindi:

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

TUTTAVIA Quello che si sarebbe dovuto fare davvero è affrontare il problema e riscrivere il tema per funzionare correttamente sui tablet. Ci sono/sono stati più produttori di tablet oltre ad Apple.

19 dic 2018 02:21:20
4

Puoi anche utilizzare la classe PHP Mobile Detect regolarmente aggiornata per creare una funzione personalizzata che rilevi i dispositivi mobili escludendo i tablet (quindi anche gli iPad). Al momento della stesura di questa risposta, il repository Github era stato aggiornato più di recente per includere il rilevamento dei nuovi tablet Samsung fino a 3 mesi fa.

Supponendo che tu posizioni il file richiesto in una directory chiamata /includes/ nel tuo tema, puoi aggiungere questo codice al tuo 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;
  }

}

Puoi quindi utilizzare la funzione md_is_mobile() come sostituto di wp_is_mobile().

7 feb 2015 11:23:44
Commenti

Questa soluzione non dipende dall'installazione di un plugin che contiene la classe Mobile Detect?

Brad Dalton Brad Dalton
7 feb 2015 15:35:03

La dipendenza dalla classe Mobile Detect è gestita dalla prima riga del blocco di codice sopra; non è richiesto alcun plugin aggiuntivo. Vorrei far notare che esistono plugin per WordPress basati su questa classe, come WP Mobile Detect, ma non è stato aggiornato da quasi 2 anni, quindi personalmente preferisco usare direttamente la classe PHP, che sembra essere attivamente sviluppata.

Astrotim Astrotim
9 feb 2015 03:52:39

È una risposta valida tuttavia è necessario installare il file Mobile_Detect.php a cui mi riferisco come plugin.

Brad Dalton Brad Dalton
9 feb 2015 11:00:25

È abbastanza giusto!

Astrotim Astrotim
10 feb 2015 04:47:45
7

Ho riscritto (e, a mio parere, ottimizzato) un po' la tua funzione:

function wp_is_mobile() {
    static $is_mobile;

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

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

        // esci se è un iPad
        && false === strpos($_SERVER['HTTP_USER_AGENT'], 'iPad')

        // tutto il resto dei dispositivi mobili
        && (
            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;
}

// MODIFICA:

Okay, ancora una volta...

Scrivi una nuova funzione che internamente utilizza la funzione core e la estende:

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

        // esci se è un iPad
        && false !== strpos($_SERVER['HTTP_USER_AGENT'], 'iPad')
    ) return false;
    return wp_is_mobile();
} // function my_wp_is_mobile

Ora puoi usare la tua nuova funzione my_wp_is_mobile dove vuoi.

16 set 2013 20:52:21
Commenti

Quindi, posso semplicemente inserire questo nel mio file functions.php e sovrascriverà automaticamente la funzione core?

Bram Vanroy Bram Vanroy
16 set 2013 21:04:54

Ops, scusa, colpa mia - non ho mai usato questa funzione (e quindi non sapevo fosse parte del core di WP). Dato che la funzione non è "pluggable", non puoi semplicemente inserirla nel tuo file functions.php. Aggiornerò la mia risposta tra un attimo...

tfrommen tfrommen
16 set 2013 21:08:12

Sembra che questo non funzioni. Ma l'user agent per iPad non dovrebbe restituire true?

Bram Vanroy Bram Vanroy
16 set 2013 21:37:45

Hm? Ho capito che volevi escludere gli iPad dall'essere trattati come dispositivi mobili - come farebbe wp_is_mobile...? Quindi, cosa non funziona (come vorresti fare)?

tfrommen tfrommen
16 set 2013 22:07:03

Sfortunatamente non ho un iPad personalmente, quindi devo affidarmi alle informazioni che ricevo dagli amici. Ma attualmente ho un design che carica una sidebar se un user agent "!is_mobile" (non è mobile), ma questo non è necessario per l'iPad perché la sua risoluzione è abbastanza grande. I miei amici mi dicono che anche se ho usato if(!my_wp_is_mobile() ) la sidebar non viene comunque visualizzata. Da ciò deduco che la funzione non funziona.

Bram Vanroy Bram Vanroy
16 set 2013 22:10:08

E quello che intendevo con il mio commento è che pensavo che la funzione controlli "se l'user agent NON è vuoto E se è falso che l'user agent è iPad" restituisce false. Ma direi che ho bisogno di "se l'user agent NON è vuoto e se è vero che l'user agent è iPad"? Forse ha a che fare con il fatto che esegui la funzione core effettiva anche dopo la funzione personalizzata? E poi $_SERVER['HTTP_USER_AGENT'], 'Mobile') restituirà true per iPad.

Bram Vanroy Bram Vanroy
16 set 2013 22:14:05

Risolto (vedi la mia risposta). Grazie comunque per le idee!

Bram Vanroy Bram Vanroy
16 set 2013 22:39:38
Mostra i restanti 2 commenti