Исключая 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

Ответ ТФ заставил меня задуматься. На самом деле, я могу использовать базовую функцию и адаптировать ее так, как мне нравится, но просто поместить все в новую функцию. Итак, здесь идет:

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/вашей темой, вы можете добавить этот код в файл 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().

Astrotim
источник
Разве это решение не зависит от установки плагина, содержащего класс Mobile Detect?
Брэд Далтон
Зависимость класса 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функцию где угодно.

tfrommen
источник
Итак, я могу просто поместить это в мой файл functions.php, и он автоматически перезапишет основную функцию?
Брэм Ванрой
Ой, простите, мой плохой - я никогда этим не пользовался (и поэтому не знал, что это WP ядро). Поскольку функция не является подключаемой, вы не можете просто поместить это в свой functions.phpфайл. Я
обновлю
Это не похоже на работу. Но не должен ли пользовательский агент для iPad вернуть true?
Брэм Ванрой
Хм? Я понял это так, как если бы вы хотели исключить iPad из обращения с мобильными устройствами - как они бы wp_is_mobile...? Итак, что не работает (как вы хотели бы сделать)?
tfrommen
К сожалению, у меня нет iPad, поэтому я должен полагаться на информацию, полученную от друзей. Но в настоящее время у меня есть дизайн, который загружает боковую панель, если пользовательский агент "! Is_mobile" (не является мобильным), но это не является необходимым для iPad, потому что его разрешение достаточно велико. Мои друзья говорят мне, что хотя я использовал if(!my_wp_is_mobile() )боковую панель, она все еще не отображается. Из чего я делаю вывод, что функция не работает.
Брэм Ванрой