Деактивировать плагин для определенной группы пользователей
Я хотел бы отключить плагин для определенного пользователя. Я использую следующий код внутри файла плагина wp-content/plugin-mu
:
add_filter( 'option_active_plugins', 'bo_disable_apm_plugin' );
function bo_disable_apm_plugin( $plugins ) {
global $current_user;
// Not use advanced page manager for media manager
if ( is_admin() && in_array( 'media_manager', $current_user->roles ) ) {
$key = array_search( 'advanced-page-manager/advanced_page_manager.php' , $plugins );
if ( false !== $key ) {
unset( $plugins[$key] );
}
}
return $plugins;
}
Конечно, это не работает. Я не понимаю, как option_active_plugins
. Сбрасывая данные, я узнаю, что код выполняется 7 раз.
В первом цикле пользователь не знает, поэтому условие не выполняется. Плагин все еще активирован.
Я добавил более сложный код с тремя условиями: отключите плагин, если пользователь не задан, поэтому плагин отключается каждый раз в первом цикле. ЕСЛИ пользователь настроен (следующие циклы), проверьте, чтобы он установил/отключил плагин соответствующим образом. Тоже ничего не получалось.
Мне не удалось найти правильную формулу, так что, возможно, я где-то ошибаюсь и это невозможно сделать. Каждый раз плагин либо активируется, либо деактивируется для всех пользователей. Похоже, что первая итерация - это та, которая имеет значение.
Есть ли способ деактивировать плагин для определенного пользователя/группы?
2 answers
Я думаю, что ответ на этот Отключить плагин/действие плагина через тему хорош для базовых знаний о том, как отключить плагины из кода.
Адаптация этих знаний к вашим потребностям оставит нас с этим:
add_action('admin_init', 'my_filter_the_plugins');
function my_filter_the_plugins()
{
global $current_user;
if (in_array('media_manager', $current_user->roles)) {
deactivate_plugins( // deactivate for media_manager
array(
'/advanced-page-manager/advanced_page_manager.php'
),
true, // silent mode (no deactivation hooks fired)
false // network wide
);
} else { // activate for those than can use it
activate_plugins(
array(
'/advanced-page-manager/advanced_page_manager.php'
),
'', // redirect url, does not matter (default is '')
false, // network wise
true // silent mode (no activation hooks fired)
);
}
}
В основном это происходит:
Для группы пользователей media_manager
my_filter_the_plugins
отключает ( беззвучно) плагин advanced-page-manager
. Затем нам нужно повторно активировать плагин ( беззвучно, снова) для тех, кто не входит в группу пользователей media_manager
.
В принципе, вы можете деактивировать весь плагин только на основе информации, которая у вас есть во время "загрузки" wordpress, которая в основном состоит из URL-адреса и файлов cookie. Любая проверка, более сложная, чем эта, вероятно, придется подождать, пока загрузка не будет завершена, чтобы ее можно было выполнить, и в это время плагин уже загружен, и "деактивировать" его слишком поздно.