Excluderea iPad-ului din wp_is_mobile
Mă confrunt cu o problemă foarte enervantă. Mi-am construit site-ul web cu media queries și is_mobile (crezând că is_mobile ar fi același lucru cu ecranele mai mici. Ce naiv din partea mea.) dar după câteva teste, se pare că iPad-ul cumva strică totul (de fapt, eu am stricat).
Toate problemele mele ar putea fi rezolvate ușor dacă aș putea exclude un iPad din funcția wp_is_mobile. Cum pot rescrie această funcție?
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 // multe dispozitive mobile (toate 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;
}
Cum aș putea modifica acest cod?
Răspunsul lui t f m-a făcut să mă gândesc. De fapt, pot folosi funcția de bază și să o adaptez după cum doresc, dar să pun totul într-o funcție nouă. Așa că iată:
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;
}

Este întotdeauna bine să găsești soluții proprii, așa că +1 pentru asta. Totuși, am actualizat și eu răspunsul meu. Aveam o greșeală de tipar stupidă acolo: verificam cu ===
în loc să verific cu !==
- habar nu am cum s-a întâmplat asta, dar acum am reparat-o. Deci, răspunsul de mai sus ar trebui să funcționeze și el - nu spun asta pentru a te face să-l accepți! Doar că, în esență, răspunsurile/funcțiile noastre fac același lucru - așa că am vrut doar să găsesc (și să repar) ce era în neregulă.

@tf Despre asta vorbeam în comentariul meu! Dar, o să accept propriul meu răspuns pentru că știu că acesta funcționează și nu am testat codul tău. Nu vreau ca cineva care citește asta să folosească răspunsul tău dacă eu nu l-am testat. Mă simt cumva responsabil pentru acest thread. Sper că înțelegi. Oricum, mulțumesc pentru efort!

Ați reușit să-l testați efectiv pe un iPad? Eu încerc acum fără succes, iPad Air, local.

Știu că acest lucru este vechi, dar am dorit să-l actualizez cu metoda corectă în WordPress de a implementa soluțiile anterioare. Începând cu versiunea 4.9.0, în loc să implementăm o altă funcție, ar trebui să filtrăm rezultatul funcției wp_is_mobile(). Astfel:
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' );
DAR ceea ce trebuia făcut cu adevărat era să acceptăm situația și să rescriem tema pentru a funcționa corect pe tablete. Existau/ există mai mulți producători de tablete decât doar Apple.

De asemenea, poți folosi clasa PHP Mobile Detect, care este actualizată periodic, pentru a crea o funcție personalizată care detectează telefoanele mobile, excluzând tabletele (inclusiv iPad-urile). La momentul scrierii acestui răspuns, depozitul Github a fost actualizat cel mai recent pentru a include detectarea noilor tablete Samsung acum 3 luni.
Presupunând că plasezi fișierul necesar într-un director numit /includes/
în tema ta, poți adăuga acest cod în 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;
}
}
Apoi poți folosi funcția md_is_mobile()
ca înlocuitor pentru wp_is_mobile()
.

Nu depinde această soluție de instalarea unui plugin care conține clasa Mobile Detect?

Dependența de clasa Mobile Detect este gestionată de prima linie a blocului de cod de mai sus; nu este necesar niciun plugin suplimentar. Trebuie să menționez că există plugin-uri WordPress bazate pe această clasă, cum ar fi WP Mobile Detect, dar acesta nu a fost actualizat de aproape 2 ani, așa că personal prefer să folosesc direct clasa PHP, care pare să fie în dezvoltare activă.

Este un răspuns corect, însă trebuie să instalați fișierul Mobile_Detect.php la care mă refer ca fiind plugin-ul.

Am rescris (și, în opinia mea, optimizat) puțin funcția ta:
function wp_is_mobile() {
static $is_mobile;
if (isset($is_mobile))
return $is_mobile;
if (
! empty($_SERVER['HTTP_USER_AGENT'])
// renunță dacă e iPad
&& false === strpos($_SERVER['HTTP_USER_AGENT'], 'iPad')
// toate celelalte dispozitive mobile
&& (
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:
Bine, încă o dată...
Scrie o nouă funcție care folosește intern funcția de bază și extinde-o:
function my_wp_is_mobile() {
if (
! empty($_SERVER['HTTP_USER_AGENT'])
// renunță dacă e iPad
&& false !== strpos($_SERVER['HTTP_USER_AGENT'], 'iPad')
) return false;
return wp_is_mobile();
} // function my_wp_is_mobile
Acum poți folosi noua ta funcție my_wp_is_mobile
oriunde dorești.

Deci, pot să pun asta pur și simplu în fișierul meu functions.php și va suprascrie automat funcția de bază?

Hopa, scuze, greșeala mea - nu am folosit niciodată asta (și deci nu știam că face parte din WP core). Deoarece funcția nu este "pluggable", nu poți pur și simplu să pui asta în fișierul tău functions.php
. Voi actualiza răspunsul meu imediat...

Se pare că nu funcționează. Dar nu ar trebui ca user agent-ul pentru iPad să returneze true?

Hm? Am înțeles că dorești să excludi iPad-urile din tratarea ca dispozitive mobile - așa cum ar face wp_is_mobile
...? Deci, ce nu funcționează (așa cum ai dori)?

Din păcate, nu dețin un iPad, așa că trebuie să mă bazez pe informațiile primite de la prieteni. În prezent, am un design care încarcă o bară laterală dacă user agent-ul "!is_mobile" (nu este mobil), dar acest lucru nu este necesar pentru iPad deoarece rezoluția sa este suficient de mare. Prietenii mei spun că, deși am folosit if(!my_wp_is_mobile() )
, bara laterală tot nu este afișată. Din care deduc că funcția nu funcționează.

Și ceea ce am vrut să spun prin comentariul meu este că am crezut că funcția verifică "dacă user agent-ul NU este gol ȘI dacă este fals că user agent-ul este iPad" returnează false. Dar aș spune că am nevoie de "dacă user agent-ul NU este gol și dacă este adevărat că user agent-ul este iPad"? Poate are legătură cu faptul că rulezi funcția principală după funcția personalizată? Și apoi $_SERVER['HTTP_USER_AGENT'], 'Mobile')
va returna true pentru iPad.
