Escluso iPad da wp_is_mobile


9

Sto sperimentando un problema molto fastidioso. Ho creato il mio sito Web con query multimediali e is_mobile (pensando che is_mobile sarebbe lo stesso di schermi più piccoli. Che sciocco da parte mia.) Ma dopo alcuni test apparentemente il tipo di iPad lo rovina (ok, in realtà l'ho fatto).

Tutti i miei problemi potrebbero essere facilmente risolti se potessi escludere un iPad dalla funzione wp_is_mobile. Come riscrivo quella 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 ( 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;
}

Come lo cambierei?

Risposte:


13

La risposta mi ha fatto pensare. In realtà, posso usare la funzione principale e adattarla come preferisco, ma inserisco tutto in una nuova funzione. Quindi 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;
}

È sempre bello trovare le proprie soluzioni, quindi +1 per questo. Tuttavia, ho anche aggiornato la mia risposta. Ho avuto un errore di battitura stupido lì dentro: ho controllato ===mentre avrei dovuto verificare !==invece - non ho idea di come sia successo, ma ora l'ho risolto. Quindi, la risposta di cui sopra dovrebbe funzionare così - che io assolutamente non dico di fare lo accetti! È solo che, in sostanza, le nostre risposte / funzioni fanno lo stesso - quindi volevo solo trovare (e correggere) ciò che era sbagliato.
venerdì

@tf Ecco di cosa parlava il mio commento! Ma accetterò la mia risposta perché so che questa funziona e non ho testato il tuo codice. Non voglio che nessuno legga questo e usi la tua risposta se non l'ho provato. Mi sento in qualche modo responsabile di questa discussione. Spero che tu capisca. Grazie per l'impegno!
Bram Vanroy,

Siete davvero riusciti a provarlo dal vivo su un iPad? Sto provando adesso senza successo, ipad air, localmente.
Kevin

@kevin lo ha testato su un iPAD 3, che ha funzionato.
Bram Vanroy,

4

Puoi anche utilizzare la classe PHP Mobile Detect regolarmente aggiornata per creare una funzione personalizzata per il rilevamento di dispositivi mobili esclusi i tablet (quindi iPad). Al momento della stesura di questa risposta, il repository Github era stato aggiornato di recente per includere il rilevamento per i nuovi tablet Samsung già 3 mesi fa.

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

}

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


Questa soluzione non dipende dall'installazione di un plugin contenente la classe Mobile Detect?
Brad Dalton,

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

È una buona risposta, tuttavia è necessario installare il file Mobile_Detect.php a cui mi riferisco come plugin.
Brad Dalton,

Questo è abbastanza giusto!
Astrotim,

2

So che questo è vecchio, ma volevo aggiornarlo con il modo corretto di WordPress di implementare le soluzioni precedenti. A partire dalla versione 4.9.0, anziché implementare un'altra funzione, dovrebbero filtrare il risultato di wp_is_mobile (). Così:

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 avrebbe dovuto essere fatto è stato mordere il proiettile e riscrivere il tema per funzionare correttamente sui tablet. C'erano / ci sono più produttori di tablet di Apple.


1

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

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

// MODIFICARE:

Va bene, ancora una volta ...

Scrivi una nuova funzione che utilizza internamente la funzione principale ed estendila :

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

Ora puoi usare la tua nuova my_wp_is_mobilefunzione ovunque tu voglia.


Quindi, posso semplicemente inserirlo nel mio file Functions.php e sovrascriverà automaticamente la funzione principale?
Bram Vanroy,

Spiacenti, mio ​​cattivo - non l'ho mai usato (e quindi non sapevo che fosse WP core). Poiché la funzione non è collegabile, non è possibile inserirla nel functions.phpfile. Aggiornerò la mia risposta tra un minuto ...
venerdì

Questo non sembra funzionare. Ma l'agente utente per iPad non dovrebbe tornare vero?
Bram Vanroy,

Hm? L'ho capito come se volessi escludere gli iPad dall'essere trattati come dispositivi mobili - come farebbero wp_is_mobile... Quindi, cosa non funziona (come vorresti fare)?
venerdì

Sfortunatamente non ho un iPad da solo, quindi devo fare affidamento sulle informazioni che ottengo dagli amici. Ma attualmente ho un design che carica una barra laterale se un agente utente "! 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 barra laterale non viene ancora visualizzata. Da cui deduco che la funzione non funziona.
Bram Vanroy,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.