Обновление ядра всегда связано с рисками: конфликты версий Symfony, несовместимые модули, баги с jQuery. Ниже я собрал уникальный и проверенный план обновления Drupal 10 до Drupal 11, основанный на практическом опыте.
1. Подготовка
- Сделать резервную копию базы: drush sql-dump > backup.sql
- Зафиксировать composer.lock в Git.
2. Изменения в composer.json
- Обновить ядро до версии ^11.2 (core-recommended, core-composer-scaffold, core-project-message).
- Перевести Drush на диапазон ^12.4 || ^13.3 для совместимости с обоими поколениями.
3. Обновление через Composer
chmod u+w web/sites/default
composer update drush/drush drupal/core-* symfony/* --with-all-dependencies
composer drupal:scaffold4. После обновления
drush updb -y
drush cr
drush statusВ админке на странице /admin/reports/status должна появиться версия Drupal 11.2.x.
5. Чистка конфигурации
Если появляется ошибка с ключом stale_file_threshold, его нужно удалить из активного конфига:
drush cdel system.performance stale_file_threshold
drush cr6. Популярные баги после апдейта
Slick Slider может ломаться из-за того, что в jQuery 3.7 удалили функцию jQuery.type(). Решение — добавить shim в свой кастомный JS:
if (typeof jQuery.type !== "function") { jQuery.type = function (obj) { if (obj === null) return "null"; if (Array.isArray(obj)) return "array"; return typeof obj; }; }- Права на sites/default: перед обновлением — chmod u+w web/sites/default, после — chmod u-w web/sites/default.
7. Эталонный composer.json для Drupal 11
Ниже приведён рабочий пример файла composer.json, который можно использовать как основу для новых проектов.
{
"name": "drupal/recommended-project",
"description": "Project template for Drupal 11 projects with relocated web root",
"type": "project",
"license": "GPL-2.0-or-later",
"homepage": "https://www.drupal.org/project/drupal",
"support": {
"docs": "https://www.drupal.org/docs/user_guide/en/index.html",
"chat": "https://www.drupal.org/node/314178"
},
"repositories": [
{ "type": "composer", "url": "https://packages.drupal.org/8" },
{ "type": "composer", "url": "https://asset-packagist.org" }
],
"require": {
// --- Core Drupal ---
"drupal/core-recommended": "^11.2",
"drupal/core-composer-scaffold": "^11.2",
"drupal/core-project-message": "^11.2",
// --- Drush ---
// Поддержка двух веток: 12 для Drupal 10, 13 для Drupal 11
"drush/drush": "^12.4 || ^13.3",
// --- Администрирование ---
"drupal/admin_toolbar": "^3.4",
"drupal/block_class": "^4.0",
"drupal/lang_dropdown": "^2.1",
"drupal/weight": "^3.4",
// --- SEO / Метаданные ---
"drupal/pathauto": "^1.12",
"drupal/metatag": "^2.0",
"drupal/schema_metatag": "^3.0",
"drupal/redirect": "^1.9",
"drupal/robotstxt": "^1.5",
"drupal/simple_sitemap": "^4.1",
// --- Безопасность / Оптимизация ---
"drupal/antibot": "^2.0",
"drupal/minifyhtml": "^2.0",
"enshrined/svg-sanitize": "^0.18.0",
// --- Контент / Формы ---
"drupal/webform": "^6.3@beta",
"drupal/rabbit_hole": "^1.0",
"drupal/easy_breadcrumb": "^2.0",
// --- Мультимедиа / UI ---
"drupal/blazy": "^3.0",
"drupal/blazy_photoswipe": "^2.0",
"drupal/slick": "^3.0",
"drupal/slick_extras": "^2.0",
"drupal/slick_views": "^3.0",
"drupal/superfish": "^1.7",
"drupal/views_accordion": "^2.0",
"drupal/jquery_ui_accordion": "^2.1",
"drupal/photoswipe": "^5.0",
"bower-asset/slick-carousel": "^1.8",
"npm-asset/photoswipe-dynamic-caption-plugin": "^1.2",
"drupal/webp": "^1.0@RC",
"drupal/youtube": "^3.0@beta",
"drupal/image_effects": "^4.0",
// --- Cookie / Трекинг ---
"drupal/eu_cookie_compliance": "^1.24",
"drupal/google_tag": "^2.0",
// --- Бэкапы / Служебные модули ---
"drupal/backup_migrate": "^5.0",
"drupal/file_mdm": "^3.1 || ^3.2", // поддержка Drupal 10 и 11
// --- Системные утилиты ---
"wikimedia/composer-merge-plugin": "^2.1",
"oomphinc/composer-installers-extender": "^2.0",
"composer/installers": "^2.2"
},
"conflict": {
"drupal/drupal": "*"
},
"minimum-stability": "stable",
"prefer-stable": true,
"config": {
"sort-packages": true,
"allow-plugins": {
"composer/installers": true,
"drupal/core-composer-scaffold": true,
"wikimedia/composer-merge-plugin": true,
"oomphinc/composer-installers-extender": true
},
// фиксируем версию PHP, чтобы Composer не тянул пакеты под старые версии
"platform": {
"php": "8.3.0"
}
},
"scripts": {
"post-install-cmd": [
"rm -f web/robots.txt",
"rm -f web/INSTALL.txt",
"rm -f web/README.md",
"rm -f web/README.txt",
"rm -f web/example.gitignore"
],
"post-update-cmd": [
"rm -f web/robots.txt",
"rm -f web/INSTALL.txt",
"rm -f web/README.md",
"rm -f web/README.txt",
"rm -f web/example.gitignore",
"rm -f web/robots.txt"
]
},
"extra": {
"drupal-scaffold": {
"locations": { "web-root": "web/" }
},
"merge-plugin": {
"include": [
"web/modules/contrib/webform/composer.libraries.json"
]
},
"installer-types": [
"bower-asset",
"npm-asset"
],
"installer-paths": {
"web/core": ["type:drupal-core"],
"web/libraries/ckeditor/plugins/{$name}": ["vendor:ckeditor-plugin"],
"web/libraries/{$name}": [
"type:drupal-library",
"type:bower-asset",
"type:npm-asset"
],
"web/modules/contrib/{$name}": ["type:drupal-module"],
"web/profiles/contrib/{$name}": ["type:drupal-profile"],
"web/themes/contrib/{$name}": ["type:drupal-theme"],
"drush/Commands/contrib/{$name}": ["type:drupal-drush"],
"web/modules/custom/{$name}": ["type:drupal-custom-module"],
"web/themes/custom/{$name}": ["type:drupal-custom-theme"]
}
}
}Заключение
Следуя этому плану и используя предложенный composer.json, можно обновить сайт на Drupal 10 до Drupal 11 без серьёзных проблем. Чек-лист покрывает основные сложности: миграцию Symfony, замену Drush, чистку конфигураций и баги с библиотеками. Этот материал можно использовать как универсальную инструкцию для будущих апгрейдов.