I use the following setup for testing code against multiple versions of WordPress. These instructions assume that you’ve already created the setup for MAMP development across computers via Dropbox.
WordPress versions
Each separate WordPress version that you plan on testing against needs its own directory in your ~/Dropbox/MAMP
directory. For the purposes of this tutorial, I’ll use versions 4.0 and 4.1. (I use major point releases, updated to the latest version.)
Create the directories for each version in your ~/Dropbox/MAMP
directory:
mkdir ~/Dropbox/MAMP/wp40.dev
mkdir ~/Dropbox/MAMP/wp41.dev
Download each version from the Codex and place the uncompressed files in the appropriate directory.
Create a master wp-config.php
Since Version 2.6, wp-config.php
can be moved to the directory directly above the WordPress application directory. I take advantage of this by creating one single wp-config.php
in my ~/Dropbox/MAMP
directory, instead of having a different wp-config.php
in each WordPress directory.
Plugins and themes
It is hard to test the same version of a plugin or theme against each version of WordPress if each instance has its own plugin directory, and Dropbox does not handle internal symlinks. The solution is to have wp-config.php
handle the theme and plugin location for all of your WordPress instances.
In the ~/Dropbox/MAMP/htdocs
directory, create the master wp-content
directory.
mkdir ~/Dropbox/MAMP/htdocs/wp-content
Copy all of your plugins and themes into their respective wp-content/plugins
and wp-content/themes
directories, and add the following lines to ~/Dropbox/MAMP/wp-config.php
:
[code lang=”php”]
define(‘WP_CONTENT_DIR’, ‘/Users/jmdodd/Dropbox/MAMP/htdocs/wp-content’);
define(‘WP_CONTENT_URL’, ‘http://localhost/wp-content’);
[/code]
I use localhost
to deal with any resource requests for plugins and themes across all of my hosts.
Database and multisite settings
I use a system for naming the corresponding database after each WordPress version so I can cheat and use wp-config.php
to set the database name.
[code lang=”php”]
/**
* Dynamic database name calculation:
* Directory: URL: Database:
* ms40.dev/ http://ms40.dev/ ms40_dev
* ms40.dev/ http://site01.ms40.dev/ ms40_dev
* wp40.dev/ http://wp40.dev/ wp40_dev
*/
if ( isset( $_SERVER[‘SERVER_NAME’] ) ) {
$db = $_SERVER[‘SERVER_NAME’];
} else {
$db = end( explode( ‘/’, $_SERVER[‘PWD’] ) );
}
// If multisite
if ( preg_match( ‘/ms[0-9]{2}/’, $db ) ) {
// Get rid of the site subdomain for database and domain settings
$db = preg_replace( ‘/^site[0-9]{2}\./’, ”, $db );
// Allow multisite setup
define(‘WP_ALLOW_MULTISITE’, true);
/* Uncomment once multisite has been installed
define(‘MULTISITE’, true);
define(‘SUBDOMAIN_INSTALL’, true);
define(‘DOMAIN_CURRENT_SITE’, $db);
define(‘PATH_CURRENT_SITE’, ‘/’);
define(‘SITE_ID_CURRENT_SITE’, 1);
define(‘BLOG_ID_CURRENT_SITE’, 1);
*/
}
// Change the dots to dashes
$db = str_replace( ‘.’, ‘_’, $db );
[/code]
This means that I have to use the same user and password for my database user, but again, this is a quick setup for local testing against multiple versions of WordPress; it is not meant for production use.
Set up debugging
This will write out error files for the current session to the local drive, since I don’t really need or want those to sync between my computers.
[code lang=”php”]
/**
* For developers: WordPress debugging mode.
*
* Change this to true to enable the display of notices during development.
* It is strongly recommended that plugin and theme developers use WP_DEBUG
* in their development environments.
*/
define(‘WP_DEBUG’, true);
if (WP_DEBUG) {
define(‘WP_DEBUG_LOG’, true);
define(‘WP_DEBUG_DISPLAY’, true);
define(‘SAVEQUERIES’, true);
@ini_set(‘error_log’,’/Users/jmdodd/logs/’ . $_SERVER[‘SERVER_NAME’] . ‘/error_log’);
}
[/code]
Command-line hack
Sometimes I do something particularly awful and want to run a PHP script which includes WordPress functions via require( './wp-load.php' );
. This sets up a really basic environment so that I can do things like file imports. WP-CLI would handle this far more gracefully.
[code lang=”php”]
// Server load
if ( isset( $_SERVER[‘SERVER_NAME’] ) ) {
define( ‘DB_NAME’, $db );
// Command-line load
} elseif ( isset( $_SERVER[‘PWD’] ) ) {
$pwd = end( explode( ‘/’, $_SERVER[‘PWD’] ) );
define( ‘DB_NAME’, $db );
define( ‘DOING_AJAX’, true );
define( ‘WP_USE_THEMES’, false );
$_SERVER[‘HTTP_HOST’] = $pwd;
$_SERVER[‘SERVER_NAME’] = $pwd;
$_SERVER[‘REQUEST_URI’] = ‘/’;
$_SERVER[‘REQUEST_METHOD’] = ‘GET’;
}
[/code]