Primary tabs
Useful Drupal modules
Click on the module name for notes, comments, patches.
Recommendations (for and against) are my personal opinion only and may be out of date. Feel free to email with corrections/suggestions.
Why doesn't the table mention Drupal 9 or 10?
1. Nowadays, I try and use Drupal as little as possible. Specifically I do not recommend it for a new website. I'd also strongly caution you against choosing Drupal if you're at the beginning of your career and trying to learn web development (front / back / full stack) or just want to manage/maintain a website. More details why by email on request.
2. By February 2022 I'd updated all the sites I look after to Drupal 9 (experience: mixed). As of March 2023, a year later, none of them were fully ready for Drupal 10 (waiting on support for various modules). By 13 Nov 2023 (a week or two after D9 lost support) I had updated a couple of them.
Q: What's the Drupal 9 to 10 upgrade experience like? A: it's what I'd describe as "just bearable", slightly better than D8 to D9, though with plenty of things to still trip you up. There is still deprecated code that needs fixing in D10 modules, and policy changes mean odd things will break (be prepared to turn off Aggregate CSS/JS files if your themes stop working, and note that Drush launcher doesn't work with Drush 12...)
Admittedly the upgrade_status module is the best solution they could have come up with for tracking compatibility. Also watch out for a nasty session headers bug with redirect_after_login.
What about sites still running Drupal 7? In short I still recommend leaving them on Drupal 7 or moving to another platform entirely. My prediction was that Drupal will extend D7 support year after year (note that drupal.org itself is still running D7). It's now been confirmed as 5 Jan 2025. There will have to be some sort of third-party long term support, because of the sheer volume of sites that are not being upgraded.
Your decision is really what specifically you think you will gain from Drupal 8/9/10 - often the answer will be not enough, and one of the main hassles - apart from converting each content type one at a time, and setting up a new theme, will be recreating all your views by hand, as views can't be automatically upgraded.
(134 modules in list)Name Sort ascending | D8 | Personally Tested | Last Updated |
---|---|---|---|
Prepopulate (prepopulate) | ✔ | ✔ | |
Allows you to prefill form fields by supplying values in a query string. Syntax (also in readme) Useful for bookmarklets. D8 alpha version. |
|||
Permissions Filter (permissions_filter) | ✔ | ✔ | |
"Essential" The admin permissions page can get pretty long. This lets you narrow it down by typing permission names into a text field. |
|||
PDF Reader (pdf_reader) | ✔ | ✔ | |
Render a file field with one of several PDF readers. Mixed success with pdf.js support - seems to force a full screen view. |
|||
Pathologic (pathologic) | ✖ | ✔ | |
There's a D8 version but I've only tested D7. It's a filter that fixes incorrect paths in your content - e.g. if you have content with an old domain or IP address specified, you can redirect it. |
|||
Pathauto (pathauto) | ✔ | ✔ | |
"Essential" Generates URL aliases for new content automatically - using token-based patterns per content type - e.g. /reports/[node:title] When you install this, the settings are in /admin/config/search/path – normally this page has no tabs, with this module you get Patterns, Settings, Bulk Generate, Delete Aliases). |
|||
Password policy (password_policy) | ✔ | ✔ | |
Not recommended There are still quite a few bugs open. I dropped this for a project, partly because it adds a load of clutter with the 'resets' and reset dates. |
|||
Paragraphs (paragraphs) | ✔ | ✔ | |
For those familiar with WordPress, this is the equivalent of the ACF repeater field. You can create paragraph types, which are collections of one or more fields, and the user can add as many of them as they like. So you could have distinct paragraph styles, e.g. with images aligned in a certain way, or a page consisting of parallax backgrounds etc. |
|||
Node Page Disable (node_page_disable) | ✖ | ✔ | |
"Essential" Adds an checkbox labelled 'Retain /node as an active url?' to /admin/config/system/site-information This lets you disable the /node page which would otherwise list all published content. Note it doesn't let you individual disable /node/xxx access by content type - see restrict_node_page_view or rabbit_hole for that. This is for D7 only - in D8 you go to /admin/structure/views and disable /node there. |
|||
Node Export (node_export) | ✖ | ✖ | |
Tto actually export node content. An 8.x version has begun development:
|
|||
Node access user reference (nodeaccess_userreference) | ✖ | ✔ | |
"Essential" Allows you to use an entity reference field on a node to allow (or deny) access to that node to the users you have selected. Extremely useful for giving selected people access. This isn't available in D8 or above (though it ought to be) - there's a note in the issue queue about it. #2655426 |
|||
Ngrok for drupal (ngrok_drupal) | ✔ | ✔ | |
Sets the cookie domain correctly if you're using ngrok. Use this if you have an Ngrok secure tunnel - e.g. if you are testing a Stripe Apple Pay integration (needs to run with a valid, publicly accessible SSH domain) |
|||
Nagios (nagios) | ✔ | ✔ | |
Generate customisable Nagios reports for things like module updates, cron not running etc. The D8 version is now compatible with NRPE because there's a Drush command to generate the Nagios string. |
|||
Mydropwizard (mydropwizard) | ✖ | ✔ | |
"Essential" If you have a Drupal 6 site, this modifies your Available Updates page (/admin/reports/updates) with direct download and release note links to all the D6 LTS (Drupal 6 Long Term Support) releases. |
|||
Mollom (mollom) | ✔ | ✖ | |
Deprecated Not recommended DO NOT USE - security issue and Acquia will no longer support or maintain it. Spam filtering SaaS from Acquia. Free for up to 50 "ham" messages a day. Scans message then provides a captcha if appropriate, scores each message for reputation, spam etc. I never tried this module and anecdotally I've seen mixed reports / people suggesting it's not all that good. |
|||
Module builder (module_builder) | ✔ | ✔ | |
"Essential" Add a UI to easily create scaffolding for new modules (including hooks, plugins, permissions etc.) NB: first, you need to download drupal-code-builder from GitHub and place it in a /libraries top-level directory (see module builder's README.txt). You can preview and edit the output files before writing to disk - and each module's configuration is saved as a node, so you can add another hook etc. at a later date, regenerate the files and copy/paste the extra things you need. Video walkthrough. |
|||
Metatag (metatag) | ✔ | ✔ | |
"Essential" This comes with a whole series of modules, including metatag_verification that will allow you to insert a google-site-verification tab. Instructions How to add it to a content type/bundle:
|
|||
Menu Token (menu_token) | ✔ | ✔ | |
Add tokens, such as a user ID, to text or URL paths of menu items. Be wary of this issue: Current-user:uid not correct |
|||
Menu position (menu_position) | ✔ | ✔ | |
"Essential" Assign various pages (by content type, URL, role etc.) to certain menu entries - so the 'active' status of the menu is set correctly (i.e. they appear within the sections you want). - patch: Add enabled checkbox to edit form + enable new rules by default
|
|||
Memcache API and Integration (memcache) | ✔ | ✔ | |
"Essential" Enable memcache_admin submodule to access stats page. Requires the PECL PHP memcached module. I've written a blog post explaining how to install this on Acquia Dev Desktop. |
|||
Masquerade (masquerade) | ✔ | ✔ | |
"Essential" Allows you to browse the site as another user (to see what they see) and then quickly switch back again. A general Drupal recommendation is to create test accounts for each of your roles, so this is useful for testing them. (As per notes, don't use it for anonymous access, just log out.) Replacement for 'Switch User'. Patch and known bug:
|
|||
Login email or username (login_emailusername) | ✔ | ✔ | |
"Essential" Self-explanatory. |
|||
Layout builder (layout_builder) | ✔ | ✔ | |
Benefits:
Nov 2018: core, experimental in 8.6.x Installation:
By turning on Layout Builder, you switch from the standard Manage Display view (field, label, format/widget settings) and the layout builder GUI. Resources: Compatibility:
|
|||
IMCE (imce) | ✔ | ✔ | |
Adds a file browser to the CKEditor link dialog, so you can select files that have already been uploaded. Settings in Admin > Config > Media. In many cases will be better IA to add a dedicate file field to the content type and use that, or wait for the new media browser (currently being designed, follow the Drupal UX group.) |
|||
Image Lazyloader (lazyloader) | ✔ | ✖ | |
Images are hidden until they scroll into view. Can specify distance before loading is triggered, also placeholder image, loading GIF and any pages to be excluded. There's been some Drupal 8 development but unclear how complete it is. |
|||
Honeypot (honeypot) | ✔ | ✔ | |
"Essential" Adds spam prevention to forms (you can select which, including user registration and contact). Recommended settings: - turn logging on (look for entries of type = honeypot in /admin/reports/dblog |
|||
HMS Field (hms_field) | ✔ | ✔ | |
Hours/minutes/seconds field type (formats: h:mm, h:mm:ss, m:ss, h, m or s). Drupal 8 in beta. |
|||
Group (group) | ✔ | ✖ | |
Alternative to the Organic Groups module. Allows you to create groups - e.g. classes, subscriptions, multiple communities. Drupal module of the week post. Blog post. It is by all accounts solidly written, but I found the initial UI confusing (in a "so what do I do now?" way) - you probably need to watch the YouTube video to understand it. |
|||
Google Authenticator login (ga_login) | ✔ | ✔ | |
"Essential" Use in conjunction with tfa to support OATH based HOTP/TOTP systems. Nov 2022: No longer needed (i.e. uninstall it) when you upgrade to tfa 2.x for Drupal 9 and 10. |
|||
General Data Protection Regulation (gdpr) | ✔ | ✔ | |
Not recommended Couldn't install either alpha branch (8.1 or 8.2on Debian Stretch (9.5) wants php7.1-zip which doesn't seem to be available. |
|||
Flood Control (flood_control) | ✖ | ✖ | |
Protect against brute-force login attacks. Unclear what's happening with porting of this. |
|||
Flippy (flippy) | ✔ | ✔ | |
Add Next/previous links to node view for specific content types - e.g. image gallery. Powerful - supports: next/last, random link, you can specify exact text used etc. Currently a dev version in D8. Setup: activate for a content type in the 'Edit' tab (NOT manage display). Once Flippy is active, Manage Display tab will have a pager field so you can reposition the links relative to other fields on the page (e.g. above or below image). |
|||
Flag (flag) | ✔ | ✔ | |
"Essential" Handle favourites, reading lists, spam, friend lists etc. Can be applied to any entity (nodes, users, comments etc.) It appears as a clickable link. Can choose between page reload and AJAX when user toggles it. Linked with views, and you can trigger events when flag count reaches a threshold. |
|||
Field Tools (field_tools) | ✔ | ✔ | |
"Essential" Provides:
|
|||
Field Permissions (field_permissions) | ✔ | ✔ | |
"Essential" Control editing/visibility of individual fields by role. As well as custom settings ('create own', 'edit own', 'view own', 'edit any' and 'view any' - all per role), there's a Private setting which gives access to the author and administrator only. These are automatically applied to views. Finding the setting: Look for Field visibility and permissions – on the Edit tab, NOT Field Settings. In /admin/people/permissions there's also a Access other users private fields permission. |
|||
Field group (field_group) | ✔ | ✔ | |
"Essential" Add group' button to /admin/config/people/accounts/form-display (or any other form), can then group fields inside fieldset/other HTML wrappers.
Types of groups:
In theory can use this to add <div>s with css styles such as flexbox, like webform uses, but CSS to support that needs to be present on the page. |
|||
Field Formatter Condition (fico) | ✔ | ✔ | |
(based on ffc which hasn't been ported to D8). Allows you to configure field display based on value. Adds a 'Conditions' pane to the cog in Manager Display of all entities (so content types but also comment types, e.g. if you have comments with multiple fields) Requires Display Suite (ds) Note: if you wanted to hide say a checkbox when it's value is false - you can do in it core with Manage Display - turn the label off then set (via cog wheel) the output format to Custom, and you can enter a value for true and leave false blank - exactly the same widget for boolean values you use when setting the output of a field in a view. |
|||
Field collection (field_collection) | ✔ | ✖ | |
Allows you to group a set of fields together. In active development for D8 but still a lot of open bugs at time of writing - project page says it will likely be replaced by Paragraphs. |
|||
Feeds (feeds) | ✔ | ✖ | |
"Essential" As of Sep 2018, up to alpha3 in D8 (but not personally tested). Lets you import CSV/RSS etc. files and various other formats and map them to nodes/user/taxonomy terms, either one-off or periodically. |
|||
Features (features) | ✔ | ✖ | |
Not recommended Update: most people are now moving away from features. There is a Configuration Management initiative under discussion in Drupal 8. Package up selected configuration for "features" (e.g. a blog or a photo gallery etc.) for reuse on other sites. Not the same as the new D8 Config sync, which is for exchanging configs between different environments of the same site and requires a cloned DB sharing the same UUIDs. |
|||
Exclude Node Title (exclude_node_title) | ✔ | ✔ | |
There are situations where you will want to hide a node title - e.g. if you have a view and insert an image field that's an entity reference to another content type. Module allows you to hide titles by content type or view mode and for all nodes or just a custom selection. Beta in D8. |
|||
Environment Indicator (environment_indicator) | ✔ | ✔ | |
"Essential" Change the colour of the admin menu according to whether you're using dev, staging, production etc. (You can also add 'switcher' menu links, e.g. Open in dev, Open in Prod). Notes: - need to reset the cache after you've made changes [#2406619] |
|||
Entityqueue (entityqueue) | ✔ | ✔ | |
Build a custom list of nodes. The setup is via Admin > Structure. Currently D8 alpha. |
|||
Entity Embed (entity_embed) | ✔ | ✔ | |
Lets you insert any entity type (supposedly) via the WYSIWYG editor, and like images you can set alignment etc. It creates a toolbar button that can be added to the toolbar configuration in 'Text formats and editors'. The strings needed can be pretty long - e.g. <drupal-entity data-embed-button="snippet" data-entity-embed-display="entity_reference:entity_reference_entity_id" data-entity-type="snippet" data-entity-uuid="216914ab-1bc2-4a73-975b-dc1de79e849a"></drupal-entity> |
|||
Entity Access Audit (entity_access_audit) | ✔ | ✖ | |
This is a way of visualising - via grids of ticks and crosses - which roles have access to different operations on different entities. |
|||
Double Field (double_field) | ✔ | ✔ | |
"Essential" Store a pair of fields together (numbers and text, boolean, email, telephone, Url). As normal you can specify the quantity of double fields per entity, or allow an unlimited number. Note: D7 version doesn't support 'date'. Don't use it for:
|
|||
Devel (devel) | ✔ | ✔ | |
"Essential" Key features:
|
|||
Datetime Range (datetime_range) | ✔ | ✖ | |
"Essential" Now in core, but you need to enable it. Adds an 'all-day' option. |
|||
D8 Editor Advanced link (editor_advanced_link) | ✔ | ✔ | |
Adds options should as choice of target, title, class ID etc. to the link dialog in CKEditor. Needs configuring after install. |
|||
Custom Add Another (custom_add_another) | ✔ | ✔ | |
"Essential" The default button text for 'unlimited' fields where you can add multiple items is "Add another item". You might want to change this. This module lets you do it per field bundle - there are a couple of text options (for add and remove) added to the field edit screen. NB: this is not the 'Save and add another' button for an entire content type, just the one that handles the javascript for individual fields with multiple entries. |
|||
CSS Editor (css_editor) | ✔ | ✔ | |
"Essential" If you only need a small amount of CSS, or want users to be able to directly edit it through the admin UI rather than creating a theme or module. Caveat: doesn't work for admin themes (at least on D7) |