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

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

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


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.


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.