Выполнить плагин только для определённой роли(ролей) пользователя

Вопрос или проблема

Как я могу включить определенные плагины только для одной конкретной роли пользователя (или, возможно, массива ролей пользователей)?

Есть ли что-то, что я могу добавить в мой functions.php в дочерней теме, чтобы использовать конкретный плагин для конкретной роли пользователя?

Я пробовал различные ответы отсюда и из статей, но ничего не соответствует моим потребностям.

Обновление:

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

add_filter( 'option_active_plugins', 'custom_plugin_load_filter' );
function custom_plugin_load_filter( $plugins ) {
    $user = wp_get_current_user();
    if ( in_array( 'administrator', (array) $user->roles ) ) {
        //unset( $plugins['additional-order-confirmation-email/additional-order-confirmation-email.php'] ); // сменить my-plugin-slug
         $key = array_search( 'additional-order-confirmation-email/additional-order-confirmation-email.php' , $plugins );
            if ( false !== $key ) {
                unset( $plugins[$key] );
            }

    }
    return $plugins;
}   

Если я изменю на !in_array, он остается активным для администраторов (правильно), но также для гостей (неправильно).

Не стоит изменять плагины, если это возможно, так как плагин может быть обновлен, и вы потеряете свои изменения и вам придётся их делать заново.

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

add_filter( 'option_active_plugins', 'custom_plugin_load_filter' );
function custom_plugin_load_filter( $plugins ) {
    $user = wp_get_current_user();
    if ( !in_array( 'sales_events', (array) $user->roles ) ) {
        unset( $plugins['my-plugin-slug'] ); // сменить my-plugin-slug
    }
    return $plugins;
}

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

Это ответ, основанный на фразе “Выполнение плагина” в заголовке вашего вопроса.

Если вы просто хотите запускать/выполнять плагин для определенных ролей пользователей, вам не нужно препятствовать его загрузке. Мое решение – разрешить WordPress загружать ваш плагин и управлять им в вашем плагине.

Таким образом, вы можете использовать код, например:

// В главном файле плагина, который загружает и инициирует функциональность плагина.

if ( ! current_user_can( 'manage_options' ) ) {
    return;
}

include 'plugin-file.php';
new myPlugin();

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

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

У меня была похожая проблема, и я использовал код @majick после некоторых модификаций:

add_filter( 'option_active_plugins', 'custom_plugin_load_filter' );
function custom_plugin_load_filter( $plugins ) {
    $user = wp_get_current_user();
    if ( !in_array( 'sales_events', (array) $user->roles ) ) {
        $index = array_search( 'plugin-name/plugin-file.php', $plugins );
        unset( $plugins[ $index ] );
        $plugins = array_values( $plugins );
    }
    return $plugins;
}

Чтобы выяснить имя/путь плагина, щелкните правой кнопкой мыши по ссылке активации или деактивации плагина (WP-Admin > Плагины > Список установленных плагинов) и вставьте его в декодер URL, такой как этот, и используйте значение в параметре “plugin=”.

//ИСПОЛЬЗОВАТЬ В wp-content/mu-plugins/disable-plugins-shop-manager.php

// Подключиться к фильтру option_active_plugins

add_filter(‘option_active_plugins’, function ($plugins) {
// Убедитесь, что это выполняется только в админ-панели
if (!is_admin()) {
return $plugins;
}

// Проверьте, загружены ли функции пользователя WordPress
if (!function_exists('wp_get_current_user')) {
    require_once ABSPATH . 'wp-includes/pluggable.php';
}

$user = wp_get_current_user();

// Убедитесь, что у нас есть действительный объект пользователя, прежде чем продолжать
if (!$user || empty($user->roles)) {
    return $plugins;
}

// Проверьте, является ли текущий пользователь менеджером магазина
if (in_array('shop_manager', (array) $user->roles)) {
    
    // Определите пути плагинов
    $plugins_to_remove = [
        'elementor/elementor.php',
        'revslider/revslider.php'
    ];

    // Переберите и удалите каждый плагин
    foreach ($plugins_to_remove as $plugin) {
        if (($key = array_search($plugin, $plugins)) !== false) {
            unset($plugins[$key]);
        }
    }

    // Переиндексируйте массив, чтобы избежать проблем
    $plugins = array_values($plugins);
}

return $plugins;

});

Ответ или решение

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

Теоретическая часть

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

Фильтр option_active_plugins в WordPress позволяет изменить список активных плагинов. Этот фильтр обрабатывает опцию active_plugins до её сохранения в базе данных, что позволяет вам управлять тем, какие плагины считаются активными. Применяя функции, которые определяют текущую роль пользователя, можно selectively технически "деактивировать" плагины, скрывая их от определенных пользовательских ролей.

Пример решения

На основе предоставленных вами примеров и информации, вы можете использовать следующий подход:

  1. Получение текущего пользователя: Используйте функцию wp_get_current_user(), чтобы получить данные о текущем пользователе.

  2. Проверка ролей пользователя: Используйте in_array() для проверки наличия определённой роли среди ролей текущего пользователя.

  3. Изменение списка плагинов: Используйте array_search() для определения позиции плагина в массиве активных плагинов, а затем удалите его, если пользователь не обладает необходимой ролью.

Вот пример кода:

add_filter( 'option_active_plugins', 'custom_plugin_load_filter' );

function custom_plugin_load_filter( $plugins ) {
    // Проверка, если текущий запрос идет с админки (чтобы избежать изменений на фронтенде)
    if (!is_admin()) {
        return $plugins;
    }

    // Требуется функция для получения текущего пользователя
    if (!function_exists('wp_get_current_user')) {
        require_once ABSPATH . 'wp-includes/pluggable.php';
    }

    $user = wp_get_current_user();

    // Если пользователь не идентифицирован или отсутствуют роли, возвращаем список без изменений
    if (!$user || empty($user->roles)) {
        return $plugins;
    }

    // Определите роли, для которых необходимо отключить плагины
    if (!in_array('desired_role', (array) $user->roles)) {
        $plugins_to_remove = [
            'plugin-directory/plugin-file.php',
            // Добавьте другие плагины по необходимости
        ];

        // Удалите плагины из списка активных
        foreach ($plugins_to_remove as $plugin) {
            if (($key = array_search($plugin, $plugins)) !== false) {
                unset($plugins[$key]);
            }
        }

        // Переиндексация массива, чтобы избежать ошибок
        $plugins = array_values($plugins);
    }

    return $plugins;
}

Практическое использование

Применение

Этот код добавляется в файл functions.php вашей дочерней темы или в отдельный файл в директории mu-plugins (must-use plugins), чтобы он применялся ко всей установке WordPress. При этом важно, чтобы код выполнялся на каждом запросе в админ-панели, чтобы контролировать активацию/деактивацию каждого плагина в зависимости от роли текущего пользователя.

Используя этот подход, вы добьётесь следственных эффектов:

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

Важные аспекты

  1. Безопасность и производительность: Проверьте, чтобы список плагинов для исключения не был слишком большим, так как это может повлиять на производительность и стабильность сайта.

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

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

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

Оцените материал
Добавить комментарий

Капча загружается...