Excluyendo iPad de wp_is_mobile
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?
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;
}

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.

@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!

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

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.

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()
.

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

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.

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

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.

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

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...

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

¿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)?

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.

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.
