Игнорирование константы DISALLOW_FILE_EDIT

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

В моем файле wp-config.php есть строка:

define('DISALLOW_FILE_EDIT', true);

Я всегда включаю это на всех сайтах как стандарт и это всегда работало именно так, как ожидалось. Однако я только что заметил, что на сайте одного клиента это перестало работать.

У них есть плагин User Role Editor, который был настроен для определения нескольких пользовательских ролей. Как только роли были настроены, плагин был деактивирован (он не должен быть активным, чтобы роли существовали), и все возможности для ролей контролируются через специальный плагин.

Однако после последнего обновления плагина, похоже, что запись wp_user_roles в базе данных была обновлена, и пользователи уровня администратора теперь имеют доступ к редактору файлов для тем и плагинов, несмотря на то, что DISALLOW_FILE_EDIT по-прежнему определено как true.

Я добавил фильтр в один из моих плагинов, который в основном делает то же, что и wp-includes/capabilities.php:

function vnmAdmin_preventFileEdits($required_caps, $cap, $user_id, $args) {

    $blocked_caps = array(
        'edit_files',
        'edit_plugins',
        'edit_themes',
    );

    if (in_array($cap, $blocked_caps)) {
        $required_caps[] = 'do_not_allow';
    }

    return $required_caps;
}

add_filter('map_meta_cap', 'vnmAdmin_preventFileEdits', 10, 4);

…но это все равно не работает. Что бы я ни делал, я не могу убрать возможность edit_files/themes/plugins у пользователей-администраторов. А я определенно хочу это сделать.

Неужели я что-то пропустил?

Похоже, это было результатом (что, я думаю, связано) обновления плагина User Role Editor, который затем непосредственно повлиял на поле wp_user_roles в таблице options базы данных, что каким-то образом привело к игнорированию DISALLOW_FILE_EDIT.

Мне пришлось предпринять несколько шагов, чтобы это исправить, так как были пользовательские роли, которые я создал, а также роли, добавленные WooCommerce. Шаги, которые я предпринял:

  • Скопировал поле wp_user_roles из базы данных, чтобы у меня был сериализованный массив всех пользовательских ролей под рукой;
  • С активным плагином User Role Editor перешел в Настройки->Редактор ролей пользователей, нажал на вкладку Инструменты, затем нажал на красную кнопку Сбросить (обратите внимание на предупреждения об этом сбрасывании ВСЕХ пользовательских ролей). После этого редактор файлов плагинов/тем исчез – DISALLOW_FILE_EDIT больше не игнорировался.
  • Деактивировал User Role Editor
  • Деактивировал, а затем снова активировал WooCommerce (чтобы повторно добавить роли пользователей WooCommerce, такие как Клиент и Менеджер магазина)
  • Написал специальный плагин для добавления ролей, которые ранее были добавлены User Role Editor.

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

//  Активировать плагин

function myPlugin_install() {
    addCustomRoles();
}

register_activation_hook( __FILE__, 'myPlugin_install');

//  Добавить пользовательские роли

function addCustomRoles() {
    $userRolesArray = array();

    $userRolesArray['content_management'] = array(
        'name'  => 'Управление контентом',
        'capabilities'  => array(
            'level_0' => true,
            'level_1' => true,
            'level_2' => true,
            'level_3' => true,
            'edit_published_pages' => true,
            'edit_published_posts' => true,
            'edit_published_products' => true,
        )
    );

    $userRolesArray['content_consumer'] = array(
        'name'  => 'Потребитель контента',
        'capabilities'  => array(
            //  и т.д.
        )
    );

    foreach($userRolesArray as $role=>$detailsArray) {

        $result = add_role(
            $role,
            $detailsArray['name'],
            $detailsArray['capabilities']
        );
    }
}

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

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

Ваша проблема с игнорированием константы DISALLOW_FILE_EDIT может быть связана с изменениями, внесёнными плагином User Role Editor, который, как вы упомянули, обновил записи о пользовательских ролях в базе данных. Константа DISALLOW_FILE_EDIT должна блокировать доступ к редактированию файлов тем, кто имеет соответствующие права, но изменения в ролях могут приводить к непредвиденным последствиям.

Чтобы устранить проблему, следует выполнить несколько шагов:

  1. Резервное копирование данных: Сначала сделайте резервную копию записи wp_user_roles из базы данных, чтобы сохранить все ваши пользовательские роли. Это позволит вам восстановить их в случае необходимости.

  2. Сброс ролей: С активированным плагином User Role Editor перейдите в настройки плагина, затем во вкладку «Инструменты» и нажмите красную кнопку «Сброс». Учтите, что это действие сбросит все пользовательские роли, но, как вы отметили, после этого доступ к редактору файлов будет заблокирован, и DISALLOW_FILE_EDIT снова начнёт работать.

  3. Деактивация плагина: После завершения сброса деактивируйте плагин User Role Editor.

  4. Отключение и повторное включение WooCommerce: Это восстановит роли, которые предоставляет WooCommerce, такие как «Клиент» и «Менеджер магазина».

  5. Создание пользовательских ролей: Используя скопированный и сериализованный массив с вашими пользовательскими ролями, создайте новый плагин, который будет добавлять эти роли обратно в систему. Пример кода, который у вас уже есть, совершенно подходит для этой задачи.

function myPlugin_install() {
    addCustomRoles();
}

register_activation_hook( __FILE__, 'myPlugin_install');

function addCustomRoles() {
    $userRolesArray = array();

    $userRolesArray['content_management'] = array(
        'name'  => 'Content Management',
        'capabilities'  => array(
            'level_0' => true,
            'level_1' => true,
            'level_2' => true,
            'level_3' => true,
            'edit_published_pages' => true,
            'edit_published_posts' => true,
            'edit_published_products' => true,
        )
    );

    $userRolesArray['content_consumer'] = array(
        'name'  => 'Content Consumer',
        'capabilities'  => array(
            // тут добавьте необходимые возможности
        )
    );

    foreach ($userRolesArray as $role => $detailsArray) {
        $result = add_role(
            $role,
            $detailsArray['name'],
            $detailsArray['capabilities']
        );
    }
}

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

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

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

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