Keeping WordPress running smoothly in multiple environments throughout the development and support process can feel a bit like juggling chainsaws, but it doesn't have to.
Here at Flywheel, we develop and deploy code in a minimum of three separate environments: local, staging, and production. Each of these environments needs a dedicated configuration. There are a number of different ways to supply environment-specific configurations to WordPress, and over the years we have used most methods out there before finally landing on PHP dotenv to define configuration values to be consumed by a modified version of
PHP dotenv is a library that provides an easy and unobtrusive method of defining custom environment variables. Environment-specific configuration values can then be set in a
.env file. This new file should not be committed to your version control system. This way, it applies solely to the environment it resides on.
As a simple example, let's migrate some basic database configuration values to be supplied via the
Firstly, we need to require the PHP dotenv package using Composer:
composer require vlucas/phpdotenv
Once PHP dotenv is installed, we need to update our wp-config.php file to include the library and initialize it. Add the following code above the first configuration definition:
require_once 'vendor/autoload.php'; $dotenv = new Dotenv\Dotenv(__DIR__); $dotenv->load();
Now that we have PHP dotenv included and initialized, we can go ahead and update the configuration values to use our environment variables. For this tutorial, we'll be updating
DB_HOST to be retrieved from the
.env file. In this example, we'll use a standard PHP 7 null coalescing operator for supplying a default, however you may find writing a dedicated function or method helpful as you expand your usage.
// ** MySQL settings - You can get this info from your web host ** // /** The name of the database for WordPress */ define('DB_NAME', $_ENV['DB_NAME'] ?? 'database_name_here')); /** MySQL database username */ define('DB_USER', $_ENV['DB_USER'] ?? 'username_here')); /** MySQL database password */ define('DB_PASSWORD', $_ENV['DB_PASSWORD'] ?? 'password_here')); /** MySQL hostname */ define('DB_HOST', $_ENV['DB_HOST'] ?? 'localhost'));
The final step is to create our
.env file in the project root and define our new environment variable keys and values:
DB_NAME=database_name_here DB_USER=username_here DB_PASSWORD=password_here DB_HOST=localhost
Our modified version of wp-config.php should now look like this:
<?php /** * The base configuration for WordPress * [...] */ // ** MySQL settings - You can get this info from your web host ** // /** The name of the database for WordPress */ define('DB_NAME', $_ENV['DB_NAME'] ?? 'database_name_here')); /** MySQL database username */ define('DB_USER', $_ENV['DB_USER'] ?? 'username_here')); /** MySQL database password */ define('DB_PASSWORD', $_ENV['DB_PASSWORD'] ?? 'password_here')); /** MySQL hostname */ define('DB_HOST', $_ENV['DB_HOST'] ?? 'localhost')); /** Database Charset to use in creating database tables. */ define('DB_CHARSET', 'utf8'); /** The Database Collate type. Don't change this if in doubt. */ define('DB_COLLATE', ''); [...]
This same method can be used to create a tailored and powerful
wp-config.php file by utilizing more of the available configuration variables. As time goes on, you'll continue finding ways in which you can implement PHP dotenv into your multi-environment development workflow, keeping management and configuration as fluid as possible.
Chris is an extraordinary programmer and source of comedy at Flywheel. Although he once had a desk in the office, he has since relocated to Australia and is our international wing.
More thoughts and ideas from the Flywheel team.