ไม่รวม 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

คำตอบของ 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 ทดสอบสิ่งนี้ใน iPAD 3 ซึ่งใช้งานได้
Bram Vanroy

4

คุณสามารถใช้คลาส Mobile Detect PHP ที่อัปเดตเป็นประจำเพื่อสร้างฟังก์ชันที่กำหนดเองสำหรับการตรวจจับโทรศัพท์มือถือที่ไม่รวมแท็บเล็ต (เช่น iPads) ในขณะที่เขียนคำตอบนี้Github repoได้รับการปรับปรุงล่าสุดเพื่อรวมการตรวจหาแท็บเล็ต Samsung ใหม่ ณ 3 เดือนที่ผ่านมา

สมมติว่าคุณวางไฟล์ที่ต้องการในไดเรกทอรีที่เรียกว่า/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 หรือไม่
แบรดดัลตัน

Mobile Detect class dependency ได้รับการจัดการโดยบรรทัดแรกของบล็อครหัสด้านบน ไม่จำเป็นต้องใช้ปลั๊กอินเพิ่มเติม ฉันควรทราบว่าปลั๊กอิน WordPress ที่อ้างอิงกับคลาสนี้มีอยู่เช่นWP Mobile Detectแต่ไม่ได้รับการอัปเดตเป็นเวลาเกือบ 2 ปีดังนั้นฉันจึงชอบใช้คลาส PHP โดยตรงซึ่งดูเหมือนจะได้รับการพัฒนาอย่างแข็งขัน
Astrotim

มันเป็นคำตอบที่ยุติธรรม แต่คุณต้องติดตั้งไฟล์ Mobile_Detect.php ซึ่งฉันอ้างถึงเป็นปลั๊กอิน
แบรดดัลตัน

มันยุติธรรมพอ!
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 core) เนื่องจากฟังก์ชั่นไม่สามารถเสียบได้คุณจึงไม่สามารถใส่มันลงในfunctions.phpไฟล์ของคุณได้ ฉันจะอัปเดตคำตอบของฉันในหนึ่งนาที ...
tfrommen

ดูเหมือนจะใช้งานไม่ได้ แต่ตัวแทนผู้ใช้สำหรับ iPad จะไม่ได้รับผลตอบแทนจริงหรือ?
Bram Vanroy

หืม? ฉันเข้าใจดีว่าคุณต้องการยกเว้นไอแพดไม่ให้ถูกมองว่าเป็นอุปกรณ์พกพา - อย่างที่พวกเขาต้องการโดย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.