В процессе разработки и поддержки сайтов на WordPress часто возникает необходимость массово управлять темами — создавать, активировать, удалять их программно. Это особенно актуально при работе с множеством сайтов или в рамках CI/CD процессов. В этой статье мы подробно рассмотрим, как автоматизировать создание и удаление тем WordPress с помощью PHP, а также покажем примеры кода и расскажем о полезных плагинах, которые помогут в этой задаче.
Почему стоит автоматизировать управление темами WordPress
Стандартный способ управления темами через админку WordPress удобен для единичных действий, но не подходит для массовой работы или интеграции с внешними системами. Автоматизация позволяет:
- Сократить время на развертывание новых сайтов с готовыми темами.
- Автоматически удалять устаревшие темы, снижая риск безопасности.
- Интегрировать управление темами в систему контроля версий и CI/CD.
- Избегать ошибок при ручном копировании и удалении файлов.
Рассмотрим, как все это реализовать с помощью PHP и встроенных функций WordPress.
Создание и активация темы программно
Создание темы программно — задача нетривиальная, поскольку тема — это набор файлов с определенной структурой. Однако часто достаточно подготовить шаблон темы, а затем копировать его с нужным названием и активировать.
Копирование шаблона темы
Для создания новой темы мы можем программно скопировать папку с шаблоном темы в директорию wp-content/themes. Вот пример функции для этого:
function wpkit_create_theme_from_template($new_theme_slug, $template_theme_slug) {
$themes_dir = get_theme_root();
$source = $themes_dir . '/' . $template_theme_slug;
$destination = $themes_dir . '/' . $new_theme_slug;
if (!file_exists($source)) {
return new WP_Error('template_not_found', 'Исходная тема не найдена');
}
if (file_exists($destination)) {
return new WP_Error('theme_exists', 'Тема с таким именем уже существует');
}
// Рекурсивное копирование папки
$copy = wpkit_recursive_copy($source, $destination);
if (!$copy) {
return new WP_Error('copy_failed', 'Не удалось скопировать тему');
}
return true;
}
function wpkit_recursive_copy($src, $dst) {
$dir = opendir($src);
@mkdir($dst);
while(false !== ($file = readdir($dir))) {
if (($file != '.') && ($file != '..')) {
if (is_dir($src . '/' . $file)) {
wpkit_recursive_copy($src . '/' . $file, $dst . '/' . $file);
} else {
copy($src . '/' . $file, $dst . '/' . $file);
}
}
}
closedir($dir);
return true;
}Данная функция копирует структуру темы и все файлы. После копирования нужно изменить в style.css темы заголовок темы (Theme Name), чтобы WordPress распознал её как отдельную.
Изменение заголовка темы
Для этого можно прочитать style.css новой темы, заменить строку с Theme Name и записать обратно:
function wpkit_update_theme_header($theme_slug, $new_theme_name) {
$theme_dir = get_theme_root() . '/' . $theme_slug;
$style_css = $theme_dir . '/style.css';
if (!file_exists($style_css)) {
return new WP_Error('style_not_found', 'Файл style.css не найден');
}
$content = file_get_contents($style_css);
$content = preg_replace('/(Theme Name:\s*)(.*)/i', '$1' . $new_theme_name, $content);
file_put_contents($style_css, $content);
return true;
}Таким образом, вы можете создавать новые темы на базе шаблона и задавать им уникальные имена.
Активация темы через код
Для активации темы в WordPress используется функция switch_theme():
function wpkit_activate_theme($theme_slug) {
switch_theme($theme_slug);
}Важно, чтобы тема была корректно распознана WordPress — то есть содержала обязательный файл style.css с валидным заголовком.
Удаление темы программно
Удаление темы в WordPress можно выполнить через функцию delete_theme(), которая появляетcя в WordPress начиная с версии 4.3. Она удаляет файлы темы из файловой системы.
function wpkit_delete_theme_by_slug($theme_slug) {
$theme = wp_get_theme($theme_slug);
if (!$theme->exists()) {
return new WP_Error('theme_not_found', 'Тема не найдена');
}
if ($theme->get_stylesheet() === get_stylesheet()) {
return new WP_Error('active_theme', 'Нельзя удалить активную тему');
}
$deleted = delete_theme($theme_slug);
if (is_wp_error($deleted)) {
return $deleted;
}
return true;
}Перед удалением важно проверить, что тема не активна, иначе WordPress откажется её удалять.
Примеры практического использования
Автоматическое создание темы с уникальным названием
Предположим, надо создать копию темы reboot с названием reboot-child-123 и активировать её:
$result = wpkit_create_theme_from_template('reboot-child-123', 'reboot');
if (is_wp_error($result)) {
echo 'Ошибка создания темы: ' . $result->get_error_message();
return;
}
wpkit_update_theme_header('reboot-child-123', 'Reboot Child 123');
wpkit_activate_theme('reboot-child-123');
echo 'Тема создана и активирована успешно.';Удаление неиспользуемых тем
Для безопасности полезно периодически удалять неиспользуемые темы. Можно реализовать функцию, которая удалит все темы, кроме активной и списка исключений:
function wpkit_delete_unused_themes($exclude = []) {
$current = get_stylesheet();
$themes = wp_get_themes();
foreach ($themes as $slug => $theme) {
if ($slug === $current) continue;
if (in_array($slug, $exclude)) continue;
$res = delete_theme($slug);
if (is_wp_error($res)) {
error_log('Ошибка удаления темы ' . $slug . ': ' . $res->get_error_message());
} else {
error_log('Тема удалена: ' . $slug);
}
}
}
// Использование:
wpkit_delete_unused_themes(['reboot']);Полезные плагины для управления темами
Помимо собственных скриптов, можно использовать плагины, облегчающие работу с темами:
- WP Reset — позволяет быстро сбрасывать сайт, управлять темами и плагинами, удобно для разработки.
- Theme Switcha — позволяет переключать темы для разных ролей или устройств, удобно для тестирования.
- Child Theme Configurator — поможет создавать и настраивать дочерние темы без ручного копирования файлов.
Ссылки на плагины и дополнительные инструменты можно найти на WPShop.ru.
Резюме и рекомендации
Автоматизация управления темами через код — мощный инструмент для разработчиков и системных администраторов WordPress-сайтов. Используйте функции копирования, изменения заголовков и активации тем для масштабируемой работы. Не забывайте про безопасность — удаляйте неиспользуемые темы, чтобы уменьшить поверхность атаки. Для упрощения рутинных задач подключайте проверенные плагины.
Такой подход значительно ускорит процессы разработки и поддержки сайтов на WordPress, особенно при работе с большим количеством ресурсов.