Отключайте плагины только для мобильных устройств
Я пытался использовать 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' );
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 ) );
}
Я сделал это так, чтобы просто скрыть биты плагина (это работает, если плагин используется для отображения дополнительной информации, например вкладок социальных сетей).
Я просто посмотрел с помощью инструмента разработчика в Chrome, чтобы увидеть, какой div я хотел скрыть, затем в свой собственный CSS я добавил правило, подобное этому:
@media screen and (max-width: 767px) {
div#nameOfDiv {
display: none;
}
}