Z wyłączeniem iPada z wp_is_mobile

9

Mam bardzo irytujący problem. Zbudowałem swoją stronę internetową z zapytaniami medialnymi i is_mobile (myślenie, że is_mobile byłoby tym samym, co mniejsze ekrany. Co za głupie z mojej strony), ale po kilku testach najwyraźniej iPad trochę to zepsuł (dobrze, właściwie to zrobiłem).

Wszystkie moje problemy można łatwo rozwiązać, gdybym mógł wykluczyć iPada z funkcji wp_is_mobile. Jak przepisać tę funkcję?

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

Jak bym to zmienić?

Bram Vanroy
źródło

Odpowiedzi:

13

Odpowiedź tf skłoniła mnie do myślenia. Właściwie mogę korzystać z funkcji podstawowej i dostosowywać ją tak, jak chcę, ale po prostu umieszczam wszystko w nowej funkcji. Więc oto idzie:

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
źródło
Zawsze dobrze jest znaleźć własne rozwiązania, więc daj +1 za to. Zaktualizowałem jednak również swoją odpowiedź. Miałem tam głupią literówkę : sprawdziłem ===, czy powinienem !==zamiast tego sprawdzić - nie mam pojęcia, jak to się stało, ale teraz to naprawiłem. Tak więc powyższa odpowiedź również powinna zadziałać - czego absolutnie nie mówię, abyś ją zaakceptował! Po prostu nasze odpowiedzi / funkcje są w zasadzie takie same - więc chciałem tylko znaleźć (i naprawić) to, co było nie tak.
tfrommen
@tf Właśnie o tym był mój komentarz! Ale przyjmuję własną odpowiedź, ponieważ wiem, że ta działa i nie przetestowałem twojego kodu. Nie chcę, żeby ktokolwiek to przeczytał i użył twojej odpowiedzi, jeśli jej nie przetestowałem. Czuję się w pewnym sensie odpowiedzialny za ten wątek. Mam nadzieję że rozumiesz. Dzięki za wysiłek!
Bram Vanroy,
Czy udało wam się przetestować na żywo na iPadzie? Próbuję teraz bez powodzenia, ipad air, lokalnie.
kevin
@kevin przetestował to na iPAD 3, który działał.
Bram Vanroy
4

Możesz także użyć regularnie aktualizowanej klasy Mobile Detect PHP, aby utworzyć niestandardową funkcję wykrywania telefonów komórkowych z wyłączeniem tabletów (a więc iPadów). W momencie pisania tej odpowiedzi repozytorium Github zostało ostatnio zaktualizowane, aby zawierało wykrywanie nowych tabletów Samsung 3 miesiące temu.

Zakładając, że umieścisz wymagany plik w katalogu o nazwie /includes/w swoim motywie, możesz dodać ten kod do pliku 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;
  }

}

następnie użyj funkcji md_is_mobile()jako zamiennika wp_is_mobile().

Astrotim
źródło
Czy to rozwiązanie nie zależy od instalacji wtyczki zawierającej klasę Mobile Detect?
Brad Dalton,
Zależność klas Mobile Detect jest obsługiwana przez pierwszy wiersz powyższego bloku kodu; dodatkowa wtyczka nie jest wymagana. Powinienem zauważyć, że istnieją wtyczki WordPress oparte na tej klasie, takie jak WP Mobile Detect , ale to nie było aktualizowane od prawie 2 lat, więc osobiście wolę bezpośrednio korzystać z klasy PHP, która wydaje się być aktywnie rozwijana.
Astrotim
To uczciwa odpowiedź, jednak musisz zainstalować plik Mobile_Detect.php, który nazywam wtyczką.
Brad Dalton,
To wystarczy!
Astrotim
2

Wiem, że to jest stare, ale chciałem go zaktualizować o właściwy sposób implementacji poprzednich rozwiązań przez WordPress. Począwszy od wersji 4.9.0, zamiast implementować inną funkcję, powinni filtrować wynik wp_is_mobile (). A zatem:

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

JEDNAK tak naprawdę należało było ugryźć kulę i przepisać motyw, aby działał poprawnie na tabletach. Było / jest więcej producentów tabletów niż Apple.

Brian Layman
źródło
1

Przepisałem (i moim zdaniem zoptymalizowałem) nieco twoją funkcję:

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

// EDYTOWAĆ:

Okej, jeszcze raz ...

Napisz nową funkcję, która wewnętrznie korzysta z funkcji podstawowej i rozszerz ją:

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

Teraz możesz korzystać z nowej my_wp_is_mobilefunkcji w dowolnym miejscu.

tfrommen
źródło
Więc mogę po prostu umieścić to w moim pliku functions.php, a to automatycznie zastąpi funkcję podstawową?
Bram Vanroy
Ups, przepraszam, moje złe - nigdy tego nie użyłem (a więc nie wiedziałem, że to był rdzeń WP). Ponieważ tej funkcji nie można podłączyć , nie można jej po prostu umieścić w functions.phppliku. Zaktualizuję swoją odpowiedź za minutę ...
tfrommen
To nie działa. Ale czy agent użytkownika dla iPada nie powinien zwracać wartości true?
Bram Vanroy
Hm? Zrozumiałem to tak, jakbyś chciał wykluczyć iPady z traktowania ich jako urządzeń mobilnych - tak jak by to zrobili wp_is_mobile...? Co więc nie działa (tak jak chcesz)?
tfrommen
Niestety sam nie mam iPada, więc muszę polegać na informacjach otrzymanych od znajomych. Ale obecnie mam projekt, który ładuje pasek boczny, jeśli klient użytkownika „! Is_mobile” (nie jest mobilny), ale nie jest to konieczne dla iPada, ponieważ jego rozdzielczość jest wystarczająco duża. Moi znajomi mówią mi, że mimo że korzystałem if(!my_wp_is_mobile() )z paska bocznego, nadal nie jest wyświetlany. Z czego wywnioskuję, że funkcja nie działa.
Bram Vanroy