Вопрос или проблема
В моем файле 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
должна блокировать доступ к редактированию файлов тем, кто имеет соответствующие права, но изменения в ролях могут приводить к непредвиденным последствиям.
Чтобы устранить проблему, следует выполнить несколько шагов:
-
Резервное копирование данных: Сначала сделайте резервную копию записи
wp_user_roles
из базы данных, чтобы сохранить все ваши пользовательские роли. Это позволит вам восстановить их в случае необходимости. -
Сброс ролей: С активированным плагином User Role Editor перейдите в настройки плагина, затем во вкладку «Инструменты» и нажмите красную кнопку «Сброс». Учтите, что это действие сбросит все пользовательские роли, но, как вы отметили, после этого доступ к редактору файлов будет заблокирован, и
DISALLOW_FILE_EDIT
снова начнёт работать. -
Деактивация плагина: После завершения сброса деактивируйте плагин User Role Editor.
-
Отключение и повторное включение WooCommerce: Это восстановит роли, которые предоставляет WooCommerce, такие как «Клиент» и «Менеджер магазина».
-
Создание пользовательских ролей: Используя скопированный и сериализованный массив с вашими пользовательскими ролями, создайте новый плагин, который будет добавлять эти роли обратно в систему. Пример кода, который у вас уже есть, совершенно подходит для этой задачи.
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']
);
}
}
// Активируйте плагин
- Переактивация вашего пользовательского плагина: После всего вышеописанного деактивируйте и снова активируйте ваш созданный плагин, чтобы все роли были восстановлены, а доступ к редактору файлов оставался заблокированным на всех ролях.
Эти шаги должны помочь вам устранить проблему игнорирования константы DISALLOW_FILE_EDIT
. Если доступны другие плагины, которые изменяют разрешения или роли, убедитесь, что они настроены правильно и не конфликтуют с вашими настройками.