Деактивировать плагин для определенной группы пользователей


Я хотел бы отключить плагин для определенного пользователя. Я использую следующий код внутри файла плагина 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 раз.

В первом цикле пользователь не знает, поэтому условие не выполняется. Плагин все еще активирован.

Я добавил более сложный код с тремя условиями: отключите плагин, если пользователь не задан, поэтому плагин отключается каждый раз в первом цикле. ЕСЛИ пользователь настроен (следующие циклы), проверьте, чтобы он установил/отключил плагин соответствующим образом. Тоже ничего не получалось.

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

Есть ли способ деактивировать плагин для определенного пользователя/группы?

Author: mrwweb, 2014-08-25

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.

 5
Author: aifrim, 2017-04-13 12:37:52

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

 0
Author: Mark Kaplun, 2016-07-08 08:01:54