wp_is_mobile에서 iPad 제외


9

나는 매우 성가신 문제를 eperiencing하고 있습니다. 미디어 쿼리와 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;
}

이것을 어떻게 변경합니까?

답변:


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 그게 내 의견이었습니다! 그러나 이것이 효과가 있다는 것을 알고 코드를 테스트하지 않았기 때문에 내 대답을 수락 할 것입니다. 테스트하지 않은 사람은 아무도 이것을 읽고 답을 사용하지 않기를 바랍니다. 이 스레드에 대해 일종의 책임감을 느낍니다. 난 당신이 이해 바랍니다. 노력해 주셔서 감사합니다!
Bram Vanroy

당신은 실제로 ipad에서 라이브 테스트를 했습니까? 나는 지금 ipad air를 로컬로 성공시키지 않고 노력하고 있습니다.
kevin

@kevin은 이것을 iPAD 3에서 테스트했습니다.
Bram Vanroy

4

정기적으로 업데이트되는 Mobile Detect PHP 클래스 를 사용하여 태블릿 (따라서 iPad)을 제외한 모바일을 감지하기위한 사용자 정의 기능을 작성할 수도 있습니다 . 이 답변을 작성할 당시 Github 저장소 는 최근 3 개월 전부터 새로운 Samsung 태블릿에 대한 감지 기능을 포함하도록 업데이트되었습니다.

/includes/테마에서 호출 된 디렉토리에 필요한 파일을 배치했다고 가정하면 이 코드를 함수에 추가 할 수 있습니다.

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 클래스를 포함하는 플러그인 설치에 종속적이지 않습니까?
Brad Dalton

Mobile Detect 클래스 종속성은 위 코드 블록의 첫 번째 줄에서 처리됩니다. 추가 플러그인이 필요하지 않습니다. 이 클래스를 기반으로하는 WordPress 플러그인 (예 : WP Mobile Detect) 이 존재 하지만 거의 2 년 동안 업데이트되지 않았기 때문에 개인적으로 PHP 클래스를 직접 사용하는 것을 선호합니다.
Astrotim

그러나 정식 답변은 플러그인이라고하는 Mobile_Detect.php 파일을 설치해야합니다.
Brad Dalton

충분합니다!
Astrotim

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원하는 곳 어디에서나 새로운 기능을 사용할 수 있습니다 .


그래서, 나는 이것을 단지 functions.php 파일에 넣을 수 있으며 자동으로 핵심 기능을 덮어 씁니까?
Bram Vanroy

으악, 미안, 내 나쁜-나는 이것을 사용하지 않았다 (따라서 그것이 WP 코어인지 몰랐다). 함수는 플러그 가능하지 않기 때문에 파일에 넣을 수 없습니다functions.php . 잠시 후 답변을 업데이트하겠습니다 ...
tfrommen

작동하지 않는 것 같습니다. 그러나 iPad 용 사용자 에이전트가 사실을 반환해서는 안됩니까?
Bram Vanroy

흠? iPad를 모바일 기기로 취급하지 않도록 배제하고 싶다는 것을 이해했습니다 wp_is_mobile...? 그래서, 당신이하고 싶은대로 작동하지 않는 것은 무엇입니까?
tfrommen

안타깝게도 나는 iPad를 가지고 있지 않으므로 친구로부터 얻은 정보에 의존해야합니다. 그러나 현재 사용자 에이전트 "! is_mobile"(모바일이 아님) 인 경우 사이드 바를로드하는 디자인이 있지만 해상도가 충분히 크기 때문에 iPad에는 필요하지 않습니다. 친구들 if(!my_wp_is_mobile() )이 사이드 바를 사용해 도 여전히 표시되지 않는다고 말합니다. 함수가 작동하지 않는다는 것을 공제합니다.
Bram Vanroy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.