从wp_is_mobile排除iPad


9

我遇到一个非常烦人的问题。我用媒体查询和is_mobile构建了我的网站(认为is_mobile与较小的屏幕相同。我真是愚蠢。),但是经过一些测试,显然iPad确实把它搞砸了(好的,实际上我做到了)。

如果我可以从wp_is_mobile函数中排除iPad,则可以轻松解决所有问题。我该如何重写该功能?

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

我将如何改变呢?

Answers:


13

tf的答案让我开始思考。实际上,我可以随意使用核心功能并对其进行调整,但只需将所有内容都放在一个新功能中即可。因此,这里去:

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

找到自己的解决方案总是很不错的,因此为此+1。但是,我也更新了答案。我那里有一个愚蠢的错字:我检查了本===应检查的内容,!==而不知道是怎么回事,但现在我解决了。因此,上述答案也应该有效-我绝对不是想让您接受它!从本质上讲,仅是我们的答案/功能也是如此-所以我只想查找(并修复)出了什么问题。
tfrommen 2013年

@tf这就是我的评论!但是,我将接受自己的答案,因为我知道这是可行的,并且尚未测试您的代码。如果我没有测试过,我不希望任何人阅读并使用您的答案。我对此线程负责。我希望你明白。谢谢您的努力!
Bram Vanroy

你们真的设法在ipad上进行了实时测试吗?我正在尝试本地ipad air,但没有成功。
凯文2014年

@kevin在有效的iPAD 3上对此进行了测试。
Bram Vanroy 2014年

4

您还可以使用定期更新的Mobile Detect PHP类来创建自定义函数,以检测不包括平板电脑(因此为iPad)的手机。在撰写此答案时,Github存储库最近进行了更新,以包括从3个月前开始检测新的Samsung平板电脑。

假设您将所需文件放在/includes/主题中调用的目录中,则可以将此代码添加到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;
  }

}

然后使用该函数md_is_mobile()代替wp_is_mobile()


此解决方案是否不依赖于包含Mobile Detect类的插件的安装?
布拉德·道尔顿2015年

Mobile Detect类的依赖关系由上面的代码块的第一行处理;无需其他插件。我应该注意,确实存在基于此类的WordPress插件,例如WP Mobile Detect,但是该插件近两年没有更新,因此我个人更喜欢直接使用PHP类,该类似乎正在积极开发中。
天文学家2015年

这是一个合理的答案,但是您需要安装文件Mobile_Detect.php,我将其称为插件。
布拉德·道尔顿

这很公平!
天文学家2015年

2

我知道这很旧,但是我想用实现先前解决方案的正确WordPress方法进行更新。从版本4.9.0开始,它们应该过滤wp_is_mobile()的结果,而不是实现其他功能。从而:

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

但是,真正应该做的是咬紧牙关,重写主题以便在平板电脑上正常工作。平板电脑制造商比苹果多。


1

我已经对您的函数进行了一些重写(并认为优化):

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

//编辑:

好,再来一次...

编写一个内部使用核心函数并对其进行扩展的新函数:

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

现在,您可以在my_wp_is_mobile任何需要的地方使用新功能。


因此,我可以将其放在我的functions.php文件中,它将自动覆盖核心功能?
Bram Vanroy

糟糕,抱歉,我不好-我从未使用过它(因此不知道它是WP核心)。由于该功能不可插入,因此不能仅将其放入functions.php文件中。我将在一分钟内更新我的答案...
tfrommen 2013年

这似乎不起作用。但是iPad的用户代理不应该返回true吗?
Bram Vanroy 2013年

嗯?我了解您想要像iPad那样将iPad排除在移动设备之外wp_is_mobile吗?那么,什么不起作用(如您所愿)?
tfrommen 2013年

不幸的是,我本人没有iPad,因此我必须依靠从朋友那里获得的信息。但是目前,我有一个设计可以在用户代理“!is_mobile”(非移动)加载一个侧边栏,但是对于iPad来说这不是必需的,因为它的分辨率足够大。我的朋友告诉我,即使我使用if(!my_wp_is_mobile() )了侧边栏,仍然没有显示。从中可以推断出该功能不起作用。
Bram Vanroy 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.