Modules and Plugins with Known Issues

A list of Drupal modules and WordPress plugins that are not supported and/or require workarounds.


This article lists modules and plugins that may not function as expected or are currently problematic on the Pantheon platform. This is not a comprehensive list. We continually update it as problems are reported and/or solved. If you are aware of any modules or plugins that do not work as expected, please contact support.

We do not prevent you from installing and using these plugins/modules; however, they may not work as expected and we cannot provide troubleshooting support.

Plugin & Module Maintainers: If your work is listed here, please reach out to us; we're happy to help provide information that can lead to conflict resolutions between your code and the platform. If your work is already updated but still listed here, let us know so we can remove it, or submit a pull request.

Drupal Modules


APC - Alternative PHP Cache

Issue: APC is in-memory and limited to a single instance. It cannot span multiple server environments.

Solution: Pantheon recommends Redis as a caching backend, which has better performance.


Adaptive Image Styles

Issue: This module requires edits to the nginx.conf which is not currently supported on the platform. See Platform Considerations and https://www.drupal.org/node/1669182.


Apache Solr Multilingual

Issue: When the Apache Solr Multilingual module is enabled, the default class variable set by the Pantheon Apache Solr module is changed, and the site will be unable to connect to the Solr server.

If you have already enabled the Apache Solr Multilingual module and found that your site can no longer connect to the Solr server, you will need to first disable and uninstall the module. Next, disable and re-enable the Pantheon Apache Solr module. This will add the class variable back so your site can connect to the Solr server again.


Acquia Search

Issue: If Acquia Solr modules are present in the site codebase (even if disabled) and Pantheon Apache Solr is enabled, the site will be unable to connect to Solr server.

Solution: Delete the Acquia Solr modules from the codebase and then disable and re-enable the Pantheon Apache Solr module.


Background Process

Issue: The module allows for Drupal to perform "parallel" (asynchronous non-blocking mode) requests. However, there are a number of limitations working in a distributed environment and function correctly on the platform. See https://www.drupal.org/node/2233843.


Backup and Migrate

Issue: The Backup and Migrate module can create large archives and cause issues with the tools in the Database / Files tab of the Dashboard. See Backup Creation.

Solution: You can use the automated backups that are available on the Dashboard for each environment. If you want to access your backups and copy it to your own repository (Amazon S3, FTP server, etc), consider using a bash script. You can do that by running it in your local system, or use an external server, or a service that runs cron jobs for you. See Access Backups for more details.


Basic HTTP Authentication - Drupal 7 only

Issue: This contrib module conflicts with Pantheon's Security tool when both are enabled on Drupal 7 sites, resulting in 403 errors.

Solution: Lock the environment via Pantheon's Security tool or via the module, not both. For details, see Security on the Pantheon Dashboard.


BigPipe

Issue: The Pantheon Edge layer buffers text output, and BigPipe depends on being able to stream text output. Since BigPipe provides no benefit on Pantheon sites, we recommend disabling it.


Boost

Issue: Boost is an unnecessary caching layer that may cause issues. Every site on Pantheon can leverage our robust page caching infrastructure that returns pages for anonymous visitors at the highest possible performance. See Pantheon's Global CDN.


Cache Expiration

Issue: This module doesn't support Pantheon's granular cache clearing and header system.

Solution: Install the Pantheon Advanced Page Cache module to dynamically purge content from cache on content update.


CKFinder

Issue: If you follow the installation instructions for CKFinder, the $baseUrl path is not correctly set and will not recognize any path set via CKFinder. See this Drupal.org issue.

Solution: Manually edit the ckfinder/config.php file and edit the following line to the desired path:

$baseUrl = '/ckfinder/userfiles/';

Composer Manager

This module has been deprecated by its authors. The suggestions made below are not guaranteed to be successful in all use cases.

Issue: Composer Manager expects write access to the site's codebase via SFTP, which is prevented in Test and Live environments on Pantheon by design.

Solution: As suggested within the module documentation, manage dependencies in Dev exclusively. Place the following configuration within settings.php to disable autobuild on Pantheon. This will also set appropriate file paths for Composer so that checks to see if the path is writable will not fail. Packages, however, are stored within the root directory of the site's codebase and version controlled:

if (isset($_ENV['PANTHEON_ENVIRONMENT'])) {
  # Set appropriate paths for Composer Manager
  $conf['composer_manager_file_dir'] = 'private://composer';
  $conf['composer_manager_vendor_dir'] = $_SERVER['HOME'] . '/code/vendor';
  # Disable autobuild on Pantheon
  $conf['composer_manager_autobuild_file'] = 0;
  $conf['composer_manager_autobuild_packages'] = 0;
}

You also need to create the directory path sites/default/files/private/composer.

This disables auto-building in all Pantheon environments. This will allow Drush commands such as pm-enable and pm-disable to function correctly in both Git and SFTP modes as Composer Manager will only update packages and the autoloader when explicitly told to do so via drush composer-manager [COMMAND] [OPTIONS] or drush composer-json-rebuild. This is the setting recommended by Pantheon. While composer.json can be rebuilt via Terminus while the DEV site is in SFTP mode, composer install must be run locally, committed via Git, and pushed back to Pantheon.


Fast 404

Issue: Database connection credentials are needed before Drupal bootstrap is invoked and standard MySQL is port hard-coded.

Solution: Pressflow settings can be decoded in settings.php to provide database credentials, but the module needs to be modified manually to use $_ENV(["DB_PORT"]).

Alternatively, Drupal 7 and Drupal 8 cores provide a basic version of this same feature via configuration in settings.php.


Front

Issue: The Drupal 7 version of the module disables caching for the front page.

Solution: Apply a patch to the module to allow caching for anonymous users. Note that this patch doesn't work with the Full or Redirect options.


HTTP Basic Authentication - Drupal 8 (core)

Issue: This Drupal 8 core module conflicts with Pantheon's Security tool when both are enabled, resulting in 403 errors.

Solution: Lock the environment via Pantheon's Security tool or via the module, not both. For details, see Security on the Pantheon Dashboard.


HTTPRL - HTTP Parallel Request & Threading Library

Issue: This module can severely impact performance. This may be the result of module code or its configuration on the platform that results in the spikes.


IMCE 6.x and IMCE 7.x

Issue: Operations on directories containing an inordinate amount of files will likely hit the load balancer timeout threshold (30 seconds).

Solution: One solution is to break up the files into smaller groups so that directories are less populated. Another option is to rewrite imce_image_info() so that your site's caching backend (Database or Redis) is used for operations on highly populated directories:

  1. Enable Redis, otherwise the database cache is utilized. (Depending on your site's configuration, you may not need to enable Redis.)
  2. Edit imce/inc/imce.page.inc and replace the contents of imce_image_info() with:

    $cache_key = 'imce-' . $file;
    $cache = cache_get($cache_key);
    if ($cache) {
    return $cache->data;
    }
    if
    (is_file($file) && ($dot = strrpos($file, '.')) &&
    in_array(strtolower(substr($file, $dot+1)), array('jpg', 'jpeg',
    'gif','png')) && ($info = @getimagesize($file)) &&
    in_array($info[2], array(IMAGETYPE_JPEG, IMAGETYPE_GIF, IMAGETYPE_PNG)) )
    {
    $result = array('width' => $info[0], 'height' => $info[1], 'type' => $info[2], 'mime' => $info['mime']);
    cache_set($cache_key, $result);
    return $result;
    }
    return FALSE;
    }
    
  3. Clear caches on the Dev environment. The first action to populate cache will take longer than subsequent requests.

You can modify this patch according to your needs, such as performing an operation post upload and/or specifying a particular cache bin.

LiveReload

Issue: This module triggers heavy load on the application container as soon as it is enabled and causes pages to time out for anonymous users for Drupal 7 and Drupal 8.


Live CSS

Issue: This module requires write access to the site's codebase for editing CSS files, which is not granted on Test and Live environments by design.


Media

Issue: This module requires the use of the /tmp directory. See Using the tmp Directory section below.


Media: Browser Plus

Issue: This module requires the use of the /tmp directory. See Using the tmp Directory section below.


Mobile Tools

Issue: Conflicts with platform page caches. See this thread for details.


Node export webforms

Issue: This module requires the use of the tmp directory. See Using the tmp Directory section below.

Solution: Use drush, as this uses a single application container to process the export. The relevant drush command is webform-export (alias wfx).

Customers have also reported success by making the export path configurable.


Node Gallery

Issue: Using Node Gallery with Plupload attaches cookies to image uploads for authentication purposes. This conflicts with our page cache configuration as we strip all cookies for images, CSS, and JS files to improve performance.


Pathologic

Issue: The path of the base URL is changed and cached by the module itself.

Solution: The documentation on Drupal.org for the module mentions the issues and the remedy, which is a cache clear operation. If you are unable to exclude cached data from your dumps or avoid migrating cache data, you should clear your site's cache after importing the data.

Additionally, Pathologic can cause the change of base URLs in a domain access configuration based on the value of $options['url'] in the site Drush config. This is set to the first domain listed on an environment by default on Pantheon, which can result in unexpected root domains being written to the cache. See our Drush documentation for more information about overriding this value.

Persistent Login

Issue: This module attaches per-user cookies that conflict with our page cache configuration.

Solution: Follow the remedy provided within the module's documentation of the issue on Drupal.org, which is to alter the code to prefix the cookie name with SESS.


Plupload

Issue: This module requires the use of the /tmp directory. See Using the tmp Directory section below.

Solution: A possible solution is to set the plupload_temporary_uri variable in settings.php. Example:

$conf['plupload_temporary_uri'] ='private://tmp';

You may also need to add this line within the filefield_sources_plupload.module file to run through files/private/tmp every few hours and delete old files to keep it from piling up:

$temp_destination = file_stream_wrapper_uri_normalize('private://tmp/' . $filename);

This will move the temporary upload destination from the individual server mount tmp directory to the shared mount tmp files/private/tmp directory, which should preserve the files between requests.


reCAPTCHA

Issue: If your site is running PHP 5.3, form submissions that use the reCAPTCHA module might continually fail and display the error: The answer you entered for the CAPTCHA was not correct. This is because the default arg_separator.output for PHP 5.3 is & while for PHP 5.5 it is &.

Solution: Override the default arg_separator.output value in settings.php by adding the following line:

ini_set('arg_separator.output', '&');

Registry Rebuild

This is built into the platform. See Drupal Drush Command-Line Utility for details on how to use Registry Rebuild on Pantheon.


Schema

Issue: The module doesn't work with the MySQL TIMESTAMP column type in our heartbeat table, which is part of how we maintain status around whether or not a site and its database is active. This is a known bug in the schema module.

Solution: Set a variable to suppress the error, shown here. Setting the variable schema_suppress_type_warnings to true will do it. You can achieve that by adding the following line to settings.php:

$conf[‘schema_suppress_type_warnings’] = TRUE;

Simple OAuth / OAuth 2.0

Issue: The module requires a very specific set of permissions for the folder and the keys to be uploaded. Using Private or non-standard filepaths won't work. It is not possible to change these in LIVE or TEST environment.

Solution: You can try to patch the permission check in the module. The alternative is to use off-site key management tools like Lockr


Taxonomy CSV

Issue: This module requires the use of the /tmp directory. See Using the tmp Directory section below.


Twig Extensions

Issue: This module uses php-intl, which is not currently supported by Pantheon.


Varnish

Issue: Conflicts with the existing platform configuration.

Solution: Update Drupal performance settings to set the TTL and have the platform page cache serve requests. See Pantheon's Global CDN


Views data export

Issue: This module requires the use of the /tmp directory. See Using the tmp Directory below for more information.

Solution: A possible solution would be to set the export directory in settings.php to a public:// stream wrapper location versus a temporary:// one. Example:

$conf['views_data_export_directory'] = 'public://';

or to a specific directory:

$conf['views_data_export_directory'] = 'public://vde/';

Additionally, the variable can be set using Drush:

drush vset views_data_export_directory 'public://'

Also see Multiple Servers + Batch Database Stream Wrapper (sandbox module).


WordPress Plugins

All-in-One WP Migration

Issue: Full site backups are exported to the wp-content/ai1wm-backups directory, which is tracked in Git. Large backup files tracked in Git can cause problems with platform backups, deploys and other workflows.

The plugin also requires write access to wp-content/plugins/all-in-one-wp-migration/storage, which is not permitted on Test and Live environments on Pantheon by design. For additional details, see Using Extensions That Assume Write Access.

Solution: You can create and download full backups from your Dashboard.

Autoptimize

Issue: Autoptimize assumes write access to the site's codebase within the wp-content/resources directory, which is not granted on Test and Live environments on Pantheon by design. For additional details, see Using Extensions That Assume Write Access.

Solution: Configure Autoptimize to write files within the standard wp-content/uploads path for WordPress (wp-content/uploads/autoptimize) by adding the following to wp-config.php:

/** Changes location where Autoptimize stores optimized files */
define('AUTOPTIMIZE_CACHE_CHILD_DIR','/uploads/autoptimize/');

Be sure to add this configuration above the comment to stop editing:

Autoptimize configuration

For additional details, see the Autoptimize FAQ. An alternative solution is to create a symbolic link.


Bookly

Issue: Sessions are implemented in a way that will not allow it to function with the WP Native Sessions plugin, either installed as a regular plugin or an mu-plugin. Follow this issue on the WordPress support forum.


Issue: A low value set for "Check link every X hours" can consume a large amount of server resources.

Solution: Ensure that the value is set for the default of 72 hours or greater.


Contact Form 7

Issue: This plugin relies on $_SERVER['SERVER_NAME'] and $_SERVER['SERVER_PORT'], which pass static values subject to change overtime during routine platform maintenance.

Solution: Add the following to wp-config.php:

$_SERVER['SERVER_NAME'] = $_SERVER['HTTP_HOST'];

if (isset($_ENV['PANTHEON_ENVIRONMENT'])) {
  if (isset($_SERVER['HTTP_USER_AGENT_HTTPS']) && $_SERVER['HTTP_USER_AGENT_HTTPS'] === 'ON') {
    $_SERVER['SERVER_PORT'] = 443;
  }
  else {
    $_SERVER['SERVER_PORT'] = 80;
  }
}

For more details, see SERVER_NAME and SERVER_PORT on Pantheon.


Caching Plugins (e.g. Batcache, W3 Total Cache, or WP Super Cache)

Issue: Conflicts with platform-level page caching.

Solution: See Caching: Advanced Topics for details on how to bypass the platform page cache.


Force Login

Issue: This plugin appends a port number using $_SERVER['SERVER_PORT'] at the end of the URL when the user logs in to the site.

Solution: See Set SERVER_PORT Corectly.


Instashow

Issue: The Instashow plugin relies on query parameters that are not compatible with Pantheon's Edge Cache. See PANTHEON_STRIPPED for more information. This inhibits the ability to set the authorization token required to make the plugin function.


Maintenance Mode

Issue: Maintenance Mode causes a redirect loop on all pages for logged out users when the maintenance mode option is checked.

Solution: If you are locked out of your site, wp-login.php will still function and you can login to disable the maintenance mode plugin.


Monarch Social Sharing

Issue: Seems to break WP-CLI, which is used by many of our workflows (clone, clear cache).


NextGEN Gallery

Issue: NextGEN Gallery assumes write access to the site's codebase within the wp-content/gallery directory, which is not granted on Test and Live environments on Pantheon by design. For additional details, see Using Extensions That Assume Write Access.

Solution: This can be overridden from the plugin's configuration page (/wp-admin/admin.php?page=ngg_other_options) to use wp-content/uploads/gallery/.

An alternative solution is to create a symbolic link.


Query Monitor

Issue: Creates a symlink with an absolute path, which will only work on the appserver where the plugin was installed. The plugin is not fully designed for cloud or multi server environments.

Alternatives: Pantheon has tools in place to monitor database queries: MySQL Slow Log MySQL Troubleshooting with New Relic Pro


Revive Old Post

Issue: Revive Old Post does not set a proper callback via OAuth and the Twitter module. It attempts to use ["SERVER_NAME"] instead of the recommended ["HTTP_HOST"]. See SERVER_NAME and SERVER_PORT on Pantheon.


Timthumb

Issue: TimThumb is no longer supported or maintained.


TubePress Pro

Issue: Sites running PHP version 5.3 produce a WSOD after activating this plugin.

Solution: Upgrade your site's PHP version to 5.5, 5.6, or 7.0.


UNLOQ Two Factor Authentication (2FA)

Issue: This widget does not work on this domain error message shown after deploying plugin across environments on Pantheon. This is because the API credentials used on the original environment are being used on a new environment URL, which is not allowed by the plugin. This is by design.

Solution: Manually change unloq_credentials key in thewp_options table. Alternatively, you can re-create an application by resetting your plugin installation (deactivate, delete entries, etc.).

For an alternative 2FA plugin, see Secure Your Site with Two-Factor Authentication.


Visual Composer: Page Builder

Issue: This plugin requires write access to the site's codebase for editing files, which is not granted on Test and Live environments by design.


Weather Station

Issue: This module uses php-intl, which is not currently supported by Pantheon.

WooCommerce

Issue: The "batch upload" process can fail during large uploads. The platform has a 120 second timeout limit for scripts, and large upload processes can hit this limit.

Solution: The suggested workaround is to clone the site locally, import the items, then sync the database back up to the platform.

WooZone

Issue #1: This plugin checks WP_MEMORY_LIMIT, which defaults to 40MB, instead of ini_get('memory_limit'), creating this notice:

WooZone Error

Solution: Add the following line to wp-config.php:

define('WP_MEMORY_LIMIT', '256M');

Issue #2: WooZone writes to a cache folder in wp-content/plugins/woozone/, which is not editable in Test and Live

Solution: Symlink wp-content/plugins/woozone/cache to a folder in wp-content/uploads/. For details, see Using Extensions That Assume Write Access.


Wordfence

Issue #1: Enabling the Live Traffic tracking feature within Wordfence sends cookies which conflict with platform-level page caching.

Solution: Disable Wordfence-generated cookies by disabling Live Traffic within the Wordfence options page. See the WordPress support forum for details.

Issue #2: The Wordfence firewall expects specific write access to wp-content/wflogs during activation. Adding a symlink does not mitigate this, so using the Wordfence firewall is not supported on the platform. This has been reported as an issue within the plugin support forum.

Issue #3: The Wordfence firewall installs a file called .user.ini that includes wordfence-waf.php from the absolute path which uses the application container's ID. These paths will change from time to time due to routine platform maintenance. When a container is migrated and when this plugin is deployed to another environment the absolute path is no longer valid resulting in a WSOD. This has been reported as an issue within the plugin support forum.


WordPress Social Login

Issue #1: This plugin attempts to access PHP native sessions before WordPress has been bootstrapped, which prevents the Pantheon PHP native sessions plugin from being called. This leads to a 500 error when authenticating with external services.

Solution: While not recommended, you can add the following lines to wp-config.php before the first call to session_start:

if (defined( "PANTHEON_BINDING" )) {
  include_once( "/srv/bindings/". PANTHEON_BINDING ."/code/wp-blog-header.php" );
}

Please note: You will need to make this change every timethat the plugin is updated.

Issue #2: This plugin creates a session on every page, which can prevent page level caching.


WP Fastest Cache

Issue #1: This plugin requires write access to a cache folder in wp-content/cache, which is not granted on Test and Live environments by design.

Solution: Symlink wp-content/cache to a folder in wp-content/uploads/. For details, see Using Extensions That Assume Write Access

Issue #2: This plugin uses is_dir to verfiy the target directory, which will return false if the directory is a symlink. This causes a permissions error when deleting cache files.


WPML - The WordPress Multilingual Plugin

Issue: Locking an environment prevents WPML from operating and returns the following error: It looks like languages per directories will not function.

Solution: Make the environment public within the Site Dashboard. For details, see Security on the Pantheon Dashboard.


Yoast SEO

Issue: The redirects for Yoast SEO setting will detect two options for redirect methods, "PHP", and "Web Server". The Web Server option expects write access to the nginx.conf file, which is not writable on Pantheon.

Solution: Only use the "PHP" redirect method.


WordPress Themes

Jupiter

Issue: This theme presents a form requesting FTP credentials in order to automatically update its components. This will appear on Dev, Test and Live environments and can be hidden with CSS, but is still present.

Solution: The form can be disabled by adding the following to wp-config.php:

/** Changes to disable Jupiter theme FTP form */
define('FS_METHOD', 'direct');
define('FS_CHMOD_DIR', ( 0755 & ~ umask() ) );
define('FS_CHMOD_FILE', ( 0755 & ~ umask() ) );
define('FTP_BASE', DIR);
define('FTP_CONTENT_DIR', DIR .'/wp-content/');
define('FTP_PLUGIN_DIR', DIR .'/wp-content/plugins/');

WordPress Functions

add_management_page()

Issue: Adding a submenu page to the Tools main menu using WordPress roles and capabilities that would read or write files to core, themes, or plugins, is not supported.

For example, the install_plugins capability isn't present on the Test or Live environment, therefore menus created with it will not display. For example:

hook = add_management_page( 'My WP Tool Page', 'My WP Tool',
  'install_plugins', 'mywptool', array( $this, 'admin_page' ), '' );

add_action( "load-$hook", array( $this, 'admin_page_load' ) );

This is because write permissions are restricted in Test and Live per the Pantheon Workflow.

Solution: You can use another capability such as read_private_posts instead.

The list of WordPress roles and capabilities that should not be relied upon include:

  • update_core
  • update_plugins
  • update_themes
  • install_plugins
  • install_themes
  • upload_plugins
  • upload_themes
  • delete_themes
  • delete_plugins
  • edit_plugins
  • edit_themes

wp_filesystem->get_contents()

Issue: The function wp_filesystem->get_contents() can fail when an environment is in Git mode (as Test and Live always are) because it is aware of filesystem-level permissions which are restricted in this mode.

Solution: As described in this StackExchange answer, for cases where file ownership doesn't matter this function could be replaced with file_get_contents(). This is true of most cases where the file in question is only being read, not written to.

PHP Libraries

Due to the cloud-based infrastructure of the Pantheon platform, certain PHP libraries are not available on the platform.

MSSQL

The MSSQL PHP library used to interface with Microsoft SQL Server databases is not supported on Pantheon for PHP versions below 7.2. See Upgrade PHP Versions to set your PHP version. Please note that Pantheon does not offer MSSQL databases, this library is only available for those connecting to external databases.

Dynamic Outbound IPs

Due to the cloud-based infrastructure of the Pantheon platform, outbound requests are served by dynamic IP addresses. If your site relies on a static IP address for outgoing requests, the recommended solution is the Pantheon Enterprise Gateway. This is the only way to guarantee compatibility with extensions or services that require a known outgoing IP. Otherwise, you will need to find an alternative to accomplish the request. For more information, see Dynamic Outgoing IP Addresses.

Using the tmp Directory

Issue: Extensions that require the use of the /tmp directory are not supported. With multiple application containers, as exists on Live environments, it's assumed the /tmp directory will be on the same application container. However, as we run a distributed application container matrix, the /tmp directory is not shared.

Solution: For more details, see Temporary File Management.