Escludere iPad da wp_is_mobile
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?
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;
}

È 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.

@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!

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

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.

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()
.

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

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.

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

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.

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

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...

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

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)?

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.

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.
