В WordPress часто накапливается множество установленных тем, из которых активна только одна. Остальные темы занимают место на сервере и потенциально могут создавать угрозы безопасности, если они не обновляются. В этой статье мы разберём, как программно реализовать автоматическое отключение и деактивацию неиспользуемых тем в WordPress с помощью хука и WP-функций.
Почему важно отключать неиспользуемые темы в WordPress
Наличие неактивных тем в системе — это не только лишний вес в файловой системе, но и потенциальная уязвимость. Многие темы получают обновления с патчами безопасности, но если тема не используется и её не обновляют, то это может стать лазейкой для злоумышленников.
Кроме того, удаление или отключение неиспользуемых тем помогает поддерживать порядок в админке и ускорять бэкапы и сканирование безопасности.
Автоматизация процесса отключения и удаления таких тем позволит не тратить время на ручной аудит и снизить риски.
Как определить неиспользуемые темы в WordPress
В WordPress активна только одна тема и, возможно, дочерняя тема, если используется. Остальные темы — неактивны. Их можно получить через функцию wp_get_themes(), которая возвращает объект всех установленных тем вместе с их статусом.
Для определения неиспользуемых тем нужно исключить активную тему и дочерние темы, если они есть.
Пример получения списка неиспользуемых тем в виде массивов:
function wpbloger_get_inactive_themes() {
$all_themes = wp_get_themes();
$active_theme = wp_get_theme();
$inactive_themes = [];
foreach ($all_themes as $theme_slug => $theme) {
if ($theme_slug !== $active_theme->get_stylesheet()) {
$inactive_themes[$theme_slug] = $theme;
}
}
return $inactive_themes;
}
Автоматическое отключение и удаление тем по условию
WordPress не предоставляет штатных функций для «отключения» темы, так как активна только одна тема. Но можно реализовать автоматическое удаление неиспользуемых тем, чтобы освободить место и повысить безопасность.
Для этого достаточно написать функцию, которая при срабатывании хука проверит список неактивных тем и удалит их, если они соответствуют определённым условиям (например, старше определённой даты обновления или не обновлялись долгое время).
Вот пример такого кода, который удаляет все неактивные темы, кроме стандартной темы WordPress (например, twentytwentyone), чтобы не удалять запасные:
function wpbloger_delete_inactive_themes() {
$inactive_themes = wpbloger_get_inactive_themes();
$exclude = ['twentytwentyone', 'twentytwentytwo', 'twentytwentythree']; // стандартные темы, которые не удаляем
foreach ($inactive_themes as $slug => $theme) {
if (!in_array($slug, $exclude)) {
$theme_dir = $theme->get_theme_root() . '/' . $slug;
if (is_dir($theme_dir)) {
// Удаляем тему рекурсивно
wpbloger_rrmdir($theme_dir);
}
}
}
}
function wpbloger_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)) {
wpbloger_rrmdir($path);
} else {
unlink($path);
}
}
rmdir($dir);
}
Эту функцию можно запускать вручную или подключить к крону WordPress, чтобы регулярно чистить неиспользуемые темы.
Добавление задачи в WP-Cron для регулярной очистки
Чтобы настроить автоматический запуск удаления неиспользуемых тем, добавим задачу в WP-Cron:
// Планируем событие при инициализации
add_action('wp', 'wpbloger_schedule_theme_cleanup');
function wpbloger_schedule_theme_cleanup() {
if (!wp_next_scheduled('wpbloger_daily_theme_cleanup')) {
wp_schedule_event(time(), 'daily', 'wpbloger_daily_theme_cleanup');
}
}
// Привязываем нашу функцию к событию
add_action('wpbloger_daily_theme_cleanup', 'wpbloger_delete_inactive_themes');
Теперь функция wpbloger_delete_inactive_themes будет запускаться раз в сутки, удаляя неиспользуемые темы.
Пример использования плагина Clearfy для управления темами
Если вы не хотите писать код самостоятельно, можно использовать плагин Clearfy, который содержит функции управления темами и оптимизации безопасности.
Clearfy помогает отключить неиспользуемые темы, а также удалять их, улучшая безопасность и производительность сайта. В настройках плагина можно включить автоматическую очистку тем и плагинов.
Обработка ошибок и безопасность при удалении тем
При удалении тем нужно быть осторожным. Ни в коем случае нельзя удалять активную тему или темы, от которых зависит сайт. Также стоит делать резервные копии перед массовым удалением.
В коде выше исключены стандартные темы, чтобы избежать проблем. Если у вас кастомные дочерние темы, учитывайте их в исключениях.
Также стоит логировать процесс удаления, чтобы отслеживать, какие темы были удалены, и в случае ошибки быстро восстановить их.
Пример логирования удаления темы:
function wpbloger_delete_inactive_themes() {
$inactive_themes = wpbloger_get_inactive_themes();
$exclude = ['twentytwentyone', 'twentytwentytwo', 'twentytwentythree'];
foreach ($inactive_themes as $slug => $theme) {
if (!in_array($slug, $exclude)) {
$theme_dir = $theme->get_theme_root() . '/' . $slug;
if (is_dir($theme_dir)) {
$deleted = wpbloger_rrmdir($theme_dir);
if ($deleted) {
error_log("[WPBloger] Theme deleted: $slug");
} else {
error_log("[WPBloger] Failed to delete theme: $slug");
}
}
}
}
}
function wpbloger_rrmdir($dir) {
if (!is_dir($dir)) return false;
$objects = scandir($dir);
foreach ($objects as $object) {
if ($object == "." || $object == "..") continue;
$path = $dir . DIRECTORY_SEPARATOR . $object;
if (is_dir($path)) {
wpbloger_rrmdir($path);
} else {
unlink($path);
}
}
return rmdir($dir);
}
Вывод
Автоматическое отключение неиспользуемых тем в WordPress — это эффективный способ поддерживать сайт в безопасности и порядке. С помощью простого кода и WP-Cron можно регулярно очищать сервер от устаревших тем, снижая риски и освобождая место.
Для упрощения можно использовать готовые решения, такие как плагин Clearfy, который добавит удобные инструменты для оптимизации и управления темами.