問題描述

我想建立一個我的主題的新修改版本 (如果需要,請檢查我的個人資料) 如果我檢測到他們正在從 hand-held 裝置 (如 iPhone,Android 等) 訪問該網站,則向訪問者呈現。

  1. 如何檢測請求是否來自移動裝置/瀏覽器?
  2. 我如何載入和呈現他們一個專門的主題?

更多資訊:我的主題不流暢。它的固定寬度約為 976px(676px 內容+休息是左邊欄) 。我不想革新主題,但我覺得 320×480 和 800×480 手機是大的。可能我會刪除側邊欄,或者至少將其移動到右邊,並進行其他小的調整。

最佳解決方案

像大多數人一樣,我強烈推薦使用 WPTouch 。但是,它比其他網站格式更多地支援部落格,所以我知道這不是移動解決方案的靈丹妙藥 (我在 WordPress 以及我的部落格上執行我的投資組合,我的投資組合看起來像 WPTouch 中的****) 。

所以我看了一下程式碼,找到你需要用來複制移動瀏覽器檢測的相關部分。首先,如 Jan Fabry 所述,是移動瀏覽器使用者代理的列表。 WPTouch 包含預設列表,還允許您使用設定或使用稱為 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;
}

外掛的肉是一個類:

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

    ...

外掛的建構函式 (function WPtouchPlugin()) 首先向 plugins_loaded 鉤子新增一個動作,以檢測移動瀏覽器的使用者代理,並將 $applemobile 設定為 true 。具體功能如下:

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

現在,該外掛知道您使用的是移動瀏覽器 (根據瀏覽器的使用者代理) 。外掛的下一個部分是一組過濾器:

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

這些過濾器中的每一個呼叫一個方法來檢查 $applemoble 是否設定為 true 。如果是,則 WordPress 將使用您的移動樣式表,您的移動主題和移動的帖子/頁面模板,而不是主題的預設模板。基本上,您是否基於使用的瀏覽器是否具有與您的 「移動瀏覽器」 列表相匹配的使用者代理,將 WordPress 的預設行為覆蓋。

WPTouch 還包括關閉移動主題的功能 – 當您在 iPhone 上訪問 WPTouch 站點時,底部有一個按鈕可讓您正常瀏覽該站點。您可能希望在構建自己的解決方案時考慮這一點。

免責宣告:以上所有程式碼均從 WPTouch version 1.9.19.4 的原始碼複製出來,並受 GPL 的保護。如果你的程式碼是 re-use,你的系統也必須符合 GPL 的條款。我沒有寫這段程式碼。

次佳解決方案

你可能想看看 the very popular WPtouch plugin 是如何做到的。它為 「iPhone,iPod touch,Android,Opera Mini,Palm Pre,Samsung Touch 和 BlackBerry Storm / Torch 移動裝置」 提供了不同的主題。我看到 a list of user agents in their source code,這可能是關鍵。

另一個外掛 WP-Wurfled 使用廣泛的 Wireless Universal Resource File 資料庫。這款移動裝置的 constantly-updated 資料庫還包含很多 capability info,所以你知道 server-side 的裝置的螢幕解析度,不管它是否支援 Flash,…

template_redirect 動作鉤通常用於載入自定義主題,因為它幾乎是包含真實模板檔案之前的最後一刻 (template_include 是最後一個鉤子,但這是一個過濾器) 。

第三種解決方案

有沒有回答這個問題的風險,我建議不要這樣做。

我已經使用 iOS 裝置了好幾個月了,而且當我購買 iPad 時,我重新開始的第一件事就是嘗試提出 CSS 佈局,根據使用的裝置改變其行為 (最初是螢幕方向) 。

在撰寫本文時,它正在我的開發工具 (http://dev.semiologic.com/) 上執行。如果您在 iOS 裝置上進行測試,您會注意到,佈局從 iPad 上的側邊欄的列切換到基於 iPhone 的單列。 (側欄佈置在兩列中,底部框放置在下面的兩列中。) 您可以透過減少瀏覽器的寬度來使用 Safari 重現效果。

無論如何,像程式一樣有趣,最終發生在我身上,至少在 iOS 裝置上,mobile-optimized 佈局使事情變得更糟,而不是更好。 Safari 手機的 built-in 縮放是這樣的,只要您的主列寬為 480 畫素,您的網站已經針對移動使用進行了最佳化。為寬 720px 的佈局新增一個 240px 寬的邊欄,您的網站適合並看起來很棒:

  • 1024×768(iPad 風景)
  • 768×1024(iPad 肖像)
  • 800×600(視力不佳的使用者)
  • 480×320(iPhone 風景)
  • 320×480(iPhone 肖像,搭配 auto-zoom)

如果您希望使用總共為 750 畫素的東西,如果您將 Safari 手機的 built-in 放大鏡考慮在內,那麼 500px + 250px 也可以正常工作。該網站仍然會看起來不錯,並且在風景和肖像模式下在 iPhone 上完美可讀。

無論如何,回到你的問題,測試顯示你不應該做的一件事是使用寬度寬的佈局。 (順便說一下,WP-touch 會做到這一點,除非我錯了。) 這樣做導致 sub-optimal 縮放。在 iPad 上,您可以放大 480 畫素寬的列,限制大文字大小; “adjusts” 到你的螢幕寬度的一些東西會強制你讀取小文字,或者如果太小而無法輕鬆讀取,則可以是水平滾動…

第四種方案

簡單:使用 wp_is_mobile()測試 – 它將觸發所有移動裝置 (智慧手機,平板電腦等) 的 true

Update

請不要這樣做。它不可靠。

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。