Desactivar complementos solo para dispositivos móviles

4

Intenté usar la función deactivate_plugins para desactivar un complemento solo para dispositivos móviles.

Funcionó: cuando ingreso al sitio en el teléfono móvil, el complemento está desactivado, pero cuando ingreso al sitio en la PC, el complemento también está desactivado.

¿Hay una manera de no desactivar un complemento, sino desactivarlo solo para móviles?

function deactivate_plugin_conditional() {
  if ( wp_is_mobile() ) {
    deactivate_plugins( array('/first-plugin/first.php', '/second-plugin/second.php') );    
  }
}

add_action( 'admin_init', 'deactivate_plugin_conditional' );
    
pregunta c64girl 19.10.2014 - 03:52

2 respuestas

3

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

}
    
respondido por el gmazzap 19.10.2014 - 11:53
-2

La forma en que lo hice fue simplemente para ocultar los bits del complemento (esto funciona si el complemento se usa para mostrar información adicional, por ejemplo, las pestañas de las redes sociales).

Simplemente miré con la Herramienta de desarrollo en Chrome para ver cuál era el div que quería ocultar, luego en mi propio CSS agregué una regla como esta:

@media screen and (max-width: 767px) {
   div#nameOfDiv {
       display: none;
   }
}
    
respondido por el Violet Raindrops 28.07.2016 - 14:48

Lea otras preguntas en las etiquetas