{"id":88925,"date":"2026-01-23T22:43:24","date_gmt":"2026-01-24T03:43:24","guid":{"rendered":"https:\/\/litextension.com\/blog\/?p=88925"},"modified":"2026-01-27T03:05:35","modified_gmt":"2026-01-27T08:05:35","slug":"drupal-upgrade","status":"publish","type":"post","link":"https:\/\/litextension.com\/blog\/drupal-upgrade\/","title":{"rendered":"Drupal Upgrade: The Step-by-Step Guide to Stay Updated (2026)"},"content":{"rendered":"<p>As new versions of Drupal continue to evolve, each upgrade introduces valuable improvements in performance, accessibility, and security. Therefore, understanding how to perform a proper <em><strong>Drupal upgrade<\/strong><\/em> will be a critical step, helping you avoid downtime, data loss, outdated security support, or compatibility issues.<\/p>\n<p>In this guide, we'll walk you through the entire process of Drupal upgrade to the latest version, including:<\/p>\n<ul>\n<li><a href=\"https:\/\/litextension.com\/blog\/drupal-upgrade\/#how-to-upgrade-from-drupal-10-to-11\">Upgrade from Drupal 10 to 11<\/a><\/li>\n<li><a href=\"https:\/\/litextension.com\/blog\/drupal-upgrade\/#how-to-upgrade-from-drupal-9-to-10\">Upgrade from Drupal 9 to 10<\/a><\/li>\n<li><a href=\"https:\/\/litextension.com\/blog\/drupal-upgrade\/#how-to-upgrade-from-legacy-drupal-versions\">Upgrade from legacy Drupal version<\/a><\/li>\n<li><a href=\"https:\/\/litextension.com\/blog\/drupal-upgrade\/#best-practices-for-a-smooth-drupal-upgrade\">Best practices for a smooth updating process<\/a><\/li>\n<\/ul>\n<p>Without further delay, let's get started!<\/p>\n<hr \/>\n<h2>How to Upgrade from Drupal 10 to 11<\/h2>\n<h3>#Step 1. Check for Drupal 11 requirements<\/h3>\n<h4>Confirm your hosting environment<\/h4>\n<p>Make sure your server environment supports Drupal 11, including the correct versions of PHP, Composer, and your database. You can find the full list of prerequisites in the <a href=\"https:\/\/www.drupal.org\/docs\/system-requirements\" target=\"_blank\" rel=\"nofollow noopener\">Drupal 11 platform requirements<\/a>.<\/p>\n<h4>Update your site to Drupal 10.3+<\/h4>\n<p>If your site is running on Drupal 10.2.x or earlier, you must first update to Drupal 10.3.0 or later. This is required because older updates and some core modules\/themes were removed and replaced with contributed alternatives.<\/p>\n<h4>Manage altered scaffold files<\/h4>\n<p>If you\u2019ve modified core scaffold files like .htaccess, make sure you document those changes before upgrading. After the upgrade, review and reapply your customizations where necessary.<\/p>\n<h4>Resolve deprecated core modules and themes<\/h4>\n<p>You should either stop using them in Drupal 10 before upgrading or install the contributed versions of those modules before performing the upgrade.<\/p>\n<p>By meeting these requirements in advance, you\u2019ll avoid common blockers and make the Drupal upgrade to 11 more efficient and reliable.<\/p>\n<h3>#Step 2. Update contributed modules and projects<\/h3>\n<h4>Check module compatibility with Upgrade Status<\/h4>\n<p>Use the Upgrade Status module to scan your site and identify contributed modules or projects that are not yet compatible with Drupal 11. This report helps you understand which modules need updates, patches, or manual review.<\/p>\n<h4>Update contributed modules using Composer<\/h4>\n<p>Update each contributed module to its latest Drupal 11- compatible version. The recommended approach is to use <code>composer require<\/code> instead of <code>composer update<\/code>, because this method ignores existing version constraints defined in <code>composer.json<\/code> and pulls the newest compatible release.<\/p>\n<h4>Re-run Upgrade Status after each update<\/h4>\n<p>Alternate between updating modules via Composer and re-running the Upgrade Status report. This process helps you confirm that all contributed modules gradually become compatible with Drupal 11.<\/p>\n<h4>Manually review modules flagged as incompatible<\/h4>\n<p>If Upgrade Status reports modules that still need maintainer support, manually check their project pages on Drupal.org. In some cases, Drupal 11\u2013compatible releases already exist but are not automatically detected by the report.<\/p>\n<h4>Apply patches when necessary<\/h4>\n<p>If no official Drupal 11 release is available, check the module\u2019s issue queue for compatibility patches. Applying a patch can temporarily resolve the issue, although Composer will not automatically recognize locally patched version constraints.<\/p>\n<h4>Coordinate with maintainers if no solution exists<\/h4>\n<p>If a module has no compatible release or patch, consider cooperating with the module maintainers or reviewing their Drupal 11 plans. Many key modules publish compatibility roadmaps or guidance in advance.<\/p>\n<h4>Handle modules that are Drupal 11-only<\/h4>\n<p>Some modules may already support Drupal 11 but still need to remain compatible with Drupal 10 during the upgrade process. In this case, update your <code>composer.json<\/code> file to allow multiple version constraints, which simplifies dependency resolution and avoids conflicts during the Drupal upgrade.<\/p>\n<h3>#Step 3. Update custom modules and themes<\/h3>\n<h4>Identify deprecated code in custom modules and themes<\/h4>\n<p>Review your custom codebase to find APIs and functions that were deprecated in Drupal 10 and fully removed in Drupal 11. Leaving this code unchanged can cause fatal errors during the upgrade.<\/p>\n<h4>Use Upgrade Status and Drupal Rector<\/h4>\n<p>Run the Upgrade Status module to scan your custom modules and themes for Drupal 11 compatibility issues. Then, use Drupal Rector to automatically refactor deprecated code where possible, which helps speed up the remediation process.<\/p>\n<h4>Uninstall Upgrade Status (optional)<\/h4>\n<p>Once Upgrade Status confirms compatibility, you may uninstall and remove the module from your project. This step is optional, as Upgrade Status is now compatible with Drupal 11.<\/p>\n<h4>Consider Drush removal before upgrade (optional)<\/h4>\n<p>Some teams choose to temporarily remove Drush before upgrading core to avoid potential conflicts. If you follow this approach, remember that you will need alternative methods to perform tasks normally handled by Drush until it is reinstalled after the upgrade.<\/p>\n<h3>#Step 4. Run the Drupal upgrade from 10 to 11<\/h3>\n<p>Once your environment, contributed modules, and custom code are ready, you can proceed with the Drupal upgrade to version 11. You should run all commands from your Drupal project root, where the <code>composer.json<\/code> file is located.<\/p>\n<ul>\n<li>Temporarily grant write access to protected files and directories using the following command line. This step allows Composer and Drupal to update scaffold files during the upgrade.<\/li>\n<\/ul>\n<p style=\"padding-left: 40px;\"><code>chmod 777 web\/sites\/default<\/code><br \/>\n<code>chmod 666 web\/sites\/default\/*settings.php<\/code><br \/>\n<code>chmod 666 web\/sites\/default\/*services.yml<\/code><\/p>\n<ul>\n<li>Update Drupal core packages to Drupal 11 (without installing yet) to avoid dependency conflicts during version resolution.<\/li>\n<\/ul>\n<p style=\"padding-left: 40px;\"><code>composer require 'drupal\/core-recommended:^11' \\<\/code><br \/>\n<code>'drupal\/core-composer-scaffold:^11' \\<\/code><br \/>\n<code>'drupal\/core-project-message:^11' --no-update<\/code><\/p>\n<ul>\n<li>Remove a separate drupal\/core requirement if it exists:<\/li>\n<\/ul>\n<p style=\"padding-left: 40px;\"><code>composer remove drupal\/core --no-update<\/code><\/p>\n<ul>\n<li>Update drupal\/core-dev if it is installed:<\/li>\n<\/ul>\n<p style=\"padding-left: 40px;\"><code>composer require 'drupal\/core-dev:^11' --dev --no-update<\/code><\/p>\n<ul>\n<li>Update Drush to a Drupal 11\u2013compatible version (if installed):<\/li>\n<\/ul>\n<p style=\"padding-left: 40px;\"><code>composer require 'drush\/drush:^13' --no-update<\/code><\/p>\n<ul>\n<li>Test the update process with a dry run:<\/li>\n<\/ul>\n<p style=\"padding-left: 40px;\"><code>composer update --dry-run<\/code><\/p>\n<ul>\n<li>Perform the actual update once the dry run completes without errors:<\/li>\n<\/ul>\n<p style=\"padding-left: 40px;\"><code>composer update<\/code><\/p>\n<ul>\n<li>Verify the installation process to ensure that other developers or deployment pipelines will not face issues. If everything is correct, Composer will report no errors and display the message \u201cNothing to install, update or remove.\u201d<\/li>\n<\/ul>\n<p style=\"padding-left: 40px;\"><code>composer install<\/code><\/p>\n<ul>\n<li>Run database updates after updating the codebase:<\/li>\n<\/ul>\n<p style=\"padding-left: 40px;\"><code>drush updatedb:status<\/code><br \/>\n<code>drush updatedb<\/code><\/p>\n<p style=\"padding-left: 40px;\">If errors occur, resolve them and rerun <code>drush updatedb<\/code> until all updates are completed successfully.<\/p>\n<ul>\n<li>Restore read-only permissions once the Drupal upgrade finishes:<\/li>\n<\/ul>\n<p style=\"padding-left: 40px;\"><code>chmod 755 web\/sites\/default<\/code><br \/>\n<code>chmod 644 web\/sites\/default\/*settings.php<\/code><br \/>\n<code>chmod 644 web\/sites\/default\/*services.yml<\/code><\/p>\n<h3>#Step 5. Run post Drupal upgrade tasks<\/h3>\n<h4>1. Export and review configuration<\/h4>\n<p>After completing the Drupal upgrade, you should export and commit your configuration if you use configuration management. Core updates can reorder YAML files or override settings during database updates. Before committing changes, run a <code>git diff<\/code> to confirm that no critical functionality is affected.<\/p>\n<h4>2. Run PHPCS to align coding standards<\/h4>\n<p>If your project uses PHPCS, you should run it after the upgrade because Drupal coding standards may have changed. Apply automated fixes where possible and review remaining warnings manually to keep your codebase consistent.<\/p>\n<h4>3. Run automated tests<\/h4>\n<p>If your site includes custom tests such as PHPUnit or Behat, you should run them to confirm that core functionality still works as expected. This step helps detect hidden issues early.<\/p>\n<h4>4. Manually test site functionality<\/h4>\n<p>You should manually test key pages, forms, and user flows in the browser. While testing, monitor the Drupal watchdog log to catch errors or warnings in real time: <code>drush watchdog:tail<\/code><\/p>\n<h4>5. Check for errors via database updates and cron<\/h4>\n<p>Some issues only appear when database updates or background tasks run. You should execute pending database updates and cron jobs to surface these problems: <code>drush updatedb -y<\/code><\/p>\n<h3>#Step 6. Resolve common issues<\/h3>\n<p>During a Drupal upgrade from 10 to 11, Composer-related errors are common, especially on complex projects with many dependencies. The table below summarizes the most frequent issues and how to resolve them effectively.<\/p>\n<div class=\"wptb-table-container wptb-table-88929\"><div class=\"wptb-table-container-matrix\" id=\"wptb-table-id-88929\" data-wptb-version=\"1.4.10\" data-wptb-pro-status=\"false\"><table class=\"wptb-preview-table wptb-element-main-table_setting-88929\" data-reconstraction=\"0\" style=\"border: 1px solid rgb(209, 209, 209);\" data-wptb-table-tds-sum-max-width=\"554\" data-wptb-cells-width-auto-count=\"2\" data-wptb-horizontal-scroll-status=\"false\" data-wptb-extra-styles=\"LyogRW50ZXIgeW91ciBjdXN0b20gQ1NTIHJ1bGVzIGhlcmUgKi8=\" role=\"table\" data-table-columns=\"3\"><tbody><tr class=\"wptb-row\"><td class=\"wptb-cell\" data-y-index=\"0\" data-x-index=\"0\" style=\"border: 1px solid rgb(209, 209, 209);\" data-wptb-css-td-auto-width=\"true\"><div class=\"wptb-text-container wptb-ph-element wptb-element-text-597\" style=\"color: rgb(0, 0, 0); font-size: 15px;\"><div class=\"\" style=\"position: relative;\"><p style=\"text-align: center;\"><strong>Problem<\/strong><\/p><\/div><\/div><\/td><td class=\"wptb-cell\" data-y-index=\"0\" data-x-index=\"1\" style=\"border: 1px solid rgb(209, 209, 209);\" data-wptb-css-td-auto-width=\"true\"><div class=\"wptb-text-container wptb-ph-element wptb-element-text-598\" style=\"color: rgb(0, 0, 0); font-size: 15px;\"><div class=\"\" style=\"position: relative;\"><p style=\"text-align: center;\"><strong>Cause<\/strong><\/p><\/div><\/div><\/td><td class=\"wptb-cell\" data-y-index=\"0\" data-x-index=\"2\" style=\"border: 1px solid rgb(209, 209, 209); width: 260px;\"><div class=\"wptb-text-container wptb-ph-element wptb-element-text-599\" style=\"color: rgb(0, 0, 0); font-size: 15px;\"><div class=\"\" style=\"position: relative;\"><p style=\"text-align: center;\"><strong>Solution<\/strong><\/p><\/div><\/div><\/td><\/tr><tr class=\"wptb-row\" style=\"--hover-bg-color: undefined;\"><td class=\"wptb-cell\" data-y-index=\"1\" data-x-index=\"0\" style=\"border: 1px solid rgb(209, 209, 209);\" data-wptb-css-td-auto-width=\"true\" colspan=\"1\" rowspan=\"4\"><div class=\"wptb-text-container wptb-ph-element wptb-element-text-600\" style=\"color: rgb(0, 0, 0); font-size: 15px;\"><div class=\"\" style=\"position: relative;\"><p>Your requirements could not be resolved to an installable set of packages<\/p><\/div><\/div><\/td><td class=\"wptb-cell\" data-y-index=\"1\" data-x-index=\"1\" style=\"border: 1px solid rgb(209, 209, 209);\" data-wptb-css-td-auto-width=\"true\"><div class=\"wptb-text-container wptb-ph-element wptb-element-text-601\" style=\"color: rgb(0, 0, 0); font-size: 15px;\"><div class=\"\" style=\"position: relative;\"><p>One or more dependencies are not compatible with Drupal 11, or existing version constraints in composer.json block the upgrade.<\/p><\/div><\/div><\/td><td class=\"wptb-cell\" data-y-index=\"1\" data-x-index=\"2\" style=\"border: 1px solid rgb(209, 209, 209); width: 260px;\"><div class=\"wptb-text-container wptb-ph-element wptb-element-text-602\" style=\"color: rgb(0, 0, 0); font-size: 15px;\"><div class=\"\" style=\"position: relative;\"><p>Re-require all direct dependencies to reset version constraints:<\/p><\/div><\/div><div class=\"wptb-custom_html-container wptb-ph-element wptb-element-custom_html-1\"><div class=\"wptb-custom-html-wrapper\" data-wptb-new-element=\"1\" style=\"position: relative;\"><code>composer show --no-dev --direct --name-only | xargs composer require --no-update<\/code><\/div><\/div><div class=\"wptb-text-container wptb-ph-element wptb-element-text-609\" style=\"color: rgb(0, 0, 0); font-size: 15px;\"><div class=\"\" style=\"position: relative;\"><p>Then run a dry update again.<\/p><\/div><\/div><\/td><\/tr><tr class=\"wptb-row\" style=\"--hover-bg-color: undefined;\"><td class=\"wptb-cell\" data-y-index=\"2\" data-x-index=\"1\" style=\"border: 1px solid rgb(209, 209, 209);\" data-wptb-css-td-auto-width=\"true\"><div class=\"wptb-text-container wptb-ph-element wptb-element-text-604 wptb-ondragenter\" style=\"color: rgb(0, 0, 0); font-size: 15px;\"><div class=\"\" style=\"position: relative;\"><p>Some dependencies only support Drupal 11 via RC or alpha releases.<\/p><\/div><\/div><\/td><td class=\"wptb-cell\" data-y-index=\"2\" data-x-index=\"2\" style=\"border: 1px solid rgb(209, 209, 209); width: 260px;\"><div class=\"wptb-text-container wptb-ph-element wptb-element-text-605\" style=\"color: rgb(0, 0, 0); font-size: 15px;\"><div class=\"\" style=\"position: relative;\"><p>Identify those dependencies and explicitly allow RC or alpha versions (for example, @RC or @alpha). Then re-run Composer with dependencies:<\/p><\/div><\/div><div class=\"wptb-custom_html-container wptb-ph-element wptb-element-custom_html-2\"><div class=\"wptb-custom-html-wrapper\" data-wptb-new-element=\"1\" style=\"position: relative;\"><code>composer require --update-with-dependencies<\/code><\/div><\/div><\/td><\/tr><tr class=\"wptb-row\" style=\"--hover-bg-color: undefined;\"><td class=\"wptb-cell\" style=\"border: 1px solid rgb(209, 209, 209);\" data-x-index=\"1\" data-y-index=\"3\" data-wptb-css-td-auto-width=\"true\"><div class=\"wptb-text-container wptb-ph-element wptb-element-text-617 wptb-ondragenter\" style=\"color: rgb(0, 0, 0); font-size: 15px;\"><div class=\"\" style=\"position: relative;\"><p>A specific module version blocks the upgrade.<\/p><\/div><\/div><\/td><td class=\"wptb-cell\" style=\"border: 1px solid rgb(209, 209, 209); width: 260px;\" data-x-index=\"2\" data-y-index=\"3\"><div class=\"wptb-text-container wptb-ph-element wptb-element-text-618\" style=\"color: rgb(0, 0, 0); font-size: 15px;\"><div class=\"\" style=\"position: relative;\"><p>Check the module&rsquo;s project page on Drupal.org and explicitly require a Drupal 11&ndash;compatible version:<\/p><\/div><grammarly-extension data-grammarly-shadow-root=\"true\" class=\"dnXmp\" style=\"position: absolute; top: -1px; left: -1px; pointer-events: none; z-index: auto; --rem: 16;\"><\/grammarly-extension><grammarly-extension data-grammarly-shadow-root=\"true\" class=\"dnXmp\" style=\"position: absolute; top: -1px; left: -1px; pointer-events: none; z-index: auto; --rem: 16;\"><\/grammarly-extension><\/div><div class=\"wptb-custom_html-container wptb-ph-element wptb-element-custom_html-3 wptb-ondragenter\"><div class=\"wptb-custom-html-wrapper\" data-wptb-new-element=\"1\" style=\"position: relative;\"><code>Composer require drupal\/MODULE_NAME:^2.0.0-rc1 --no-update<\/code><\/div><grammarly-extension data-grammarly-shadow-root=\"true\" class=\"dnXmp\" style=\"position: absolute; top: -1px; left: -1px; pointer-events: none; z-index: auto; --rem: 16;\"><\/grammarly-extension><grammarly-extension data-grammarly-shadow-root=\"true\" class=\"dnXmp\" style=\"position: absolute; top: -1px; left: -1px; pointer-events: none; z-index: auto; --rem: 16;\"><\/grammarly-extension><\/div><\/td><\/tr><tr class=\"wptb-row\" style=\"--hover-bg-color: undefined;\"><td class=\"wptb-cell\" style=\"border: 1px solid rgb(209, 209, 209);\" data-x-index=\"1\" data-y-index=\"4\" data-wptb-css-td-auto-width=\"true\"><div class=\"wptb-text-container wptb-ph-element wptb-element-text-614\" style=\"color: rgb(0, 0, 0); font-size: 15px;\"><div class=\"\" style=\"position: relative;\"><p>You need to identify what blocks Drupal 11 core.<\/p><\/div><\/div><\/td><td class=\"wptb-cell\" style=\"border: 1px solid rgb(209, 209, 209); width: 260px;\" data-x-index=\"2\" data-y-index=\"4\"><div class=\"wptb-text-container wptb-ph-element wptb-element-text-615 wptb-ondragenter\" style=\"color: rgb(0, 0, 0); font-size: 15px;\"><div class=\"\" style=\"position: relative;\"><p>Run the following command to see all blocking dependencies:<br><\/p><\/div><\/div><div class=\"wptb-custom_html-container wptb-ph-element wptb-element-custom_html-4\"><div class=\"wptb-custom-html-wrapper\" data-wptb-new-element=\"1\" style=\"position: relative;\"><code>composer why-not drupal\/core ^11<\/code><\/div><\/div><\/td><\/tr><tr class=\"wptb-row\" style=\"--hover-bg-color: undefined;\"><td class=\"wptb-cell\" style=\"border: 1px solid rgb(209, 209, 209);\" data-x-index=\"0\" data-y-index=\"5\" data-wptb-css-td-auto-width=\"true\"><div class=\"wptb-text-container wptb-ph-element wptb-element-text-610\" style=\"color: rgb(0, 0, 0); font-size: 15px;\"><div class=\"\" style=\"position: relative;\"><p>Composer patches do not reapply<\/p><\/div><\/div><\/td><td class=\"wptb-cell\" style=\"border: 1px solid rgb(209, 209, 209);\" data-x-index=\"1\" data-y-index=\"5\" data-wptb-css-td-auto-width=\"true\"><div class=\"wptb-text-container wptb-ph-element wptb-element-text-611\" style=\"color: rgb(0, 0, 0); font-size: 15px;\"><div class=\"\" style=\"position: relative;\"><p>Existing patches no longer apply to Drupal 11 or have already been committed upstream.<\/p><\/div><\/div><\/td><td class=\"wptb-cell\" style=\"border: 1px solid rgb(209, 209, 209); width: 260px;\" data-x-index=\"2\" data-y-index=\"5\"><div class=\"wptb-text-container wptb-ph-element wptb-element-text-619 edit-active\" style=\"color: rgb(0, 0, 0); font-size: 15px;\"><div class=\"\" style=\"position: relative;\"><p>Remove obsolete patches from composer.json. If a newer patch exists for Drupal 11, replace the patch link in composer.json and rerun the update.<\/p><\/div><grammarly-extension data-grammarly-shadow-root=\"true\" class=\"dnXmp\" style=\"position: absolute; top: -1px; left: -1px; pointer-events: none; z-index: auto; --rem: 16;\"><\/grammarly-extension><grammarly-extension data-grammarly-shadow-root=\"true\" class=\"dnXmp\" style=\"position: absolute; top: -1px; left: -1px; pointer-events: none; z-index: auto; --rem: 16;\"><\/grammarly-extension><\/div><\/td><\/tr><tr class=\"wptb-row\" style=\"--hover-bg-color: undefined;\"><td class=\"wptb-cell\" data-y-index=\"6\" data-x-index=\"0\" style=\"border: 1px solid rgb(209, 209, 209);\" data-wptb-css-td-auto-width=\"true\"><div class=\"wptb-text-container wptb-ph-element wptb-element-text-606\" style=\"color: rgb(0, 0, 0); font-size: 15px;\"><div class=\"\" style=\"position: relative;\"><p>Lock file is not up to date with the latest changes<\/p><\/div><\/div><\/td><td class=\"wptb-cell\" data-y-index=\"6\" data-x-index=\"1\" style=\"border: 1px solid rgb(209, 209, 209);\" data-wptb-css-td-auto-width=\"true\"><div class=\"wptb-text-container wptb-ph-element wptb-element-text-607\" style=\"color: rgb(0, 0, 0); font-size: 15px;\"><div class=\"\" style=\"position: relative;\"><p>The composer.lock file does not match the current composer.json.<\/p><\/div><\/div><\/td><td class=\"wptb-cell\" data-y-index=\"6\" data-x-index=\"2\" style=\"border: 1px solid rgb(209, 209, 209); width: 260px;\"><div class=\"wptb-text-container wptb-ph-element wptb-element-text-608\" style=\"color: rgb(0, 0, 0); font-size: 15px;\"><div class=\"\" style=\"position: relative;\"><p>Delete the lock file and vendor directory, then rerun Composer:<\/p><\/div><\/div><div class=\"wptb-custom_html-container wptb-ph-element wptb-element-custom_html-6\"><div class=\"wptb-custom-html-wrapper\" data-wptb-new-element=\"1\" style=\"position: relative;\"><code>rm composer.lock<br>rm -rf vendor<br>composer update<\/code><\/div><grammarly-extension data-grammarly-shadow-root=\"true\" class=\"dnXmp\" style=\"position: absolute; top: -1px; left: -1px; pointer-events: none; z-index: auto; --rem: 16;\"><\/grammarly-extension><grammarly-extension data-grammarly-shadow-root=\"true\" class=\"dnXmp\" style=\"position: absolute; top: -1px; left: -1px; pointer-events: none; z-index: auto; --rem: 16;\"><\/grammarly-extension><\/div><\/td><\/tr><\/tbody><\/table>\n<\/div><\/div>\n\n<hr \/>\n<h2>How to Upgrade from Drupal 9 to 10<\/h2>\n<p>Since Drupal 9 reached its <a href=\"https:\/\/www.drupal.org\/about\/announcements\/blog\/drupal-9-is-end-of-life\" target=\"_blank\" rel=\"nofollow noopener\">end-of-life in November 2023<\/a>, it's important to update your site to version 10 to stay supported. In the following sections, we\u2019ll guide you through each step of the Drupal upgrade from 9 to 10 process so you can complete the transition confidently and without disruption.<\/p>\n<h3>#Step 1. Check Drupal 10 requirements<\/h3>\n<p>Before starting the Drupal upgrade from 9 to 10, you need to confirm that your site and server environment meet all Drupal 10 requirements. Preparing these elements early helps avoid upgrade blockers and unexpected errors.<\/p>\n<h4>Confirm the hosting environment<\/h4>\n<p>Your hosting environment must meet the <a href=\"https:\/\/www.drupal.org\/docs\/getting-started\/system-requirements\" target=\"_blank\" rel=\"nofollow noopener\">Drupal 10 platform requirements<\/a>, including supported PHP, database, and server configurations.<\/p>\n<h4>Update your site to Drupal 9.4 or 9.5<\/h4>\n<p>Your website must run on Drupal 9.4.x or 9.5.x before upgrading to Drupal 10. Earlier Drupal 9 versions are not supported for a direct upgrade.<\/p>\n<p>Review removed modules and themes: Some modules and themes may have been removed in Drupal 9 minor releases. If this happens, you should replace them with the appropriate contributed projects before continuing.<\/p>\n<h4>Manage altered scaffold files<\/h4>\n<p>Core files such as <code>.htaccess<\/code> will change during the Drupal 9 to 10 upgrade. If you modified any scaffold files, you should document those changes and reapply them after upgrading. Drupal 10 introduces important CSS, JavaScript aggregation improvements, and updated <code>.htaccess<\/code> rules.<\/p>\n<h4>Resolve deprecated core modules and themes<\/h4>\n<p>Several Drupal core modules and themes deprecated in Drupal 9 are removed in Drupal 10. This includes the Seven admin theme and CKEditor 4. You should either stop using deprecated extensions in Drupal 9 or install the contributed versions of these extensions before running database updates.<\/p>\n<h3>#Step 2. Update contributed modules and projects<\/h3>\n<p>To ensure a smooth Drupal upgrade from 9 to 10, all contributed modules and projects must be compatible with Drupal 10 while still functioning on your Drupal 9.4+ site.<\/p>\n<ul>\n<li>Check compatibility using Upgrade Status: Use the Upgrade Status<br \/>\nmodule to scan your contributed modules. Alternate between running the scan and updating modules until all projects are listed as Drupal 10 compatible.<\/li>\n<li>Update modules using Composer: Use composer require instead of composer update to bypass version constraints and install the latest compatible version:<\/li>\n<\/ul>\n<p style=\"padding-left: 40px;\"><code>composer require drupal\/webform:^6.2 --no-update<\/code><\/p>\n<ul>\n<li>Handle Drupal 10\u2013only modules: Some modules are only compatible with Drupal 10. In this case, modify your <code>composer.json<\/code> file to allow compatibility with both versions using Composer\u2019s logical OR operator. For example:<\/li>\n<\/ul>\n<p style=\"padding-left: 40px;\"><code>\"drupal\/remove_http_headers\": \"^1.0 || ^2.0\"<\/code><\/p>\n<ul>\n<li>Remove incompatible tools (Drupal Console) as it's not Drupal 10 compatible:<\/li>\n<\/ul>\n<p style=\"padding-left: 40px;\"><code>composer remove drupal\/console --no-update<\/code><\/p>\n<ul>\n<li>Uninstall Upgrade Status after validation (optional):<\/li>\n<\/ul>\n<p style=\"padding-left: 40px;\"><code>drush pm:uninstall upgrade_status -y<\/code><br \/>\n<code>composer remove drupal\/upgrade_status --no-update<\/code><\/p>\n<ul>\n<li>Remove Drush before upgrade (optional): You can remove Drush temporarily before the upgrade to avoid version conflicts between Drush and core packages.<\/li>\n<\/ul>\n<h3>#Step 3. Update custom modules and themes<\/h3>\n<p>Before running the Drupal upgrade from 9 to 10, you must update all custom modules and themes to remove deprecated code that is no longer supported in Drupal 10. This step is essential to avoid fatal errors during the core Drupal upgrade.<\/p>\n<ul>\n<li>Check custom code compatibility with Upgrade Status: On the report page, run a scan under the \u201cFix manually\u201d section to identify deprecated APIs and suggested replacements.<\/li>\n<li>Automatically replace deprecated code with Drupal Rector: After installing Drupal Rector according to its GitHub documentation, preview the proposed changes by running it in dry-run mode:<\/li>\n<\/ul>\n<p style=\"padding-left: 40px;\"><code>vendor\/bin\/rector process docroot\/modules\/custom --dry-run<\/code><\/p>\n<ul>\n<li>If the preview looks correct, apply the changes by running the same command without the &#8211;dry-run flag:<\/li>\n<\/ul>\n<p style=\"padding-left: 40px;\"><code>vendor\/bin\/rector process docroot\/modules\/custom<\/code><\/p>\n<ul>\n<li>Rerun Upgrade Status and apply manual fixes: After running Drupal Rector, rerun the Upgrade Status report to verify progress. Although the number of issues should be reduced, some deprecated code may still require manual updates.<\/li>\n<li>Uninstall Upgrade Status and Drupal Rector when complete:<\/li>\n<\/ul>\n<p style=\"padding-left: 40px;\"><code>drush pm:uninstall upgrade_status -y<\/code><br \/>\n<code>rm rector.php<\/code><br \/>\n<code>composer remove palantirnet\/drupal-rector drupal\/upgrade_status --no-update<\/code><\/p>\n<h3>#Step 4. Perform the Drupal upgrade from 9 to 10<\/h3>\n<p>After preparing your environment, contributed modules, and custom code, you can proceed with the Drupal upgrade from 9 to 10. You should run all commands from your Drupal project root, where the <code>composer.json<\/code> file is located.<\/p>\n<ul>\n<li>Temporarily grant write access to protected files and directories:<\/li>\n<\/ul>\n<p style=\"padding-left: 40px;\"><code>chmod 777 web\/sites\/default<\/code><br \/>\n<code>chmod 666 web\/sites\/default\/*settings.php<\/code><br \/>\n<code>chmod 666 web\/sites\/default\/*services.yml<\/code><\/p>\n<ul>\n<li>Update Drupal core packages to Drupal 10 (without installing yet):<\/li>\n<\/ul>\n<p style=\"padding-left: 40px;\"><code>composer require 'drupal\/core-recommended:^10' \\<\/code><br \/>\n<code>'drupal\/core-composer-scaffold:^10' \\<\/code><br \/>\n<code>'drupal\/core-project-message:^10' --no-update<\/code><\/p>\n<ul>\n<li>Remove a separate drupal\/core requirement if it exists:<\/li>\n<\/ul>\n<p style=\"padding-left: 40px;\"><code>composer remove drupal\/core --no-update<\/code><\/p>\n<ul>\n<li>Update drupal\/core-dev if it is installed:<\/li>\n<\/ul>\n<p style=\"padding-left: 40px;\"><code>composer require 'drupal\/core-dev:^10' --dev --no-update<\/code><\/p>\n<ul>\n<li>Update Drush to a Drupal 10\u2013compatible version (if installed):<\/li>\n<\/ul>\n<p style=\"padding-left: 40px;\"><code>composer require 'drush\/drush:^12' --no-update<\/code><\/p>\n<ul>\n<li>Test the update process using a dry run:<\/li>\n<\/ul>\n<p style=\"padding-left: 40px;\"><code>composer update --dry-run<\/code><\/p>\n<ul>\n<li>Perform the actual update once the dry run completes:<\/li>\n<\/ul>\n<p style=\"padding-left: 40px;\"><code>composer update<\/code><\/p>\n<ul>\n<li>Verify the installation process to ensure other developers and deployment pipelines can install dependencies without errors:<\/li>\n<\/ul>\n<p style=\"padding-left: 40px;\"><code>composer install<\/code><\/p>\n<ul>\n<li>Run database updates:<\/li>\n<\/ul>\n<p style=\"padding-left: 40px;\"><code>drush updatedb<\/code><\/p>\n<ul>\n<li>Restore read-only permissions when the Drupal upgrade is complete:<\/li>\n<\/ul>\n<p style=\"padding-left: 40px;\"><code>chmod 755 web\/sites\/default<\/code><br \/>\n<code>chmod 644 web\/sites\/default\/*settings.php<\/code><br \/>\n<code>chmod 644 web\/sites\/default\/*services.yml<\/code><\/p>\n<h3>#Step 5. Run post-Drupal upgrade tasks<\/h3>\n<h4>1. Export and review configuration<\/h4>\n<p>After completing the Drupal upgrade, you should export and commit your configuration if you use configuration management. Core updates can reorder YAML files or override settings during database updates. Before committing changes, run a <code>git diff<\/code> to confirm that no critical functionality is affected.<\/p>\n<h4>2. Run PHPCS to align coding standards<\/h4>\n<p>If your project uses PHPCS, you should run it after the upgrade because Drupal coding standards may have changed. Apply automated fixes where possible and review remaining warnings manually to keep your codebase consistent.<\/p>\n<h4>3. Run automated tests<\/h4>\n<p>If your site includes custom tests such as PHPUnit or Behat, you should run them to confirm that core functionality still works as expected. This step helps detect hidden issues early.<\/p>\n<h4>4. Manually test site functionality<\/h4>\n<p>You should manually test key pages, forms, and user flows in the browser. While testing, monitor the Drupal watchdog log to catch errors or warnings in real time: <code>drush watchdog:tail<\/code><\/p>\n<h4>5. Check for errors via database updates and cron<\/h4>\n<p>Some issues only appear when database updates or background tasks run. You should execute pending database updates and cron jobs to surface these problems: <code>drush updatedb -y<\/code><\/p>\n<h3>#Step 6. Resolve common issues<\/h3>\n<p>During the Drupal upgrade from 9 to 10, Composer errors are the most common blockers. The table below summarizes typical issues you may encounter and the recommended ways to resolve them.<\/p>\n<div class=\"wptb-table-container wptb-table-88931\"><div class=\"wptb-table-container-matrix\" id=\"wptb-table-id-88931\" data-wptb-version=\"1.4.10\" data-wptb-pro-status=\"false\"><table class=\"wptb-preview-table wptb-element-main-table_setting-88931 edit-active\" data-reconstraction=\"0\" style=\"border: 1px solid rgb(209, 209, 209);\" data-wptb-table-tds-sum-max-width=\"609\" data-wptb-cells-width-auto-count=\"1\" data-wptb-horizontal-scroll-status=\"false\" data-wptb-extra-styles=\"LyogRW50ZXIgeW91ciBjdXN0b20gQ1NTIHJ1bGVzIGhlcmUgKi8=\" role=\"table\" data-table-columns=\"3\"><tbody><tr class=\"wptb-row\"><td class=\"wptb-cell\" data-y-index=\"0\" data-x-index=\"0\" style=\"border: 1px solid rgb(209, 209, 209);\" data-wptb-css-td-auto-width=\"true\"><div class=\"wptb-text-container wptb-ph-element wptb-element-text-597\" style=\"color: rgb(0, 0, 0); font-size: 15px;\"><div class=\"\"><p style=\"text-align: center;\"><strong>Problem<\/strong><\/p><\/div><\/div><\/td><td class=\"wptb-cell\" data-y-index=\"0\" data-x-index=\"1\" style=\"border: 1px solid rgb(209, 209, 209); width: 160px;\"><div class=\"wptb-text-container wptb-ph-element wptb-element-text-598\" style=\"color: rgb(0, 0, 0); font-size: 15px;\"><div class=\"\" style=\"position: relative;\"><p style=\"text-align: center;\"><strong>Cause<\/strong><\/p><\/div><\/div><\/td><td class=\"wptb-cell\" data-y-index=\"0\" data-x-index=\"2\" style=\"border: 1px solid rgb(209, 209, 209); width: 255px;\"><div class=\"wptb-text-container wptb-ph-element wptb-element-text-599\" style=\"color: rgb(0, 0, 0); font-size: 15px;\"><div class=\"\" style=\"position: relative;\"><p style=\"text-align: center;\"><strong>Solution<\/strong><\/p><\/div><\/div><\/td><\/tr><tr class=\"wptb-row\" style=\"--hover-bg-color: undefined;\"><td class=\"wptb-cell\" data-y-index=\"1\" data-x-index=\"0\" style=\"border: 1px solid rgb(209, 209, 209);\" data-wptb-css-td-auto-width=\"true\" colspan=\"1\" rowspan=\"4\"><div class=\"wptb-text-container wptb-ph-element wptb-element-text-600\" style=\"color: rgb(0, 0, 0); font-size: 15px;\"><div class=\"\" style=\"position: relative;\"><p>&ldquo;Your requirements could not be resolved to an installable set of packages&rdquo;<\/p><\/div><\/div><div class=\"wptb-text-container wptb-ph-element wptb-ondragenter wptb-element-text-603\" style=\"color: rgb(0, 0, 0); font-size: 15px;\"><div class=\"\" style=\"position: relative;\"><p><\/p><\/div><\/div><div class=\"wptb-text-container wptb-ph-element wptb-element-text-606\"><div class=\"\" style=\"position: relative;\"><p><\/p><\/div><\/div><div class=\"wptb-text-container wptb-ph-element wptb-element-text-609\"><div class=\"\" style=\"position: relative;\"><p><\/p><\/div><\/div><\/td><td class=\"wptb-cell\" data-y-index=\"1\" data-x-index=\"1\" style=\"border: 1px solid rgb(209, 209, 209); width: 160px;\"><div class=\"wptb-text-container wptb-ph-element wptb-element-text-601\" style=\"color: rgb(0, 0, 0); font-size: 15px;\"><div class=\"\" style=\"position: relative;\"><p>One or more dependencies are not compatible with Drupal 10, or existing version constraints in composer.json block the upgrade.<\/p><\/div><\/div><\/td><td class=\"wptb-cell\" data-y-index=\"1\" data-x-index=\"2\" style=\"border: 1px solid rgb(209, 209, 209); width: 255px;\"><div class=\"wptb-text-container wptb-ph-element wptb-element-text-602\" style=\"color: rgb(0, 0, 0); font-size: 15px;\"><div class=\"\" style=\"position: relative;\"><p>Reset version constraints for all direct dependencies:<\/p><\/div><\/div><div class=\"wptb-custom_html-container wptb-ph-element wptb-element-custom_html-1\"><div class=\"wptb-custom-html-wrapper\" data-wptb-new-element=\"1\" style=\"position: relative;\"><code>composer show --no-dev --direct --name-only | xargs composer require --no-update<\/code><\/div><\/div><\/td><\/tr><tr class=\"wptb-row\" style=\"--hover-bg-color: undefined;\"><td class=\"wptb-cell\" data-y-index=\"2\" data-x-index=\"1\" style=\"border: 1px solid rgb(209, 209, 209); width: 160px;\"><div class=\"wptb-text-container wptb-ph-element wptb-element-text-604\" style=\"color: rgb(0, 0, 0); font-size: 15px;\"><div class=\"\" style=\"position: relative;\"><p>Some dependencies only support Drupal 10 via RC or alpha releases.<\/p><\/div><\/div><\/td><td class=\"wptb-cell\" data-y-index=\"2\" data-x-index=\"2\" style=\"border: 1px solid rgb(209, 209, 209); width: 255px;\"><div class=\"wptb-text-container wptb-ph-element wptb-element-text-605\" style=\"color: rgb(0, 0, 0); font-size: 15px;\"><div class=\"\" style=\"position: relative;\"><p>Identify affected dependencies and explicitly allow RC or alpha versions (for example, @RC or @alpha). Then re-require all dependencies with updates:<\/p><\/div><\/div><div class=\"wptb-custom_html-container wptb-ph-element wptb-element-custom_html-2\"><div class=\"wptb-custom-html-wrapper\" data-wptb-new-element=\"1\" style=\"position: relative;\"><code>composer require --update-with-dependencies <dependency-list><\/dependency-list><\/code><\/div><\/div><\/td><\/tr><tr class=\"wptb-row\" style=\"--hover-bg-color: undefined;\"><td class=\"wptb-cell\" data-y-index=\"3\" data-x-index=\"1\" style=\"border: 1px solid rgb(209, 209, 209); width: 160px;\"><div class=\"wptb-text-container wptb-ph-element wptb-element-text-607\"><div class=\"\" style=\"position: relative;\"><p>A specific Drupal module blocks the upgrade.<\/p><\/div><\/div><\/td><td class=\"wptb-cell\" data-y-index=\"3\" data-x-index=\"2\" style=\"border: 1px solid rgb(209, 209, 209); width: 255px;\"><div class=\"wptb-text-container wptb-ph-element wptb-element-text-608\" style=\"color: rgb(0, 0, 0); font-size: 15px;\"><div class=\"\" style=\"position: relative;\"><p>Check the module&rsquo;s Drupal.org page and explicitly require a Drupal 10&ndash;compatible version:<br><\/p><\/div><\/div><div class=\"wptb-custom_html-container wptb-ph-element wptb-element-custom_html-3\"><div class=\"wptb-custom-html-wrapper\" data-wptb-new-element=\"1\" style=\"position: relative;\"><code>composer require drupal\/MODULE_NAME:^2.0.0-rc1 --no-update<\/code><\/div><\/div><\/td><\/tr><tr class=\"wptb-row\" style=\"--hover-bg-color: undefined;\"><td class=\"wptb-cell\" data-y-index=\"4\" data-x-index=\"1\" style=\"border: 1px solid rgb(209, 209, 209); width: 160px;\"><div class=\"wptb-text-container wptb-ph-element wptb-ondragenter wptb-element-text-610\" style=\"color: rgb(0, 0, 0); font-size: 15px;\"><div class=\"\" style=\"position: relative;\"><p>You need to identify which dependencies block Drupal 10 core.<\/p><\/div><\/div><\/td><td class=\"wptb-cell\" data-y-index=\"4\" data-x-index=\"2\" style=\"border: 1px solid rgb(209, 209, 209); width: 255px;\"><div class=\"wptb-text-container wptb-ph-element wptb-element-text-611\" style=\"color: rgb(0, 0, 0); font-size: 15px;\"><div class=\"\" style=\"position: relative;\"><p>Run the following command to list blocking dependencies:<\/p><\/div><\/div><div class=\"wptb-custom_html-container wptb-ph-element wptb-element-custom_html-4\"><div class=\"wptb-custom-html-wrapper\" data-wptb-new-element=\"1\" style=\"position: relative;\"><code>composer why-not drupal\/core ^10<\/code><\/div><\/div><\/td><\/tr><tr class=\"wptb-row\" style=\"--hover-bg-color: undefined;\"><td class=\"wptb-cell\" data-y-index=\"5\" data-x-index=\"0\" style=\"border: 1px solid rgb(209, 209, 209);\" data-wptb-css-td-auto-width=\"true\"><div class=\"wptb-text-container wptb-ph-element wptb-element-text-612\" style=\"color: rgb(0, 0, 0); font-size: 15px;\"><div class=\"\" style=\"position: relative;\"><p>Composer patches do not reapply<\/p><\/div><\/div><\/td><td class=\"wptb-cell\" data-y-index=\"5\" data-x-index=\"1\" style=\"border: 1px solid rgb(209, 209, 209); width: 160px;\"><div class=\"wptb-text-container wptb-ph-element wptb-element-text-613\" style=\"color: rgb(0, 0, 0); font-size: 15px;\"><div class=\"\" style=\"position: relative;\"><p>Existing patches no longer apply to Drupal 10 or have already been committed upstream.<\/p><\/div><\/div><\/td><td class=\"wptb-cell\" data-y-index=\"5\" data-x-index=\"2\" style=\"border: 1px solid rgb(209, 209, 209); width: 255px;\"><div class=\"wptb-text-container wptb-ph-element wptb-element-text-614\" style=\"color: rgb(0, 0, 0); font-size: 15px;\"><div class=\"\" style=\"position: relative;\"><p>Remove obsolete patches from composer.json. If a newer patch exists for Drupal 10, update the patch URL in composer.json and rerun the update.<\/p><\/div><\/div><\/td><\/tr><tr class=\"wptb-row\" style=\"--hover-bg-color: undefined;\"><td class=\"wptb-cell\" data-y-index=\"6\" data-x-index=\"0\" style=\"border: 1px solid rgb(209, 209, 209);\" data-wptb-css-td-auto-width=\"true\"><div class=\"wptb-text-container wptb-ph-element wptb-element-text-615\" style=\"color: rgb(0, 0, 0); font-size: 15px;\"><div class=\"\" style=\"position: relative;\"><p>Lock file is not up to date with the latest changes<\/p><\/div><\/div><\/td><td class=\"wptb-cell\" data-y-index=\"6\" data-x-index=\"1\" style=\"border: 1px solid rgb(209, 209, 209); width: 160px;\"><div class=\"wptb-text-container wptb-ph-element wptb-element-text-616\" style=\"color: rgb(0, 0, 0); font-size: 15px;\"><div class=\"\" style=\"position: relative;\"><p>The composer.lock file does not match the current composer.json.<\/p><\/div><\/div><\/td><td class=\"wptb-cell\" data-y-index=\"6\" data-x-index=\"2\" style=\"border: 1px solid rgb(209, 209, 209); width: 255px;\"><div class=\"wptb-text-container wptb-ph-element wptb-element-text-617\" style=\"color: rgb(0, 0, 0); font-size: 15px;\"><div class=\"\" style=\"position: relative;\"><p>Delete the lock file and vendor directory, then rerun Composer:<\/p><\/div><\/div><div class=\"wptb-custom_html-container wptb-ph-element wptb-element-custom_html-5\"><div class=\"wptb-custom-html-wrapper\" data-wptb-new-element=\"1\" style=\"position: relative;\"><code>rm composer.lock<br>rm -rf vendor<br>composer update<\/code><\/div><grammarly-extension data-grammarly-shadow-root=\"true\" class=\"dnXmp\" style=\"position: absolute; top: -1px; left: -1px; pointer-events: none; z-index: auto; --rem: 16;\"><\/grammarly-extension><grammarly-extension data-grammarly-shadow-root=\"true\" class=\"dnXmp\" style=\"position: absolute; top: -1px; left: -1px; pointer-events: none; z-index: auto; --rem: 16;\"><\/grammarly-extension><\/div><\/td><\/tr><\/tbody><\/table><\/div><\/div>\n\n<hr \/>\n<h2>How to Upgrade from Legacy Drupal Versions<\/h2>\n<p>If you're ready to stay within the Drupal ecosystem, the best path is to upgrade Drupal 6 to 7, upgrade Drupal 7 to 8, upgrade Drupal 8 to 9, then run the Drupal upgrade to the latest version (10 and 11). This will give your site continued access to security updates, modern development practices, and all the latest features.<\/p>\n<p>Alternatively, you may consider this a good time to migrate to another platform, especially if you're looking for something more user-friendly, cost-effective, or aligned with your current business goals.<\/p>\n<p>If you choose to go this route, <strong>LitExtension<\/strong> can help you make a smooth transition. As the #1 eCommerce Migration Expert, LitExtension supports secure, accurate, and automated migrations from Drupal to platforms like Shopify, WooCommerce, Magento, and more, with minimal disruption and full data integrity.<\/p>\n<div class=\"cta-detail\">\n<div>\n<h2 class=\"title\">Let Our Experts Handle Your Store Migration!<\/h2>\n<p class=\"cta-desc\">With the All-in-One Migration Service, our experts take care of everything, ensuring a seamless and stress-free migration.<\/p>\n<p><a class=\"btn-frame\" href=\"https:\/\/litextension.com\/?utm_source=blog&utm_medium=display&utm_campaign=ctabox&utm_term=alice&utm_content=drupalupgrade\" target=\"_blank\" rel=\"noopener\">BOOK FREE CONSULTATION<\/a><\/p>\n<\/div>\n<div><img decoding=\"async\" class=\"size-medium wp-image-78213\" src=\"https:\/\/litextension.com\/blog\/wp-content\/uploads\/2024\/09\/2-08-1.png\" alt=\"All-in-One Migration Service\" \/><\/div>\n<\/div>\n<hr \/>\n<h2>Best Practices for a Smooth Drupal Upgrade<\/h2>\n<h3>Prepare backups and a staging environment<\/h3>\n<p>Before starting, you should create full <a href=\"https:\/\/litextension.com\/blog\/drupal-backup-and-migrate\/\" target=\"_blank\" rel=\"noopener\">Drupal backups<\/a> of your database and files. A staging environment lets you test the upgrade safely and catch issues before they reach your live site.<\/p>\n<h3>Check compatibility early<\/h3>\n<p>You should review contributed modules, themes, and custom code before upgrading Drupal core. Tools like Upgrade Status help you identify deprecated code and unsupported extensions early in the process.<\/p>\n<h3>Use Composer consistently<\/h3>\n<p>You should rely on Composer for managing Drupal core, modules, and dependencies. Running dry runs and resolving conflicts early helps prevent failed upgrades.<\/p>\n<h3>Test thoroughly after the upgrade<\/h3>\n<p>After the upgrade, you should test key site features such as forms, content, and integrations. Reviewing logs and applying database updates ensures your site remains stable and secure.<\/p>\n<h3>Plan for ongoing maintenance<\/h3>\n<p>Once the upgrade is complete, you should keep Drupal core and modules updated regularly. This habit helps you avoid large, risky upgrades in the future and keeps your site secure.<\/p>\n<hr \/>\n<h2>Drupal Upgrade \u2013 FAQs<\/h2>\n<div id=\"rank-math-rich-snippet-wrapper\"><div id=\"rank-math-faq\" class=\"rank-math-block\">\n<div class=\"rank-math-list \">\n<div id=\"faq-1\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \">Can I upgrade from Drupal 9 to 11?<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>You cannot upgrade directly from Drupal 9 to Drupal 11. Drupal follows a sequential upgrade path, so you must first upgrade from Drupal 9 to Drupal 10, then continue from Drupal 10 to Drupal 11. This approach ensures compatibility with core changes, dependencies, and deprecated APIs at each stage.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-2\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \">What is the latest Drupal version?<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>The latest major version of Drupal is Drupal 11. It offers long-term security support, improved performance, and better alignment with modern PHP and Symfony versions. Using the latest Drupal version helps keep your site secure and compatible with current technologies.<\/p>\n\n<\/div>\n<\/div>\n<div id=\"faq-3\" class=\"rank-math-list-item\">\n<h3 class=\"rank-math-question \">What are the approaches to a Drupal upgrade?<\/h3>\n<div class=\"rank-math-answer \">\n\n<p>There are two main approaches to a Drupal upgrade. The first is an in-place upgrade, which works for supported version paths such as Drupal 9 to 10 or 10 to 11 and focuses on updating core, modules, and code. The second approach is a migration, which is required for legacy versions like Drupal 6, 7, or 8 and involves rebuilding the site on a newer Drupal version or moving to another platform while transferring content and data.<\/p>\n\n<\/div>\n<\/div>\n<\/div>\n<\/div><\/div>\n<hr \/>\n<h2>Final Words<\/h2>\n<p>To conclude, a Drupal upgrade is an essential step to keep your website secure, stable, and ready for future growth. Whether you are upgrading between supported versions or moving away from a legacy Drupal setup, proper planning and careful execution make a significant difference. By following the recommended upgrade path, preparing your codebase, and completing post-upgrade checks, you can reduce risks and avoid unexpected downtime.<\/p>\n<p>If you like articles like this, don't hesitate to check out our <a href=\"https:\/\/litextension.com\/resources\" target=\"_blank\" rel=\"noopener\">LitExtension Resources<\/a> and <a href=\"https:\/\/litextension.com\/blog\/\" target=\"_blank\" rel=\"noopener\">Blogs<\/a> for more expert tips and insights.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>As new versions of Drupal continue to evolve, each upgrade introduces valuable improvements in performance, accessibility, and security. Therefore, understanding how to perform a proper Drupal upgrade will be a critical step, helping you avoid downtime, data loss, outdated security support, or compatibility issues. In this guide, we&#8217;ll walk you through the entire process of [&hellip;]<\/p>\n","protected":false},"author":82,"featured_media":88926,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"tpgb_global_settings":"","ub_ctt_via":"","inline_featured_image":false,"_uag_custom_page_level_css":"","footnotes":"","jnews-multi-image_gallery":[],"jnews_single_post":{"format":"standard"},"jnews_primary_category":[]},"categories":[16620],"tags":[],"table_tags":[],"featured_image_src":"https:\/\/litextension.com\/blog\/wp-content\/uploads\/2026\/01\/drupal-upgrade.webp","author_info":{"display_name":"Ani Duong","author_link":"https:\/\/litextension.com\/blog\/author\/aniduong\/"},"tpgb_featured_images":{"full":["https:\/\/litextension.com\/blog\/wp-content\/uploads\/2026\/01\/drupal-upgrade.webp",1552,1024,false],"tp-image-grid":["https:\/\/litextension.com\/blog\/wp-content\/uploads\/2026\/01\/drupal-upgrade-700x700.webp",700,700,true],"thumbnail":["https:\/\/litextension.com\/blog\/wp-content\/uploads\/2026\/01\/drupal-upgrade-150x150.webp",150,150,true],"medium":["https:\/\/litextension.com\/blog\/wp-content\/uploads\/2026\/01\/drupal-upgrade-300x198.webp",300,198,true],"medium_large":["https:\/\/litextension.com\/blog\/wp-content\/uploads\/2026\/01\/drupal-upgrade-768x507.webp",768,507,true],"large":["https:\/\/litextension.com\/blog\/wp-content\/uploads\/2026\/01\/drupal-upgrade-1024x676.webp",1024,676,true],"default":"https:\/\/litextension.com\/blog\/wp-content\/plugins\/the-plus-addons-for-block-editor\/assets\/images\/tpgb-placeholder.jpg"},"tpgb_post_meta_info":{"get_date":"Jan, 2026","category_list":{"category":[{"term_id":16620,"name":"Ecommerce Platforms","slug":"ecommerce-platforms","term_group":0,"term_taxonomy_id":16620,"taxonomy":"category","description":"<span style=\"color: #808080\"><em>Welcome to our eCommerce platform reviews category, where you'll find expert insights on the top players in the industry. Whether you're a seasoned online seller or just getting started, our eCommerce platform reviews category is a must-read!<\/em><\/span>","parent":0,"count":413,"filter":"raw"}],"post_tag":false,"post_format":false,"table_tags":false},"author_name":"Ani Duong","author_url":"https:\/\/litextension.com\/blog\/author\/aniduong\/","author_email":"ani@litextension.com","author_website":"https:\/\/litextension.com\/blog\/author\/aniduong\/","author_description":"The newest addition to LitExtension\u2019s senior content writer team, Ani pens insightful articles covering a wide range of eCommerce platforms, from the most popular to the newly established.","author_facebook":"","author_twitter":"","author_instagram":"","author_role":["editor"],"author_firstname":"Ani","author_lastname":"Duong","user_login":"aniduong","author_avatar":"<img alt='' src='https:\/\/secure.gravatar.com\/avatar\/a549d93546d6a2b8064c3ab81270a1b2?s=200&#038;d=mm&#038;r=g' srcset='https:\/\/secure.gravatar.com\/avatar\/a549d93546d6a2b8064c3ab81270a1b2?s=400&#038;d=mm&#038;r=g 2x' class='avatar avatar-200 photo' height='200' width='200' decoding='async'\/>","author_avatar_url":"https:\/\/secure.gravatar.com\/avatar\/a549d93546d6a2b8064c3ab81270a1b2?s=96&d=mm&r=g","comment_count":0,"post_likes":0,"post_views":0},"tpgb_post_category":{"category":"<a href=\"https:\/\/litextension.com\/blog\/ecommerce-platforms\/\" alt=\"Ecommerce Platforms\" class=\"category-ecommerce-platforms\">Ecommerce Platforms<\/a> "},"uagb_featured_image_src":{"full":["https:\/\/litextension.com\/blog\/wp-content\/uploads\/2026\/01\/drupal-upgrade.webp",1552,1024,false],"thumbnail":["https:\/\/litextension.com\/blog\/wp-content\/uploads\/2026\/01\/drupal-upgrade-150x150.webp",150,150,true],"medium":["https:\/\/litextension.com\/blog\/wp-content\/uploads\/2026\/01\/drupal-upgrade-300x198.webp",300,198,true],"medium_large":["https:\/\/litextension.com\/blog\/wp-content\/uploads\/2026\/01\/drupal-upgrade-768x507.webp",768,507,true],"large":["https:\/\/litextension.com\/blog\/wp-content\/uploads\/2026\/01\/drupal-upgrade-1024x676.webp",1024,676,true],"1536x1536":["https:\/\/litextension.com\/blog\/wp-content\/uploads\/2026\/01\/drupal-upgrade-1536x1013.webp",1536,1013,true],"2048x2048":["https:\/\/litextension.com\/blog\/wp-content\/uploads\/2026\/01\/drupal-upgrade.webp",1552,1024,false],"tp-image-grid":["https:\/\/litextension.com\/blog\/wp-content\/uploads\/2026\/01\/drupal-upgrade-700x700.webp",700,700,true],"jnews-360x180":["https:\/\/litextension.com\/blog\/wp-content\/uploads\/2026\/01\/drupal-upgrade-360x180.webp",360,180,true],"jnews-750x375":["https:\/\/litextension.com\/blog\/wp-content\/uploads\/2026\/01\/drupal-upgrade-750x375.webp",750,375,true],"jnews-1140x570":["https:\/\/litextension.com\/blog\/wp-content\/uploads\/2026\/01\/drupal-upgrade-1140x570.webp",1140,570,true],"jnews-120x86":["https:\/\/litextension.com\/blog\/wp-content\/uploads\/2026\/01\/drupal-upgrade-120x86.webp",120,86,true],"jnews-350x250":["https:\/\/litextension.com\/blog\/wp-content\/uploads\/2026\/01\/drupal-upgrade-350x250.webp",350,250,true],"jnews-750x536":["https:\/\/litextension.com\/blog\/wp-content\/uploads\/2026\/01\/drupal-upgrade-750x536.webp",750,536,true],"jnews-1140x815":["https:\/\/litextension.com\/blog\/wp-content\/uploads\/2026\/01\/drupal-upgrade-1140x815.webp",1140,815,true],"jnews-360x504":["https:\/\/litextension.com\/blog\/wp-content\/uploads\/2026\/01\/drupal-upgrade-360x504.webp",360,504,true],"jnews-75x75":["https:\/\/litextension.com\/blog\/wp-content\/uploads\/2026\/01\/drupal-upgrade-75x75.webp",75,75,true],"jnews-350x350":["https:\/\/litextension.com\/blog\/wp-content\/uploads\/2026\/01\/drupal-upgrade-350x350.webp",350,350,true],"jnews-featured-750":["https:\/\/litextension.com\/blog\/wp-content\/uploads\/2026\/01\/drupal-upgrade.webp",750,495,false],"jnews-featured-1140":["https:\/\/litextension.com\/blog\/wp-content\/uploads\/2026\/01\/drupal-upgrade.webp",1140,752,false]},"uagb_author_info":{"display_name":"Ani Duong","author_link":"https:\/\/litextension.com\/blog\/author\/aniduong\/"},"uagb_comment_info":0,"uagb_excerpt":"As new versions of Drupal continue to evolve, each upgrade introduces valuable improvements in performance, accessibility, and security. Therefore, understanding how to perform a proper Drupal upgrade will be a critical step, helping you avoid downtime, data loss, outdated security support, or compatibility issues. In this guide, we'll walk you through the entire process of&hellip;","_links":{"self":[{"href":"https:\/\/litextension.com\/blog\/wp-json\/wp\/v2\/posts\/88925"}],"collection":[{"href":"https:\/\/litextension.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/litextension.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/litextension.com\/blog\/wp-json\/wp\/v2\/users\/82"}],"replies":[{"embeddable":true,"href":"https:\/\/litextension.com\/blog\/wp-json\/wp\/v2\/comments?post=88925"}],"version-history":[{"count":9,"href":"https:\/\/litextension.com\/blog\/wp-json\/wp\/v2\/posts\/88925\/revisions"}],"predecessor-version":[{"id":89011,"href":"https:\/\/litextension.com\/blog\/wp-json\/wp\/v2\/posts\/88925\/revisions\/89011"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/litextension.com\/blog\/wp-json\/wp\/v2\/media\/88926"}],"wp:attachment":[{"href":"https:\/\/litextension.com\/blog\/wp-json\/wp\/v2\/media?parent=88925"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/litextension.com\/blog\/wp-json\/wp\/v2\/categories?post=88925"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/litextension.com\/blog\/wp-json\/wp\/v2\/tags?post=88925"},{"taxonomy":"table_tags","embeddable":true,"href":"https:\/\/litextension.com\/blog\/wp-json\/wp\/v2\/table_tags?post=88925"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}