Desativar plug-ins apenas para dispositivos móveis

4

Eu tentei usar a função deactivate_plugins para desativar um plug-in apenas para dispositivos móveis.

Funcionou: quando entro no site no celular o plugin é desativado, mas quando entro no site no PC o plugin também é desativado.

Existe uma maneira de não desativar um plugin, mas somente desativá-lo para celulares?

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' );
    
por c64girl 19.10.2014 / 03:52

2 respostas

3

Se você desativar um plug-in, a alteração será armazenada no banco de dados, portanto, em todo o acesso subseqüente, o plug-in será desativado, independentemente do dispositivo usado para acessar o site.

Filtrando a opção

O plug-in ativo no WordPress é recuperado com a função wp_get_active_and_valid_plugins() .

Ele usa a opção "active_plugins" para obter o plugin atualmente ativo. Todas as opções no WordPress podem ser filtradas usando o gancho de filtro "option_{$option}" , que nesse caso é "option_active_plugins" .

Agindo cedo

Você pode pensar em usar um plugin para filtrar essa opção, mas o problema é que é possível que os plugins que você deseja excluir sejam carregados antes do seu plugin, porque você nunca pode ter certeza de que o plugin está carregado para primeiro.

A solução é usar um plug-in de MU para o escopo.

Problema muito cedo

Os plugins MU são executados muito cedo no WordPress, o que lhe dá a possibilidade de filtrar a opção "option_active_plugins" .

Outra questão é que os plug-ins de MU são carregados muito cedo, mesmo antes do arquivo wp-includes/vars.php que contém a função wp_is_mobile() é carregada, então se você usar essa função dentro de um plugin MU, você receberá um erro fatal.

Carregue o arquivo "manualmente" é não uma opção, porque o WordPress carregará esse arquivo usando require e não require_once , então se você carregar o arquivo, quando o WordPress carregá-lo novamente você obtenha um erro fatal para a função já definida.

A única solução é escrever novamente wp_is_mobile() , apenas copiando do núcleo e usando um nome diferente.

Vamos codificar

Crie um arquivo PHP e salve na pasta wp-content/mu-plugins .

Primeiro, escreva uma função que retorne todo o plug-in que você deseja desativar para dispositivos móveis:

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'

  );
}

Depois disso, escreva um clone da função wp_is_mobile() , com outro nome:

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' fazendo uso da função anterior para verificar se remove plugins ou não

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

}
    
por gmazzap 19.10.2014 / 11:53
-2

A maneira que eu fiz foi simplesmente esconder os bits do plugin (isso funciona se o plugin é usado para exibir informações extras, por exemplo, guias de mídias sociais).

Eu simplesmente olhei com a Developer Tool no Chrome para ver qual era a div que queria ocultar, depois, no meu próprio CSS, adicionei uma regra como esta:

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