Виключення iPad з wp_is_mobile


9

Я переживаю дуже набридливу проблему. Я створив свій веб-сайт з медіа-запитами і is_mobile (думаючи, що is_mobile було б те саме, що і менші екрани. Як нерозумно від мене.), Але після деяких тестувань, очевидно, iPad накрутив це (добре, насправді я це зробив).

Усі мої проблеми легко можна було б вирішити, якби я міг виключити iPad з функції wp_is_mobile. Як переписати цю функцію?

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

Як би я це змінив?

Відповіді:


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

@tf Ось про що мій коментар! Але я прийму власну відповідь, бо знаю, що ця працює, і я не перевіряв ваш код. Я не хочу, щоб хтось читав це і використовував вашу відповідь, якщо я її не перевіряв. Я відчуваю, що відповідальний за цю тему. Я сподіваюся, ви розумієте. Дякую за докладені зусилля!
Брам Ванрой

Вам, справді, вдалося протестувати це в прямому ефірі на ipad? Я зараз намагаюся без успіху, ipad air, локально.
кевін

@kevin перевірив це на iPAD 3, який працював.
Брам Ванрой

4

Ви також можете використовувати регулярно оновлюваний PHP-клас Mobile Detect, щоб створити спеціальну функцію виявлення мобільних телефонів, за винятком планшетів (таким чином, iPad). На момент написання цієї відповіді репортаж Github останнім часом було оновлено, включаючи виявлення нових планшетів Samsung станом на 3 місяці тому.

Якщо припустити, що ви розмістите потрібний файл у каталозі, названому /includes/у вашій темі, тоді ви можете додати цей код у свою функцію.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 обробляється першим рядком кодового блоку вище; додатковий плагін не потрібен. Слід зазначити, що плагіни WordPress на базі цього класу існують, наприклад WP Mobile Detect , але це не оновлювалось майже 2 роки, тому я особисто вважаю за краще використовувати клас PHP безпосередньо, який, як видається, активно розвивається.
Астротим

Це справедлива відповідь, проте вам потрібно встановити файл Mobile_Detect.php, який я маю на увазі як плагін.
Бред Далтон

Це досить справедливо!
Астротим

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

ЯКЩО насправді слід було зробити, це кусати кулю та переписати тему, щоб правильно працювати на планшетах. Виробників планшетів було / є більше виробників, ніж у Apple.


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функцію де завгодно.


Отже, я можу просто помістити це всередину свого файла function.php, і він автоматично замінить основну функцію?
Брам Ванрой

Ну, вибачте, мій поганий - я ніколи цього не використовував (і, отже, не знав, що це ядро ​​WP). Оскільки функція не підключається, ви не можете просто помістити її у свій functions.phpфайл. Я
оновлю

Це, здається, не працює. Але чи не повинен користувальницький агент для iPad повертатися правдою?
Брам Ванрой

Гм? Я зрозумів це так, як ви хочете виключити iPad з поводження з ними як з мобільними пристроями - як би вони wp_is_mobile... Отже, що не працює (як ви хотіли б зробити)?
tfrommen

На жаль, у мене немає iPad, тому я повинен покладатися на інформацію, яку я отримую від друзів. Але на даний момент у мене є дизайн, який завантажує бічну панель, якщо користувальницький агент "! Is_mobile" (не є мобільним), але це не потрібно для iPad, оскільки його роздільна здатність досить велика. Мої друзі кажуть, що хоч я використовував if(!my_wp_is_mobile() )бічну панель, все ще не відображається. З чого я вважаю, що функція не працює.
Брам Ванрой
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.