问题描述

我想创建一个我的主题的新修改版本 (如果需要,请检查我的个人资料) 如果我检测到他们正在从 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。