Excluyendo iPad de wp_is_mobile

16 sept 2013, 20:07:59
Vistas: 21.8K
Votos: 12

Estoy experimentando un problema muy molesto. Construí mi sitio web con media queries y is_mobile (pensando que is_mobile sería lo mismo que pantallas más pequeñas. Qué ingenuo de mi parte) pero después de algunas pruebas, aparentemente el iPad lo arruina todo (bueno, en realidad lo arruiné yo).

Todos mis problemas podrían resolverse fácilmente si pudiera excluir el iPad de la función wp_is_mobile. ¿Cómo puedo reescribir 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 // muchos dispositivos móviles (todos 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 podría modificar esto?

0
Todas las respuestas a la pregunta 4
4
17

La respuesta de t f me hizo pensar. En realidad, puedo usar la función principal y adaptarla como quiera pero simplemente poner todo en una nueva función. Así que 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;
}
16 sept 2013 22:39:23
Comentarios

Es siempre bueno encontrar soluciones propias, así que +1 por esto. Sin embargo, también actualicé mi respuesta. Tenía un error tipográfico estúpido: verifiqué === cuando debería haber verificado !== en su lugar - no tengo idea de cómo sucedió eso, pero ahora lo corregí. Entonces, la respuesta anterior debería funcionar también - lo cual no estoy diciendo para que la aceptes! Es solo que, en esencia, nuestras respuestas/funciones hacen lo mismo - así que solo quería encontrar (y corregir) lo que estaba mal.

tfrommen tfrommen
16 sept 2013 23:44:45

@tf ¡De eso se trataba mi comentario! Pero voy a aceptar mi propia respuesta porque sé que esta funciona y no he probado tu código. No quiero que nadie lea esto y use tu respuesta si no la he probado. Me siento un poco responsable por este hilo. Espero que lo entiendas. ¡Gracias por el esfuerzo de todos modos!

Bram Vanroy Bram Vanroy
17 sept 2013 11:43:12

¿Realmente lograron probarlo en vivo en un iPad? Lo estoy intentando ahora mismo sin éxito, iPad Air, localmente.

kevin kevin
8 ene 2014 22:18:29

@kevin probó esto en un iPAD 3, y funcionó.

Bram Vanroy Bram Vanroy
8 ene 2014 22:25:56
0

Sé que esto es antiguo, pero quería actualizarlo con la forma correcta de WordPress para 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 se debería haber hecho es aceptar el reto y reescribir el tema para que funcione correctamente en tabletas. Existían/existen más fabricantes de tabletas además de Apple.

19 dic 2018 02:21:20
4

También podrías utilizar la clase Mobile Detect PHP, que se actualiza regularmente, para crear una función personalizada que detecte móviles excluyendo tablets (incluyendo iPads). Al momento de escribir esta respuesta, el repositorio de Github había sido actualizado más recientemente para incluir detección de nuevas tablets Samsung hace 3 meses.

Asumiendo que colocas el archivo requerido en un directorio llamado /includes/ en tu tema, entonces puedes agregar este código a tu archivo 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 usa la función md_is_mobile() como sustituto de wp_is_mobile().

7 feb 2015 11:23:44
Comentarios

¿No depende esta solución de la instalación de un plugin que contenga la clase Mobile Detect?

Brad Dalton Brad Dalton
7 feb 2015 15:35:03

La dependencia de la clase Mobile Detect se maneja en la primera línea del bloque de código anterior; no se requiere ningún plugin adicional. Debo señalar que existen plugins de WordPress basados en esta clase, como WP Mobile Detect, pero este no se ha actualizado en casi 2 años, por lo que personalmente prefiero usar la clase PHP directamente, que parece estar en desarrollo activo.

Astrotim Astrotim
9 feb 2015 03:52:39

Es una respuesta válida, sin embargo necesitas instalar el archivo Mobile_Detect.php al que me refiero como el plugin.

Brad Dalton Brad Dalton
9 feb 2015 11:00:25

¡Eso es justo!

Astrotim Astrotim
10 feb 2015 04:47:45
7

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

        // salir si es iPad
        && false === strpos($_SERVER['HTTP_USER_AGENT'], 'iPad')

        // todo lo demás relacionado con móviles
        && (
            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;
}

// EDICIÓN:

Vale, una vez más...

Escribe una nueva función que internamente use la función principal y la extienda:

function my_wp_is_mobile() {
    if (
        ! empty($_SERVER['HTTP_USER_AGENT'])

        // salir si es iPad
        && false !== strpos($_SERVER['HTTP_USER_AGENT'], 'iPad')
    ) return false;
    return wp_is_mobile();
} // función my_wp_is_mobile

Ahora puedes usar tu nueva función my_wp_is_mobile donde quieras.

16 sept 2013 20:52:21
Comentarios

¿Entonces, simplemente puedo colocar esto dentro de mi archivo functions.php y sobrescribirá automáticamente la función principal?

Bram Vanroy Bram Vanroy
16 sept 2013 21:04:54

Ups, lo siento, error mío - nunca he usado esto (y por lo tanto no sabía que era parte del núcleo de WP). Como la función no es "pluggable", no puedes simplemente colocar eso en tu archivo functions.php. Actualizaré mi respuesta en un minuto...

tfrommen tfrommen
16 sept 2013 21:08:12

Esto no parece funcionar. Pero, ¿no debería el agente de usuario para iPad devolver verdadero?

Bram Vanroy Bram Vanroy
16 sept 2013 21:37:45

¿Eh? Entendí que querías excluir los iPads de ser tratados como dispositivos móviles, como lo haría wp_is_mobile...? Entonces, ¿qué es lo que no funciona (como tú quisieras que funcionara)?

tfrommen tfrommen
16 sept 2013 22:07:03

Desafortunadamente no tengo un iPad, así que debo confiar en la información que me dan 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 usé if(!my_wp_is_mobile() ) la barra lateral sigue sin mostrarse. De lo cual deduzco que la función no funciona.

Bram Vanroy Bram Vanroy
16 sept 2013 22:10:08

Y lo que quise decir con mi comentario es que pensé que la función verifica "si el agente de usuario NO está vacío Y si es falso que el agente de usuario es iPad" devuelve falso. Pero yo diría que necesito "si el agente de usuario NO está vacío y si es verdadero que el agente de usuario es iPad"? Tal vez tiene que ver con que ejecutas la función principal después de la función personalizada también? Y entonces $_SERVER['HTTP_USER_AGENT'], 'Mobile') devolverá verdadero para iPad.

Bram Vanroy Bram Vanroy
16 sept 2013 22:14:05

Lo resolví (ver mi propia respuesta). ¡Gracias por las ideas de todos modos!

Bram Vanroy Bram Vanroy
16 sept 2013 22:39:38
Mostrar los 2 comentarios restantes