Отключайте плагины только для мобильных устройств


Я пытался использовать deactivate_plugins функция деактивации плагина только для мобильных устройств.

Это сработало: когда я захожу на сайт с мобильного телефона, плагин деактивируется, но когда я захожу на сайт с ПК, плагин тоже деактивируется.

Есть ли способ не деактивировать плагин, а только отключить его для мобильных телефонов?

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' );
Author: gmazzap, 2014-10-19

2 answers

Если вы деактивируете плагин, изменения сохраняются в базе данных, поэтому при всех последующих обращениях плагин деактивируется, независимо от устройства, используемого для доступа к сайту.

Фильтрация параметра

Активный плагин в WordPress извлекается с помощью wp_get_active_and_valid_plugins() функция.

Он использует опцию "active_plugins", чтобы получить активный в данный момент плагин. Все параметры в WordPress могут быть отфильтрованы с помощью "option_{$option}" крючок фильтра, который в данном случае является "option_active_plugins".

Действовать рано

Вы можете подумать об использовании плагина для фильтрации этой опции, но проблема в том, что плагины, которые вы хотите исключить, могут быть загружены до вашего плагина, потому что вы никогда не можете быть уверены, что ваш плагин загружен первым.

Решение состоит в том, чтобы использовать плагин MU для области действия.

Слишком ранний выпуск

Плагины MU запускаются в WordPress очень рано, что дает вам возможность фильтровать "option_active_plugins" вариант.

Еще одна проблема заключается в том, что плагины MU загружаются очень рано, даже до того, как файл wp-includes/vars.php которые содержат функцию wp_is_mobile() загружается, поэтому, если вы используете эту функцию внутри плагина MU, вы получите фатальную ошибку.

Загрузить файл "вручную" - это не вариант, потому что WordPress загрузит этот файл с помощью require, а не require_once, поэтому, если вы загрузите файл, когда WordPress загрузит его снова, вы получите фатальную ошибку для уже определенной функции.

Единственным решением является напишите еще раз wp_is_mobile(), просто справляюсь с ядром и использую другое имя.

Давайте закодируем

Создайте PHP-файл и сохраните его в папке wp-content/mu-plugins.

Прежде всего напишите там функцию, которая возвращает все плагины, которые вы хотите отключить для мобильных устройств:

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'

  );
}

После этого напишите клон функции wp_is_mobile() с другим именем:

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

Наконец, отфильтруйте 'option_active_plugins', используя предыдущую функцию, чтобы проверить, удаляются ли плагины или нет

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

}
 4
Author: gmazzap, 2014-10-19 10:01:53

Я сделал это так, чтобы просто скрыть биты плагина (это работает, если плагин используется для отображения дополнительной информации, например вкладок социальных сетей).

Я просто посмотрел с помощью инструмента разработчика в Chrome, чтобы увидеть, какой div я хотел скрыть, затем в свой собственный CSS я добавил правило, подобное этому:

@media screen and (max-width: 767px) {
   div#nameOfDiv {
       display: none;
   }
}
 -2
Author: Violet Raindrops, 2016-07-28 14:28:15