Jak wykryć urządzenia mobilne i przedstawić im określony motyw?

31

Chciałbym utworzyć nową zmodyfikowaną wersję mojego motywu (sprawdź mój profil, jeśli to konieczne), aby przedstawić go odwiedzającym, jeśli wykryję, że odwiedzają witrynę z urządzenia przenośnego, takiego jak iPhone, Android itp.

  1. Jak wykryć, czy żądanie pochodzi z urządzenia mobilnego / przeglądarki?
  2. Jak mogę załadować i zaprezentować im dedykowany motyw?

Więcej informacji : Mój motyw nie jest płynny. Ma stałą szerokość około 976px (zawartość 676px + reszta to lewy pasek boczny). Nie chcę zrewolucjonizować motywu, ale wydaje mi się, że jest zbyt duży dla telefonów 320x480 i 800x480. Prawdopodobnie usunę pasek boczny lub przynajmniej przesunę go w prawo i wykonam inne małe poprawki.

Kaczor
źródło

Odpowiedzi:

19

Podobnie jak większość innych, bardzo polecam korzystanie z WPTouch. Jednak jest zbudowany bardziej do obsługi blogów niż innych formatów witryn, więc wiem, że nie jest to panaceum na rozwiązania mobilne (prowadzę moje portfolio na WordPress, a także na moim blogu, a moje portfolio wygląda jak ****w WPTouch).

Rzuciłem więc okiem na kod, aby znaleźć odpowiednie części, których należy użyć do zreplikowania wykrywania przeglądarki mobilnej. Po pierwsze, jak wspomniał Jan Fabry, jest to lista agentów użytkownika przeglądarki mobilnej. WPTouch zawiera domyślną listę, ale umożliwia także dodawanie niestandardowych programów użytkownika z ustawieniem lub filtrem o nazwie wptouch_user_agents:

function bnc_wptouch_get_user_agents() {
    $useragents = array(           
        "iPhone",                                // Apple iPhone
        "iPod",                                  // Apple iPod touch
        "Android",                               // 1.5+ Android
        "dream",                                 // Pre 1.5 Android
        "CUPCAKE",                               // 1.5+ Android
        "blackberry9500",                        // Storm
        "blackberry9530",                        // Storm
        "blackberry9520",                        // Storm v2
        "blackberry9550",                        // Storm v2
        "blackberry9800",                        // Torch
        "webOS",                                 // Palm Pre Experimental
        "incognito",                             // Other iPhone browser
        "webmate",                               // Other iPhone browser
        "s8000",                                 // Samsung Dolphin browser
        "bada"                                   // Samsung Dolphin browser
    );

    $settings = bnc_wptouch_get_settings();
    if ( isset( $settings['custom-user-agents'] ) ) {
        foreach( $settings['custom-user-agents'] as $agent ) {
            if ( !strlen( $agent ) ) continue;

            $useragents[] = $agent; 
        }       
    }

    asort( $useragents );

    // WPtouch User Agent Filter
    $useragents = apply_filters( 'wptouch_user_agents', $useragents );

    return $useragents;
}

Jednak mięso wtyczki jest klasą:

class WPtouchPlugin {
    var $applemobile;
    var $desired_view;
    var $output_started;
    var $prowl_output;
    var $prowl_success;

    ...

Konstruktor wtyczki ( function WPtouchPlugin()) najpierw dodaje akcję do przechwytywania w plugins_loadedcelu wykrycia klienta użytkownika przeglądarki mobilnej i ustawia wartość $applemobiletrue. Oto konkretna funkcja:

function detectAppleMobile($query = '') {
    $container = $_SERVER['HTTP_USER_AGENT'];

    $this->applemobile = false;
    $useragents = bnc_wptouch_get_user_agents();
    $devfile =  compat_get_plugin_dir( 'wptouch' ) . '/include/developer.mode';
    foreach ( $useragents as $useragent ) {
        if ( preg_match( "#$useragent#i", $container ) || file_exists( $devfile ) ) {
            $this->applemobile = true;
        }       
    }
}

Teraz wtyczka wie, że używasz przeglądarki mobilnej (zgodnie z agentem użytkownika przeglądarki). Następną mięsną częścią wtyczki jest zestaw filtrów:

if ( strpos( $_SERVER['REQUEST_URI'], '/wp-admin' ) === false ) {
    add_filter( 'stylesheet', array(&$this, 'get_stylesheet') );
    add_filter( 'theme_root', array(&$this, 'theme_root') );
    add_filter( 'theme_root_uri', array(&$this, 'theme_root_uri') );
    add_filter( 'template', array(&$this, 'get_template') );       
}

Każdy z tych filtrów wywołuje metodę, która sprawdza, czy $applemoblewartość true. Jeśli tak, to WordPress użyje mobilnego arkusza stylów, mobilnego motywu i mobilnego szablonu posta / strony zamiast domyślnych szablonów. Zasadniczo zastępujesz domyślne zachowanie WordPressa w oparciu o to, czy używana przeglądarka ma agenta użytkownika, który pasuje do Twojej listy „przeglądarek mobilnych”.

WPTouch obejmuje również możliwość wyłączenia motywu mobilnego - kiedy odwiedzasz witrynę WPTouch na iPhonie, u dołu znajduje się przycisk, który pozwala normalnie wyświetlić stronę. Możesz wziąć to pod uwagę, tworząc własne rozwiązanie.

Oświadczenie: Cały powyższy kod został skopiowany ze źródła dla WPTouch w wersji 1.9.19.4 i jest chroniony na licencji GPL. Jeśli użyjesz ponownie tego kodu, Twój system musi również być zgodny z warunkami GPL. Nie napisałem tego kodu.

EAMann
źródło
Czy to jest domyślna lista UA? Brak Opera Mini lub Opera Mobile? Dziwne.
fuxia
To jest lista UA prosto z kodu źródłowego ... pamiętaj jednak, że WPTouch 2.0 to wtyczka premium, którą musisz zakupić od BraveNewCode . Nie szukałem jeszcze źródła, więc może mieć zaktualizowaną listę UA.
EAMann
8

Możesz przyjrzeć się, jak robi to bardzo popularna wtyczka WPtouch . Daje inny motyw dla urządzeń mobilnych „iPhone, iPod touch, Android, Opera Mini, Palm Pre, Samsung touch i BlackBerry Storm / Torch” . W kodzie źródłowym widzę listę programów klienckich , to chyba klucz.

Inna wtyczka, WP-Wurfled , korzysta z obszernej bazy danych Wireless Universal Resource File . Ta stale aktualizowana baza danych urządzeń mobilnych zawiera również wiele informacji o możliwościach , dzięki czemu znasz rozdzielczość ekranu urządzenia po stronie serwera, czy obsługuje Flash, ...

template_redirectHak działanie jest często używany do załadowania niestandardowe tematy, jak to jest niemal ostatniej chwili przed rzeczywistym pliku szablonu jest wliczone w cenę ( template_includejest to ostatni hak, ale to filtr).

Jan Fabry
źródło
7

Ryzykując, że nie odpowiem na pytanie, radzę tego nie robić.

Używam urządzeń z iOS od miesięcy, a jedną z pierwszych rzeczy, które zrobiłem po zakupie iPada, było wymyślenie układu CSS, który zmieniał jego zachowanie w zależności od używanego urządzenia (i pierwotnie orientacji ekranu ).

W chwili pisania tego tekstu działa on na mojej stronie deweloperów (http://dev.semiologic.com/). Jeśli przetestujesz go na urządzeniu z systemem iOS, zauważysz, że układ przełącza się z kolumny z paskami bocznymi na iPadzie do kolumny z pojedynczą kolumną opartą na iPhonie. (Paski boczne są ułożone w dwóch kolumnach, a dolne pola w dwóch kolumnach poniżej). Efekt można odtworzyć za pomocą Safari, zmniejszając szerokość przeglądarki.

W każdym razie, chociaż programowanie było zabawne, w końcu przyszło mi do głowy, że przynajmniej na urządzeniach z iOS układ zoptymalizowany pod kątem urządzeń mobilnych pogorszył sytuację, a nie poprawił. Wbudowane powiększenie Safari dla urządzeń mobilnych sprawia, że ​​dopóki główna kolumna ma szerokość 480 pikseli, witryna jest już zoptymalizowana pod kątem zastosowań mobilnych. Dodaj pasek boczny o szerokości 240px, aby uzyskać układ o szerokości 720px, a Twoja strona pasuje i wygląda świetnie we wszystkich:

  • 1024x768 (iPad poziomy)
  • 768x1024 (iPad portret)
  • 800 x 600 (użytkownicy ze słabym wzrokiem)
  • 480x320 (iPhone w orientacji poziomej)
  • 320x480 (portret iPhone'a, z automatycznym powiększaniem)

500px + 250px działa również, jeśli wolisz mieć coś o łącznej wartości 750px, jeśli weźmiesz pod uwagę wbudowane powiększenie Safari. Strona nadal będzie wyglądać dobrze i będzie doskonale czytelna na iPhone'ach zarówno w trybie poziomym, jak i pionowym.

W każdym razie, wracając do pytania, testy wykazały, że jedyną rzeczą, której NIE powinieneś robić, jest użycie układu o elastycznej szerokości. (Nawiasem mówiąc, WP-touch zrobi to samo, chyba że się mylę.) Takie postępowanie prowadzi do nieoptymalnego powiększenia. Na iPadzie możesz powiększyć coś ograniczonego w kolumnie o szerokości 480 pikseli, co pozwala na większy rozmiar tekstu; coś, co „dostosowuje” się do szerokości ekranu zmusza do czytania małego tekstu lub przewijania w poziomie, jeśli jest zbyt małe, aby wygodnie go czytać ...

Denis de Bernardy
źródło
Dziękuję za sugestie. Moja witryna nie jest płynna, ale ma stałą szerokość około 976 pikseli (zawartość 676 pikseli + reszta to lewy pasek boczny). Nie chcę zrewolucjonizować motywu, ale wydaje mi się, że ma on szerokość dla telefonów 320x480 i 800x480. Prawdopodobnie usunę pasek boczny lub przynajmniej przesunę go w prawo.
Drake
Zgadzam się w 100% z tego, co widziałem. Z nielicznymi wyjątkami „motywy mobilne” - przynajmniej wtyczki „motyw mobilny” - są do bani i są trudniejsze w użyciu niż nawigacja po oryginalnej stronie na urządzeniu mobilnym. Chociaż jeśli zależy ci na tym, aby spróbować stworzyć mobilną wersję swojej witryny, pomyśl o niej jako o przeprojektowaniu, a nie tylko o ulepszeniu arkusza stylów.
goldenapples,
3

Proste: użyj wp_is_mobile()do przetestowania - uruchomi się truena wszystkich urządzeniach mobilnych (smartfony, tablety itp.).

Aktualizacja

Proszę nie rób tego. Nie działa niezawodnie.

kajzer
źródło
2

To jest naprawdę świetny skrypt, jeśli chcesz go dostosować, łatwy do zintegrowania z wordpress. http://detectmobilebrowsers.mobi/

Należy zauważyć, że większość użytkowników telefonów iPhone, Andriod lub telefonów komórkowych z natywną obsługą przeglądarki nie chce być automatycznie przekierowywana!

Jest to zła praktyka, daj im opcję poprzez link do wersji mobilnej ORAZ w wersji mobilnej daj im opcję powrotu do oryginalnej strony.

Powtarzam, nie przekierowuj automatycznie użytkowników, chyba że budujesz coś bardzo specyficznego dla urządzeń mobilnych lub masz ruch ze starszych telefonów bez obsługi natywnej przeglądarki (mało prawdopodobne).

  • Chciałem dodać, jednym z łatwych sposobów określenia, jak ważne jest to za pomocą dzienników serwera.
Wyck
źródło
Dobra obserwacja oferująca opcje przełączania w obu wersjach. Czasami używasz przeglądarki innej niż mobilna, ale masz wolne połączenie (przez modem komórkowy, złe Wi-Fi, połączenie modemowe ...) i wolisz wersję zoptymalizowaną pod kątem urządzeń mobilnych, ponieważ jest ona (ogólnie) również mniejsza.
Jan Fabry
2

Dodam alternatywne podejście.

Może chcesz stworzyć rękodzieło i dopracować cały styl i zachowanie zgodnie z bardzo konkretnymi potrzebami.

Niedawno musiałem: czy IE9 jedna rzecz, czy iPhone drugi, czy iPad trzeci itd. ... I użyłem klasy Browser.php Chrisa Schulda z doskonałymi wynikami.

Wymyślona funkcja i przykłady użycia:

require_once('Browser.php');
$browser_check = new Browser();
$browser_agent = $browser_check->getBrowser();
$browser_version = $browser_check->getVersion();

function browser_check($what) {
    global $browser_agent, $browser_version;
    switch ($what) {
        case 'version':
            return $browser_version;
        break;
        case 'ie':
            if ($browser_agent==Browser::BROWSER_IE) return true;
            else return false;
        break;
        case 'mobile':
            if ($browser_agent==Browser::BROWSER_ANDROID || $browser_agent==Browser::BROWSER_IPOD || $browser_agent==Browser::BROWSER_IPHONE) return true;
            else return false;          
        break;
        case 'ipad':
            if ($browser_agent==Browser::BROWSER_IPAD) return true;
            else return false;          
        break;
        default:
            return false;
        break;
    }
}

echo "Browser Version: " . browser_check('version');

if ( browser_check('ie') ) echo "Using Internet Explorer - print proper CSS";

if ( browser_check('mobile') ) echo "Using iPhone, iPod or Android - print proper JAVASCRIPT";

if ( browser_check('ipad') ) echo "Using iPad - print proper PHP";
brasofilo
źródło