Si desactiva un complemento, el cambio se almacena en la base de datos, por lo que en todos los accesos posteriores, el complemento se desactiva, independientemente del dispositivo utilizado para acceder al sitio.
Filtrar la opción
El complemento activo en WordPress se recupera usando la función wp_get_active_and_valid_plugins()
.
Utiliza la opción "active_plugins"
para obtener el complemento actualmente activo. Todas las opciones en WordPress se pueden filtrar utilizando el gancho de filtro "option_{$option}" , que en este caso es "option_active_plugins"
.
Actuando temprano
Puede pensar en usar un complemento para filtrar esa opción, pero el problema es que es posible que los complementos que desea excluir se carguen antes que su complemento, porque nunca puede estar seguro de que el complemento esté cargado. para el primero.
La solución es usar un complemento de MU para el alcance.
Número demasiado temprano
Los complementos de MU se ejecutan muy temprano en WordPress, lo que te da la posibilidad de filtrar la opción "option_active_plugins"
.
Otro problema es que los complementos de MU se cargan muy temprano, incluso antes del archivo wp-includes/vars.php
que contienen la función wp_is_mobile()
está cargado, por lo tanto, si usa esa función dentro de un complemento MU, se produce un error fatal.
Cargar el archivo "manualmente" es no una opción, porque WordPress cargará ese archivo usando require
y no require_once
, así que si carga el archivo, cuando WordPress lo cargue nuevamente obtener un error fatal para la función ya definida.
La única solución es escribir otra vez wp_is_mobile()
, solo copiando desde el núcleo y usando un nombre diferente.
Vamos a codificar
Crea un archivo PHP y guárdalo en la carpeta wp-content/mu-plugins
.
En primer lugar, escriba una función que devuelva todos los complementos que desea deshabilitar para dispositivos móviles:
function my_non_mobile_plugins() {
return array(
// an array of all the plugins you want to exclude for mobile
'plugin-folder/plugin-file.php',
'another-plugin-folder/another-plugin-file.php',
'no-folder-plugin-file.php'
);
}
Después de eso, escribe un clon de la función wp_is_mobile()
, con otro nombre:
function my_is_mobile() {
$is_mobile = false;
if ( 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') !== false
|| strpos($_SERVER['HTTP_USER_AGENT'], 'Opera Mobi') !== false
) {
$is_mobile = true;
}
return $is_mobile;
}
Finalmente, filtre 'option_active_plugins'
haciendo uso de la función anterior para verificar si elimina los complementos o no
add_filter( 'option_active_plugins', 'my_disable_plugins_for_mobiles' );
function my_disable_plugins_for_mobiles( $plugins ) {
if ( ! my_is_mobile() ) {
return $plugins; // for non-mobile device do nothing
}
$not_allowed = my_non_mobile_plugins(); // get non allowed plugins
return array_values( array_diff( $plugins, $not_allowed ) );
}