Drupal 9 is now EOL. It turns out, there are a lot of sites that haven't made the upgrade to Drupal 10 yet though! Upgrading to Drupal 10 is neither easy nor hard, but it is something you should not ignore. Below are some handy tricks to help you in this quest, also do not hesitate to contact me if you need help upgrading and maintaining your Drupal site.
My current role at managed services has me upgrading sites by the dozen. Together with my magnificent team we maintain about 100 Drupal websites, some of them high-profile, some of them small and casual. Upgrading all of them taught us valuable lessons and while at it I've created some handy one-liners to help ease the process. Let's go then!
Use Upgrade Status
This goes without saying, use https://www.drupal.org/project/upgrade_status and follow the suggestions it makes.
Invest into Visual Regression Tests
This is a nice to have, but absolutely needed if you are using twig_extensions, unified_twig_ext, twig_tweak and other similar modules. I advise you to setup some visual regression tests using BackstopJS to highlight differences before and after you upgrade code. An ommitted CSS class can be hard to spot without using such a tool.
Pro Tip: If you use DDEV have a look at https://github.com/mmunz/ddev-backstopjs
Handy scripts and oneliners
Fix spaceless deprecations everywhere
Please run these under the custom theme. Check git diff before committing.
find ./ -type f -name '*.twig' -exec sed -i 's/% spaceless %/% apply spaceless %/g' {} \;
find ./ -type f -name '*.twig' -exec sed -i 's/% endspaceless %/% endapply %/g' {} \;
Find all queries that might need applying accessCheck
See Change Record: Access checking must be explicitly specified on content entity queries
Find files and open in Vim:
find ./ -type f -exec grep -q '->execute' {} \; -exec vim {} +
Note: use :n
to go to next file.
Other options:
- phpStorm:
Ctrl+Shift+F
in custom modules folder, search for->execute
- bash with silversearcher-ag:
ag '\->execute'
- bash with ripgrep:
rg '\->execute'
Find for-ifs in twig files
Find all twig lines that use an if
condition on a for
:
rg -t twig 'for.*if'
Requires ripgrep. Other tools can do it but they'll be very slow.
See https://www.drupal.org/node/3071078#s-template-facing-twig-2-changes for how to fix it.
How to fix drupal_get_path
- $this->modulePath = drupal_get_path('module', 'mymodule');
+ $this->modulePath = \Drupal::service('extension.list.module')->getPath('mymodule');
Simple as above, use \Drupal::service('extension.list.module')->getPath('module_or_theme_name')
and use module
or theme
as needed.
The "node_type" plugin does not exist.
find . -type f -name 'pathauto.pattern.content_*.yml' -exec sed -i 's/node_type/entity_bundle:node/g' {} \;
When you try to edit a node, you might get an error saying The "node_type" plugin does not exist.
. If so, the issue is probably with an update to ctools/pathauto. To get around it, in each of you pathauto.pattern.*.yml
files, open the file, find the string node_type
and change it to entity_bundle:node
. Then import the config to your site again. You should now be able to edit your pages.
Modules known to be affected by this issue:
- pathauto: pathauto.pattern.*.yml
- block_visibility_groups: block_visibility_groups.block_visibility_group.*.yml