Come rilevare i dispositivi mobili e presentare loro un tema specifico?


31

Vorrei creare una nuova versione modificata del mio tema (controlla il mio profilo se necessario) per presentarlo ai visitatori se rilevo che stanno visitando il sito da un dispositivo portatile, come iPhone, Android, ecc.

  1. Come rilevare se la richiesta proviene da un dispositivo mobile / browser?
  2. Come posso caricare e presentare loro un tema dedicato?

Ulteriori informazioni : Il mio tema non è fluido. Ha una larghezza fissa di circa 976 px (contenuto 676 px + resto è barra laterale sinistra). Non voglio rivoluzionare il tema, ma penso che sia troppo grande per i telefoni 320x480 e 800x480. Probabilmente rimuoverò la barra laterale o almeno la sposterò a destra e farò altre piccole regolazioni.

Risposte:


19

Come la maggior parte degli altri, consiglio vivamente di usare WPTouch. Tuttavia, è costruito più per supportare i blog rispetto ad altri formati di siti Web, quindi so che non è la panacea delle soluzioni mobili (gestisco il mio portafoglio su WordPress così come il mio blog e il mio portafoglio sembra ****in WPTouch).

Quindi ho dato un'occhiata al codice per trovare le parti pertinenti che dovresti usare per replicare il rilevamento del browser mobile. In primo luogo, come menzionato da Jan Fabry, è un elenco di agenti utente del browser mobile. WPTouch include un elenco predefinito, ma consente anche di aggiungere agenti utente personalizzati con un'impostazione o con un filtro chiamato 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;
}

La carne del plugin, tuttavia, è una classe:

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

    ...

Il costruttore del plug-in ( function WPtouchPlugin()) aggiunge innanzitutto un'azione plugins_loadedall'hook per rilevare l'agente utente del browser mobile e impostare $applemobilesu true. Ecco la funzione specifica:

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

Ora il plug-in sa che stai usando un browser mobile (secondo l'agente dell'utente del browser). La prossima parte carnosa del plugin è un insieme di filtri:

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

Ognuno di questi filtri chiama un metodo che controlla se $applemobleè impostato su true. In tal caso, WordPress utilizzerà il tuo foglio di stile mobile, il tuo tema mobile e un modello di post / pagina mobile invece di quelli predefiniti per il tuo tema. Fondamentalmente, stai ignorando il comportamento predefinito di WordPress in base al fatto che il browser in uso abbia o meno un agente utente che corrisponde al tuo elenco di "browser mobili".

WPTouch include anche la possibilità di disattivare il tema mobile: quando visiti un sito WPTouch su un iPhone, c'è un pulsante in basso che ti consente di visualizzare normalmente il sito. Potresti considerare questo mentre costruisci la tua soluzione.

Dichiarazione di non responsabilità: tutto il codice sopra riportato è stato copiato dal codice sorgente per WPTouch versione 1.9.19.4 ed è protetto dalla GPL. Se riutilizzi il codice, il tuo sistema deve anche rispettare i termini della GPL. Non ho scritto questo codice.


È questo l'elenco UA predefinito? No Opera Mini o Opera Mobile? Strano.
fuxia

Questa è la lista UA direttamente dal codice sorgente ... ricorda però che WPTouch 2.0 è un plug-in premium che devi acquistare da BraveNewCode . Non ho ancora cercato la fonte per quello, quindi potrebbe avere un elenco UA aggiornato.
EAMann,

8

Potresti voler vedere come il popolare plugin WPtouch fa questo. Dà un tema diverso per "iPhone, iPod touch, Android, Opera Mini, Palm Pre, Samsung touch e dispositivi mobili BlackBerry Storm / Torch" . Vedo un elenco di agenti utente nel loro codice sorgente , questa è probabilmente la chiave.

Un altro plugin, WP-Wurfled , utilizza l'ampio database Wireless Universal Resource File . Questo database di dispositivi mobili costantemente aggiornato contiene anche molte informazioni sulle funzionalità , in modo da sapere sul lato server la risoluzione dello schermo del dispositivo, sia che supporti Flash, ...

L' template_redirecthook di azione viene spesso utilizzato per caricare temi personalizzati, poiché è quasi l'ultimo momento prima di includere un file modello reale ( template_includeè l'ultimo hook, ma si tratta di un filtro).


7

A rischio di non rispondere alla domanda, consiglierei di non farlo.

Uso i dispositivi iOS da mesi e una delle prime cose che ho fatto quando ho comprato il mio iPad è stata quella di provare a elaborare un layout CSS che ha cambiato il suo comportamento in base al dispositivo utilizzato (e, in origine, all'orientamento dello schermo ).

Al momento in cui scrivo, è in esecuzione sul mio sito di sviluppo (http://dev.semiologic.com/). Se lo provi su un dispositivo iOS, noterai che il layout passa da una colonna con barre laterali sull'iPad a una con una singola colonna basata sull'iPhone. (Le barre laterali sono disposte su due colonne e le caselle inferiori sono disposte su due colonne sottostanti.) Puoi riprodurre l'effetto usando Safari, riducendo la larghezza del browser.

Comunque, per quanto fosse divertente da programmare, alla fine mi è venuto in mente che, almeno sui dispositivi iOS, il layout ottimizzato per dispositivi mobili ha peggiorato le cose, non meglio. Lo zoom integrato di Safari mobile è tale che, a condizione che la colonna principale sia larga 480 px, il tuo sito è già ottimizzato per l'uso mobile. Aggiungi una barra laterale larga 240px per un layout largo 720px e il tuo sito si adatta e ha un bell'aspetto in tutto:

  • 1024x768 (iPad orizzontale)
  • 768x1024 (iPad verticale)
  • 800x600 (utenti con problemi di vista)
  • 480x320 (iPhone orizzontale)
  • 320x480 (ritratto per iPhone, con lo zoom automatico avviato)

500px + 250px funziona anche se preferisci avere qualcosa che ammonta a 750px, se prendi in considerazione lo zoom integrato del cellulare Safari. Il sito sarà comunque bello e perfettamente leggibile su iPhone sia in modalità orizzontale che verticale.

In ogni caso, tornando alla tua domanda, i test hanno rivelato che l'unica cosa che NON dovresti fare è usare un layout con una larghezza flessibile. (Per inciso, WP-touch farà proprio questo a meno che non mi sbagli.) In questo modo si ottiene uno zoom sub-ottimale. Sull'iPad, puoi ingrandire qualcosa che è vincolato in una colonna larga 480px, consentendo dimensioni del testo più grandi; qualcosa che "si adatta" alla larghezza del tuo schermo ti costringe a leggere un testo minuscolo o uno scorrimento orizzontale se è troppo piccolo per essere letto comodamente ...


Grazie per i suggerimenti. Il mio sito non è fluido ma ha una larghezza fissa di circa 976 px (contenuto 676 px + resto è barra laterale sinistra). Non voglio rivoluzionare il tema, ma penso che sia largo per i telefoni 320x480 e 800x480 Probabilmente rimuoverò la barra laterale o almeno la sposterò a destra.
Drake,

Sono d'accordo al 100%, da quello che ho visto. Con pochissime eccezioni, i "temi mobili" - almeno i plugin "temi mobili" là fuori - fanno schifo e sono più difficili da usare rispetto alla navigazione del sito originale su dispositivi mobili. Anche se se ti interessa abbastanza provare e creare una versione mobile del tuo sito, pensala come una riprogettazione completa, piuttosto che come una semplice modifica del foglio di stile.
goldenapples,

3

Semplice: utilizzare il wp_is_mobile()test per: si attiverà trueper tutti i dispositivi mobili (smartphone, tablet, ecc.).

Aggiornare

Per favore , non farlo. Non funziona in modo affidabile.


2

Questo è uno script davvero fantastico se vuoi personalizzarlo, facile da integrare in wordpress. http://detectmobilebrowsers.mobi/

Una cosa da notare è che la maggior parte degli utenti di iphone, andriod o telefoni cellulari con supporto browser nativo non vogliono essere reindirizzati automaticamente!

Questa è una cattiva pratica, dare loro un'opzione tramite un collegamento a una versione mobile E nella versione mobile dare loro un'opzione per tornare al sito originale.

Ripeto, non reindirizzare automaticamente i tuoi utenti a meno che tu non stia costruendo qualcosa di molto specifico per i dispositivi mobili o non hai traffico da telefoni più vecchi senza supporto del browser nativo (improbabile).

  • Volevo aggiungere, un modo semplice per dire quanto sia importante è attraverso i registri del server.

Buona osservazione per offrire opzioni di commutazione su entrambe le versioni. A volte ti trovi su un browser non mobile ma su una connessione lenta (tramite un modem cellulare, Wifi scadente, dialup, ...) e preferisci una versione ottimizzata per dispositivi mobili perché (in generale) è anche più piccola.
Jan Fabry,

2

Aggiungerò un approccio alternativo.

Forse vuoi creare artigianato e perfezionare tutto lo stile e il comportamento in base a esigenze molto specifiche.

Di recente ho dovuto: se IE9 una cosa, se iPhone una seconda, se iPad una terza e così via ... E ho usato la classe Browser.php di Chris Schuld con grandi risultati.

La funzione che mi è venuta in mente ed esempi di utilizzo:

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";
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.