10

I am eperiencing a very annoying problem. I built my website with media queries and is_mobile (thinking is_mobile would be the same as smaller screens. How foolish of me.) but after some testing apparently the iPad kind of screws it up (okay, actually I did).

All my problems could easily be solved if I could exclude an iPad from the wp_is_mobile function. How do I rewrite that function?

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

How would I change this?

14

t f's answer got me thinking. Actually, I can use the core function and adapt it as I like but just put everything in a new function. So here goes:

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;
}
| improve this answer | |
  • It's always good to find own solutions, so +1 for this. However, I also updated my answer. I had a stupid typo in there: I checked for === while I should have checked for !== instead - no idea how that happened, but now I fixed that. So, the above answer should work as well - which I am absolutely not saying to make you accept it! It's just that, in essence, our answers/functions do the same - so I just wanted to find (and fix) what was wrong. – tfrommen Sep 16 '13 at 20:44
  • @tf That's what my comment was about! But, I am going to accept my own answer because I know this one works and I haven't tested your code. I don't want anybody to read this and use your answer if I haven't tested it. I feel sort of responsible for this thread. I hope you understand. Thanks for the effort though! – Bram Vanroy Sep 17 '13 at 8:43
  • Did you guys actually managed to test it live on an ipad? I'm trying right now without any success, ipad air, locally. – kevin Jan 8 '14 at 20:18
  • @kevin tested this on an iPAD 3, which worked. – Bram Vanroy Jan 8 '14 at 20:25
4

You could also use the regularly updated Mobile Detect PHP class to create a custom function for detecting mobiles excluding tablets (thus iPads). At time of writing this answer, the Github repo had most recently been updated to include detection for new Samsung tablets as of 3 months ago.

Assuming you place the required file in directory called /includes/ in your theme, then you can add this code to your 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;
  }

}

then use the function md_is_mobile() as a substitute for wp_is_mobile().

| improve this answer | |
  • Isn't this solution dependent on the installation of a plugin containing the Mobile Detect class? – Brad Dalton Feb 7 '15 at 13:35
  • The Mobile Detect class dependency is handled by the first line of the code block above; no additional plugin is required. I should note that WordPress plugins based on this class do exist, such as WP Mobile Detect, but this has not been updated for almost 2 years, so I personally prefer to use the PHP class directly, which appears to be actively developed. – Astrotim Feb 9 '15 at 1:52
  • Its a fair answer however you need to install the file Mobile_Detect.php which i'm referring to as the plugin. – Brad Dalton Feb 9 '15 at 9:00
  • That's fair enough! – Astrotim Feb 10 '15 at 2:47
2

I've rewritten (and, in my opinion, optimized) your function a bit:

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

// EDIT:

Okay, once again...

Write a new function that internally uses the core function and extend it:

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

Now you can use your new my_wp_is_mobile function anywhere you want.

| improve this answer | |
  • So, I can just put this inside my functions.php file and it will automatically overwrite the core function? – Bram Vanroy Sep 16 '13 at 18:04
  • Whoops, sorry, my bad - I never used this (and thus didn't know it was WP core). Since the function is not pluggable, you cannot just put that in your functions.php file. I'll update my answer in a minute... – tfrommen Sep 16 '13 at 18:08
  • This doesn't seem to work. But shouldn't the user agent for iPad return true? – Bram Vanroy Sep 16 '13 at 18:37
  • Hm? I understood it like you wanted to exclude iPads from being treated as mobile devices - as they would by wp_is_mobile...? So, what does not work (as you would like to do)? – tfrommen Sep 16 '13 at 19:07
  • Unfortunately I don't have an iPad myself, so I have to rely on information I get from friends. But currently I have a design which loads a sidebar if a user agent "!is_mobile" (is not mobile), but this is not necessary for the iPad because its resolution is large enough. My friends tell me that even though I used if(!my_wp_is_mobile() ) the sidebar is still not being displayed. From which I deduct that the function doesn't work. – Bram Vanroy Sep 16 '13 at 19:10
2

I know this is old, but I wanted to update it with the proper WordPress way of implementing the previous solutions. As of version 4.9.0, rather than implementing another function, they should filter the result of wp_is_mobile(). Thus:

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

HOWEVER What really should have been done was to bite the bullet and rewrite the theme to work properly on tablets. There were/are more tablet manufacturers than Apple.

| improve this answer | |

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.