Excluyendo iPad de wp_is_mobile

9

Estoy experimentando un problema muy molesto. Construí mi sitio web con consultas de medios e is_mobile (pensar que is_mobile sería lo mismo que pantallas más pequeñas. Qué tonto de mi parte), pero después de algunas pruebas aparentemente el iPad lo arruinó (está bien, en realidad lo hice).

Todos mis problemas podrían resolverse fácilmente si pudiera excluir un iPad de la función wp_is_mobile. ¿Cómo reescribo esa función?

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

¿Cómo cambiaría esto?

Bram Vanroy
fuente

Respuestas:

13

La respuesta de tf me hizo pensar. En realidad, puedo usar la función central y adaptarla como me gusta, pero simplemente poner todo en una nueva función. Entonces aquí va:

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
fuente
Siempre es bueno encontrar soluciones propias , así que +1 para esto. Sin embargo, también actualicé mi respuesta. Tenía un error estúpido allí: lo comprobé ===mientras debería haberlo verificado !==, no tengo idea de cómo sucedió eso, pero ahora lo arreglé. Por lo tanto, la respuesta anterior también debería funcionar, ¡lo cual no digo para que lo aceptes! Es solo que, en esencia, nuestras respuestas / funciones hacen lo mismo, así que solo quería encontrar (y arreglar) lo que estaba mal.
tfrommen
@tf ¡De eso se trataba mi comentario! Pero, voy a aceptar mi propia respuesta porque sé que esta funciona y no he probado su código. No quiero que nadie lea esto y use su respuesta si no lo he probado. Me siento un poco responsable de este hilo. Espero que entiendas. Gracias por el esfuerzo sin embargo!
Bram Vanroy
¿Realmente lograron probarlo en vivo en un ipad? Estoy intentando ahora sin ningún éxito, localmente.
Kevin
@kevin probó esto en un iPAD 3, que funcionó.
Bram Vanroy
4

También puede usar la clase PHP Mobile Detect actualizada regularmente para crear una función personalizada para detectar móviles que excluyan tabletas (por lo tanto, iPads). Al momento de escribir esta respuesta, el repositorio de Github se había actualizado recientemente para incluir la detección de nuevas tabletas Samsung a partir de hace 3 meses.

Suponiendo que coloque el archivo requerido en el directorio llamado /includes/en su tema, puede agregar este código a sus functions.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;
  }

}

luego use la función md_is_mobile()como sustituto de wp_is_mobile().

Astrotim
fuente
¿No depende esta solución de la instalación de un complemento que contenga la clase Mobile Detect?
Brad Dalton
La dependencia de la clase Mobile Detect es manejada por la primera línea del bloque de código anterior; No se requiere ningún complemento adicional. Debo señalar que existen complementos de WordPress basados ​​en esta clase, como WP Mobile Detect , pero esto no se ha actualizado durante casi 2 años, por lo que personalmente prefiero usar la clase PHP directamente, que parece estar desarrollada activamente.
Astrotim
Es una respuesta justa, sin embargo, debe instalar el archivo Mobile_Detect.php al que me refiero como el complemento.
Brad Dalton
¡Eso es lo suficientemente justo!
Astrotim
2

Sé que esto es antiguo, pero quería actualizarlo con la forma correcta de WordPress de implementar las soluciones anteriores. A partir de la versión 4.9.0, en lugar de implementar otra función, deberían filtrar el resultado de wp_is_mobile (). Así:

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

SIN EMBARGO, lo que realmente debería haberse hecho fue morder la bala y reescribir el tema para que funcione correctamente en tabletas. Hubo / hay más fabricantes de tabletas que Apple.

Brian Layman
fuente
1

He reescrito (y, en mi opinión, optimizado) un poco tu función:

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

// EDITAR:

Vale, una vez más ...

Escriba una nueva función que use internamente la función central y extiéndala :

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

Ahora puede usar su nueva my_wp_is_mobilefunción en cualquier lugar que desee.

tfrommen
fuente
Entonces, ¿puedo poner esto dentro de mi archivo functions.php y sobrescribirá automáticamente la función principal?
Bram Vanroy
Vaya, lo siento, mi mal, nunca usé esto (y por lo tanto no sabía que era el núcleo de WP). Como la función no es conectable, no puede simplemente poner eso en su functions.phparchivo. Actualizaré mi respuesta en un minuto ...
tfrommen
Esto no parece funcionar. ¿Pero no debería el agente de usuario para iPad volver verdadero?
Bram Vanroy
Hm? Lo entendí como si quisieras excluir a los iPads de ser tratados como dispositivos móviles, como lo harían wp_is_mobile... Entonces, ¿qué no funciona (como le gustaría hacer)?
tfrommen
Lamentablemente no tengo un iPad, así que tengo que confiar en la información que obtengo de mis amigos. Pero actualmente tengo un diseño que carga una barra lateral si un agente de usuario "! Is_mobile" (no es móvil), pero esto no es necesario para el iPad porque su resolución es lo suficientemente grande. Mis amigos me dicen que aunque utilicé if(!my_wp_is_mobile() )la barra lateral, todavía no se muestra. De lo cual deduzco que la función no funciona.
Bram Vanroy