İPad'i wp_is_mobile'dan hariç tutma


9

Çok sinir bozucu bir sorun yaşıyorum. Web sitemi medya sorguları ile oluşturdum ve is_mobile (düşünmek is_mobile daha küçük ekranlarla aynı olurdu. Beni aptal yerine koydum.) Ama bazı testlerden sonra iPad'in bunu biraz vidaladığı (tamam, aslında yaptım).

Bir iPad'i wp_is_mobile işlevinden hariç tutabilirsem tüm sorunlarım kolayca çözülebilirdi. Bu işlevi nasıl yeniden yazarım?

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

Bunu nasıl değiştirirdim?

Yanıtlar:


13

tf'nin cevabı beni düşündürdü. Aslında, çekirdek işlevi kullanabilir ve istediğim gibi uyarlayabilirim, ancak her şeyi yeni bir işleve koyabilirim. İşte böyle:

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

Kendi çözümlerini bulmak her zaman iyidir , bu yüzden +1. Ancak cevabımı da güncelledim. Orada aptal bir yazım hatası vardı: Bunun yerine ===kontrol gerekirken kontrol ettim !==- bunun nasıl olduğu hakkında hiçbir fikrim yok, ama şimdi bunu düzelttim. Yani, yukarıdaki cevabı gerektiği gibi işe - Kesinlikle ediyorum hangi değil bunu kabul için söylüyorsun! Aslında, cevaplarımız / fonksiyonlarımız aynı şeyi yapıyor - bu yüzden sadece neyin yanlış olduğunu bulmak (ve düzeltmek) istedim.
tfrommen

@tf Yorumum bununla ilgiliydi! Ama, kendi cevabımı kabul edeceğim çünkü bunun işe yaradığını biliyorum ve kodunuzu test etmedim. Hiç kimsenin bunu okumasını ve test etmediysem cevabınızı kullanmasını istemiyorum. Bu konu için kendimi sorumlu hissediyorum. Umarım anlarsın. Çaba için teşekkürler!
Bram Vanroy

Gerçekten bir ipad üzerinde canlı test etmeyi başardınız mı? Şu anda herhangi bir başarı, ipad air, yerel olarak çalışıyorum.
kevin

@kevin bunu çalışan bir iPAD 3 üzerinde test etti.
Bram Vanroy

4

Tabletler (böylece iPad'ler) hariç cep telefonlarını algılamak için özel bir işlev oluşturmak için düzenli olarak güncellenen Mobile Detect PHP sınıfını da kullanabilirsiniz . Bu cevabı yazarken, Github repo 3 ay önce yeni Samsung tabletleri için algılama içerecek şekilde güncellendi.

Gerekli dosyayı /includes/temanızın adı verilen dizine yerleştirdiğinizi varsayarsak , bu kodu işlevlerinize ekleyebilirsiniz. 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;
  }

}

sonra işlevi md_is_mobile()yerine kullanın wp_is_mobile().


Bu çözüm, Mobile Detect sınıfını içeren bir eklentinin kurulumuna bağlı değil mi?
Brad Dalton

Mobile Detect sınıf bağımlılığı yukarıdaki kod bloğunun ilk satırı tarafından işlenir; ek bir eklenti gerekmez. WP Mobile Detect gibi bu sınıfa dayalı WordPress eklentilerinin var olduğunu, ancak bu neredeyse 2 yıldır güncellenmediğini unutmayın, bu yüzden kişisel olarak aktif olarak geliştirilmiş gibi görünen PHP sınıfını kullanmayı tercih ediyorum.
Astrotim

Bu adil bir cevap ancak eklenti olarak bahsettiğim Mobile_Detect.php dosyasını yüklemeniz gerekir.
Brad Dalton

Bu kabul edilebilir!
Astrotim

2

Bunun eski olduğunu biliyorum, ancak önceki çözümleri uygulamak için uygun WordPress yöntemiyle güncellemek istedim. 4.9.0 sürümünden itibaren, başka bir işlevi uygulamak yerine, wp_is_mobile () sonucunu filtrelemelidir. Böylece:

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

ANCAK Gerçekten yapılması gereken mermiyi ısırmak ve tabletlerde düzgün çalışması için temayı yeniden yazmaktı. Apple'dan daha fazla tablet üreticisi vardı / var.


1

İşlevinizi biraz yeniden yazdım (ve bence, optimize ettim):

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

// DÜZENLE:

Tamam, bir kez daha ...

Dahili işlevi çekirdek işlevini kullanan yeni bir işlev yazın ve genişletin :

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

Artık yeni my_wp_is_mobileişlevinizi istediğiniz yerde kullanabilirsiniz.


Yani, ben sadece benim function.php dosya içine koyabilirsiniz ve otomatik olarak çekirdek işlevi üzerine yazacak?
Bram Vanroy

Maalesef, üzgünüm, benim kötü - Bunu hiç kullanmadım (ve böylece WP çekirdeği olduğunu bilmiyordum). Fonksiyon takılabilir olmadığından, sen olamaz sadece o koymak functions.phpdosyası. Cevabımı bir dakika içinde güncelleyeceğim ...
tfrommen

Bu işe yaramıyor gibi görünüyor. Ancak iPad için kullanıcı aracısı doğru dönmemelidir?
Bram Vanroy

Hımm? Tarafından gerçekleşeceği gibi - Sana mobil cihazlar olarak tedavi altına gelen iPad'ler dışlamak istediği gibi anladım wp_is_mobile...? Peki, ne işe yaramaz (yapmak istediğiniz gibi)?
tfrommen

Maalesef bir iPad'im yok, bu yüzden arkadaşlardan aldığım bilgilere güvenmem gerekiyor. Ancak şu anda bir kullanıcı aracısı "! İs_mobile" ise (mobil değil) bir kenar çubuğunu yükleyen bir tasarımım var, ancak çözünürlüğü yeterince büyük olduğu için bu iPad için gerekli değil. Arkadaşlarım bana if(!my_wp_is_mobile() )kenar çubuğunu kullanmama rağmen hala gösterilmediğini söylüyor. Hangi fonksiyonun işe yaramadığını düşünsün.
Bram Vanroy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.