Tidak termasuk iPad dari wp_is_mobile

9

Saya mengalami masalah yang sangat mengganggu. Saya membangun situs web saya dengan pertanyaan media dan is_mobile (berpikir is_mobile akan sama dengan layar yang lebih kecil. Betapa bodohnya saya.) Tetapi setelah beberapa pengujian ternyata jenis iPad mengacaukannya (oke, sebenarnya saya lakukan).

Semua masalah saya dapat dengan mudah diselesaikan jika saya dapat mengecualikan iPad dari fungsi wp_is_mobile. Bagaimana cara saya menulis ulang fungsi itu?

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

Bagaimana saya mengubahnya?

Bram Vanroy
sumber

Jawaban:

13

Jawaban itu membuat saya berpikir. Sebenarnya, saya bisa menggunakan fungsi inti dan mengadaptasinya sesuka saya, tetapi hanya memasukkan semuanya ke dalam fungsi baru. Jadi begini:

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;
}
Bram Vanroy
sumber
Selalu bagus untuk menemukan solusi sendiri , jadi beri +1 untuk ini. Namun, saya juga memperbarui jawaban saya. Saya memiliki kesalahan ketik di sana: Saya memeriksa ===sementara saya seharusnya memeriksanya !==- tidak tahu bagaimana itu terjadi, tapi sekarang saya memperbaikinya. Jadi, jawaban di atas seharusnya bekerja juga - yang saya sama sekali tidak mengatakan untuk membuat Anda menerimanya! Hanya saja, pada dasarnya, jawaban / fungsi kami melakukan hal yang sama - jadi saya hanya ingin menemukan (dan memperbaiki) apa yang salah.
tfrommen
@tf Itulah komentar saya tentang! Tetapi, saya akan menerima jawaban saya sendiri karena saya tahu ini bekerja dan saya belum menguji kode Anda. Saya tidak ingin orang membaca ini dan menggunakan jawaban Anda jika saya belum mengujinya. Saya merasa agak bertanggung jawab atas utas ini. Saya harap Anda mengerti. Terima kasih untuk usahanya!
Bram Vanroy
Apakah kalian benar-benar berhasil mengujinya langsung di iPad? Saya mencoba sekarang tanpa hasil, iPad, secara lokal.
kevin
@kevin menguji ini pada iPAD 3, yang berfungsi.
Bram Vanroy
4

Anda juga dapat menggunakan kelas PHP Deteksi Seluler yang diperbarui secara berkala untuk membuat fungsi khusus untuk mendeteksi ponsel yang tidak termasuk tablet (dengan demikian iPad). Pada saat menulis jawaban ini, repo Github baru-baru ini diperbarui untuk menyertakan deteksi untuk tablet Samsung baru pada 3 bulan lalu.

Dengan asumsi Anda menempatkan file yang diperlukan dalam direktori yang disebut /includes/dalam tema Anda, maka Anda dapat menambahkan kode ini ke functions.php Anda

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

}

lalu gunakan fungsi md_is_mobile()sebagai pengganti wp_is_mobile().

Astrotim
sumber
Bukankah solusi ini tergantung pada pemasangan plugin yang berisi kelas Mobile Detect?
Brad Dalton
Ketergantungan kelas Deteksi Seluler ditangani oleh baris pertama blok kode di atas; tidak diperlukan plugin tambahan. Saya harus mencatat bahwa plugin WordPress berdasarkan kelas ini memang ada, seperti WP Mobile Detect , tetapi ini belum diperbarui selama hampir 2 tahun, jadi saya pribadi lebih suka menggunakan kelas PHP secara langsung, yang tampaknya dikembangkan secara aktif.
Astrotim
Ini jawaban yang adil namun Anda perlu menginstal file Mobile_Detect.php yang saya maksud sebagai plugin.
Brad Dalton
Cukup adil!
Astrotim
2

Saya tahu ini sudah lama, tetapi saya ingin memperbaruinya dengan cara WordPress yang tepat dalam mengimplementasikan solusi sebelumnya. Pada versi 4.9.0, daripada mengimplementasikan fungsi lain, mereka harus memfilter hasil wp_is_mobile (). Jadi:

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

NAMUN Apa yang seharusnya dilakukan adalah menggigit peluru dan menulis ulang tema agar berfungsi dengan baik di tablet. Ada / lebih banyak produsen tablet daripada Apple.

Brian Layman
sumber
1

Saya telah menulis ulang (dan, menurut saya, dioptimalkan) fungsi Anda sedikit:

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:

Oke, sekali lagi ...

Tulis fungsi baru yang secara internal menggunakan fungsi inti dan perluas :

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

Sekarang Anda dapat menggunakan my_wp_is_mobilefungsi baru Anda di mana saja Anda inginkan.

para pria
sumber
Jadi, saya bisa meletakkan ini di dalam file functions.php saya dan secara otomatis akan menimpa fungsi inti?
Bram Vanroy
Aduh, maaf, salahku - saya tidak pernah menggunakan ini (dan dengan demikian tidak tahu itu adalah WP core). Karena fungsi ini tidak dapat dicolokkan, Anda tidak bisa hanya memasukkannya ke dalam functions.phpfile Anda . Saya akan memperbarui jawaban saya dalam satu menit ...
tfrommen
Ini sepertinya tidak berhasil. Tapi bukankah agen pengguna untuk iPad kembali benar?
Bram Vanroy
Hm? Saya memahaminya seperti Anda ingin mengecualikan iPad agar tidak diperlakukan sebagai perangkat seluler - seperti yang dilakukan oleh wp_is_mobile...? Jadi, apa yang tidak berhasil (seperti yang ingin Anda lakukan)?
tfrommen
Sayangnya saya tidak punya iPad sendiri, jadi saya harus mengandalkan informasi yang saya dapatkan dari teman-teman. Tetapi saat ini saya memiliki desain yang memuat sidebar jika agen pengguna "! Is_mobile" (bukan ponsel), tetapi ini tidak diperlukan untuk iPad karena resolusinya cukup besar. Teman-teman saya memberi tahu saya bahwa meskipun saya menggunakan if(!my_wp_is_mobile() )bilah samping masih belum ditampilkan. Dari mana saya menyimpulkan bahwa fungsi tidak berfungsi.
Bram Vanroy