Không bao gồm iPad từ wp_is_mobile


9

Tôi đang khắc phục một vấn đề rất khó chịu. Tôi đã xây dựng trang web của mình bằng các truy vấn phương tiện và is_mobile (nghĩ rằng is_mobile sẽ giống như màn hình nhỏ hơn. Thật ngu ngốc đối với tôi.)

Tất cả các vấn đề của tôi có thể dễ dàng được giải quyết nếu tôi có thể loại trừ iPad khỏi chức năng wp_is_mobile. Làm thế nào để tôi viết lại chức năng đó?

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

Làm thế nào tôi thay đổi điều này?

Câu trả lời:


13

Câu trả lời của tf khiến tôi suy nghĩ. Trên thực tế, tôi có thể sử dụng chức năng cốt lõi và điều chỉnh nó theo ý muốn nhưng chỉ cần đặt mọi thứ vào một chức năng mới. Vì vậy, ở đây đi:

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

Luôn luôn tốt để tìm giải pháp riêng , vì vậy +1 cho việc này. Tuy nhiên, tôi cũng cập nhật câu trả lời của mình. Tôi đã có một lỗi đánh máy ngu ngốc ở đó: Tôi đã kiểm tra ===trong khi tôi nên kiểm tra !==thay thế - không biết điều đó đã xảy ra như thế nào, nhưng bây giờ tôi đã sửa nó. Vì vậy, câu trả lời trên cũng nên hoạt động - điều mà tôi hoàn toàn không nói để khiến bạn chấp nhận nó! Về bản chất, các câu trả lời / chức năng của chúng tôi đều làm như vậy - vì vậy tôi chỉ muốn tìm (và sửa) những gì sai.
tfrommen

@tf Đó là những gì bình luận của tôi là về! Nhưng, tôi sẽ chấp nhận câu trả lời của riêng mình vì tôi biết cái này hoạt động và tôi chưa kiểm tra mã của bạn. Tôi không muốn bất cứ ai đọc nó và sử dụng câu trả lời của bạn nếu tôi chưa kiểm tra nó. Tôi cảm thấy có trách nhiệm cho chủ đề này. Tôi hy vọng bạn hiểu. Cảm ơn các nỗ lực mặc dù!
Bram Vanroy

Các bạn đã thực sự kiểm tra nó trực tiếp trên ipad chưa? Tôi đang cố gắng ngay bây giờ mà không có bất kỳ thành công, ipad air, cục bộ.
kevin

@kevin đã thử nghiệm điều này trên iPAD 3, hoạt động.
Bram Vanroy

4

Bạn cũng có thể sử dụng lớp PHP Phát hiện Di động được cập nhật thường xuyên để tạo một chức năng tùy chỉnh để phát hiện điện thoại di động trừ máy tính bảng (như iPad). Tại thời điểm viết câu trả lời này, repo Github gần đây nhất đã được cập nhật để bao gồm phát hiện cho máy tính bảng mới của Samsung kể từ 3 tháng trước.

Giả sử bạn đặt tệp yêu cầu trong thư mục được gọi /includes/trong chủ đề của mình, thì bạn có thể thêm mã này vào hàm.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;
  }

}

sau đó sử dụng chức năng md_is_mobile()thay thế cho wp_is_mobile().


Không phải giải pháp này phụ thuộc vào việc cài đặt plugin có chứa lớp Phát hiện Di động?
Brad Dalton

Sự phụ thuộc lớp Phát hiện Di động được xử lý bởi dòng đầu tiên của khối mã ở trên; không có plugin bổ sung được yêu cầu. Tôi nên lưu ý rằng các plugin WordPress dựa trên lớp này đã tồn tại, chẳng hạn như WP Mobile Detect , nhưng điều này đã không được cập nhật gần 2 năm, vì vậy cá nhân tôi thích sử dụng trực tiếp lớp PHP, có vẻ như được phát triển tích cực.
Astrotim

Đó là một câu trả lời công bằng tuy nhiên bạn cần cài đặt tệp Mobile_Detect.php mà tôi đang gọi là plugin.
Brad Dalton

Thế là đủ công bằng!
Astrotim

2

Tôi biết điều này đã cũ, nhưng tôi muốn cập nhật nó với cách thức WordPress phù hợp để thực hiện các giải pháp trước đó. Kể từ phiên bản 4.9.0, thay vì thực hiện một chức năng khác, họ nên lọc kết quả của wp_is_mobile (). Như vậy:

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

TUY NHIÊN Điều thực sự nên làm là cắn viên đạn và viết lại chủ đề để hoạt động chính xác trên máy tính bảng. Đã có / có nhiều nhà sản xuất máy tính bảng hơn Apple.


1

Tôi đã viết lại (và, theo tôi, đã tối ưu hóa) chức năng của bạn một chút:

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

// BIÊN TẬP:

Được rồi, một lần nữa ...

Viết một hàm mới sử dụng hàm lõi bên trong và mở rộng nó:

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

Bây giờ bạn có thể sử dụng my_wp_is_mobilechức năng mới của bạn bất cứ nơi nào bạn muốn.


Vì vậy, tôi chỉ có thể đặt cái này vào trong tệp tin.php. Nó sẽ tự động ghi đè lên chức năng cốt lõi?
Bram Vanroy

Rất tiếc, xin lỗi, tôi rất tệ - tôi chưa bao giờ sử dụng cái này (và do đó không biết đó là lõi WP). Vì chức năng này không thể cắm được, bạn không thể đặt nó trong functions.phptệp của mình . Tôi sẽ cập nhật câu trả lời của mình sau một phút nữa ...
tfrommen

Điều này dường như không hoạt động. Nhưng liệu tác nhân người dùng cho iPad có trở lại đúng không?
Bram Vanroy

Hửm Tôi hiểu nó giống như bạn muốn loại trừ iPad khỏi bị coi là thiết bị di động - như chúng sẽ wp_is_mobile...? Vì vậy, những gì không hoạt động (như bạn muốn làm)?
tfrommen

Thật không may, tôi không có iPad cho mình, vì vậy tôi phải dựa vào thông tin tôi nhận được từ bạn bè. Nhưng hiện tại tôi có một thiết kế tải một thanh bên nếu tác nhân người dùng "! Is_mobile" (không di động), nhưng điều này không cần thiết cho iPad vì độ phân giải của nó đủ lớn. Bạn bè của tôi nói với tôi rằng mặc dù tôi đã sử dụng if(!my_wp_is_mobile() )thanh bên vẫn không được hiển thị. Từ đó tôi trừ rằng hàm không hoạt động.
Bram Vanroy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.