В процессе разработки и сопровождения WordPress-сайтов часто возникает необходимость не просто деактивировать темы или плагины, но и полностью удалять их, чтобы не оставлять мусорных данных и файлов на сервере. В стандартном функционале WordPress удаление — это отдельное действие от деактивации, и оно требует ручного вмешательства. В этой статье рассмотрим, как реализовать автоматическое удаление установленных плагинов и тем при их деактивации с помощью кастомного кода.
Зачем нужно автоматическое удаление плагинов и тем
Часто после тестирования плагина или темы они остаются на сайте деактивированными, но их файлы и данные занимают место, а иногда даже вызывают конфликты или замедляют загрузку. Автоматическое удаление помогает:
- Сохранять чистоту файловой структуры сайта.
- Избегать потенциальных конфликтов между деактивированными, но не удалёнными расширениями.
- Облегчать поддержку и сопровождение сайта, особенно если администраторы не всегда помнят о необходимости удаления.
Как работает стандартный процесс удаления
В WordPress удаление плагина или темы — это отдельное действие, не связанное с деактивацией. При удалении WordPress вызывает функцию register_uninstall_hook или файл uninstall.php, если они есть, где расширение должно очистить свои данные в базе. Но сам процесс удаления папок и файлов выполняется через админку вручную.
Чтобы автоматизировать это, нам нужно перехватить событие деактивации и дополнительно инициировать удаление файлов.
Автоматическое удаление плагина при деактивации: пример кода
Создадим функцию, которая при деактивации плагина удалит его папку. Такой подход подходит для ваших собственных плагинов или для разработчиков, которые хотят, чтобы их расширения удалялись полностью при деактивации.
function wpcodes_auto_delete_plugin($plugin) {
if ($plugin != plugin_basename(__FILE__)) {
return;
}
$plugin_dir = plugin_dir_path(__FILE__);
// Функция для рекурсивного удаления папки
function wpcodes_rrmdir($dir) {
if (!is_dir($dir)) return;
$objects = scandir($dir);
foreach ($objects as $object) {
if ($object == '.' || $object == '..') continue;
$path = $dir . DIRECTORY_SEPARATOR . $object;
if (is_dir($path)) {
wpcodes_rrmdir($path);
} else {
unlink($path);
}
}
rmdir($dir);
}
wpcodes_rrmdir($plugin_dir);
}
register_deactivation_hook(__FILE__, 'wpcodes_auto_delete_plugin');
Обратите внимание, что при удалении плагина таким образом он перестанет существовать на сервере сразу после деактивации, поэтому использовать такую логику нужно аккуратно и только в тех случаях, когда вы уверены в необходимости полного удаления.
Автоматическое удаление темы при переключении на другую
Для тем ситуация немного сложнее. WordPress не вызывает хук при деактивации темы, но можно отследить смену активной темы через хук switch_theme. В этом хук можно добавить удаление старой темы.
function wpcodes_auto_delete_old_theme($old_theme_name) {
$themes = wp_get_themes();
if (!isset($themes[$old_theme_name])) {
return; // Тема не найдена
}
$old_theme = $themes[$old_theme_name];
$old_theme_dir = $old_theme->get_stylesheet_directory();
// Удаляем папку темы, кроме базовой темы (twentytwenty, twentytwentyone и т.д.)
$protected_themes = ['twentytwenty', 'twentytwentyone', 'twentytwentytwo', 'twentytwentythree'];
if (in_array($old_theme_name, $protected_themes)) {
return; // Не удаляем системные темы
}
// Рекурсивное удаление папки темы
function wpcodes_rrmdir($dir) {
if (!is_dir($dir)) return;
$objects = scandir($dir);
foreach ($objects as $object) {
if ($object == '.' || $object == '..') continue;
$path = $dir . DIRECTORY_SEPARATOR . $object;
if (is_dir($path)) {
wpcodes_rrmdir($path);
} else {
unlink($path);
}
}
rmdir($dir);
}
wpcodes_rrmdir($old_theme_dir);
}
add_action('switch_theme', 'wpcodes_auto_delete_old_theme');
Такой подход позволяет автоматически удалять старую тему при переключении на новую, освобождая место и упрощая управление.
Важные моменты и рекомендации
Перед внедрением автоматического удаления необходимо учитывать следующее:
- Всегда делайте резервные копии сайта и базы данных — удаление файлов необратимо.
- Автоматическое удаление может быть рискованным — в случае ошибочного срабатывания вы потеряете данные.
- Рекомендуется внедрять подтверждение удаления или ограничивать функционал для администраторов.
- Для более безопасного подхода можно сначала перемещать удаляемые папки в карантин.
- При удалении плагинов и тем желательно дополнительно очищать связанные данные в базе через
register_uninstall_hookили uninstall.php.
Пример использования плагина Clearfy Pro для очистки после удаления
Если вы используете плагин Clearfy Pro, он помогает автоматически очищать базу данных и удалять остаточные данные плагинов при удалении или деактивации, что дополняет описанный выше функционал. Такой комплексный подход минимизирует риск засорения сайта.
Итоги
Автоматическое удаление тем и плагинов при их деактивации — мощный инструмент для опытных разработчиков и администраторов сайтов, позволяющий поддерживать чистоту и порядок на сервере. Однако без должной осторожности он может привести к потере данных. Используйте приведённые примеры кода как основу для своих решений, адаптируя их под задачи и особенности вашего проекта.