Files
2025-11-29 18:25:40 +08:00

839 lines
18 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# wp-env Configuration Guide
Complete guide to configuring wp-env using `.wp-env.json` and `.wp-env.override.json` files.
## Configuration File Overview
wp-env supports two configuration files:
1. **`.wp-env.json`** - Primary configuration, typically version controlled
2. **`.wp-env.override.json`** - Local overrides, typically gitignored
Place these files in your project root (where you run `wp-env start`).
## Basic Configuration Structure
```json
{
"core": null,
"phpVersion": null,
"plugins": [],
"themes": [],
"port": 8888,
"testsPort": 8889,
"config": {},
"mappings": {},
"mysqlPort": null,
"phpmyadminPort": null,
"multisite": false,
"lifecycleScripts": {},
"env": {
"development": {},
"tests": {}
}
}
```
## Configuration Fields
### Core WordPress Installation
**Field:** `core`
**Type:** `string | null`
**Default:** `null` (latest production WordPress)
Specifies which WordPress installation to use.
```json
{
"core": null
}
```
**Options:**
| Value Type | Format | Example |
|------------|--------|---------|
| Latest WordPress | `null` | `"core": null` |
| Specific version | `"WordPress/WordPress#<version>"` | `"core": "WordPress/WordPress#6.4.0"` |
| Development trunk | `"WordPress/WordPress#master"` | `"core": "WordPress/WordPress#master"` |
| Local path (relative) | `".<path>"` or `"~<path>"` | `"core": "../wordpress-develop/build"` |
| Local path (absolute) | `"/<path>"` or `"<letter>:\<path>"` | `"core": "/Users/you/wordpress"` |
| Git repository | `"<owner>/<repo>#<ref>"` | `"core": "WordPress/WordPress#trunk"` |
| SSH repository | `"ssh://user@host/<path>.git#<ref>"` | `"core": "ssh://git@github.com/WordPress/WordPress.git"` |
| ZIP file | `"http[s]://<url>.zip"` | `"core": "https://wordpress.org/wordpress-6.4.zip"` |
**Environment Variable Override:** `WP_ENV_CORE`
```bash
WP_ENV_CORE="WordPress/WordPress#trunk" wp-env start
```
### PHP Version
**Field:** `phpVersion`
**Type:** `string | null`
**Default:** `null` (default WordPress production PHP version)
Specifies the PHP version to use.
```json
{
"phpVersion": "8.1"
}
```
**Supported versions:** Any version supported by WordPress (e.g., "7.4", "8.0", "8.1", "8.2")
**Environment Variable Override:** `WP_ENV_PHP_VERSION`
```bash
WP_ENV_PHP_VERSION="8.1" wp-env start
```
### Plugins
**Field:** `plugins`
**Type:** `string[]`
**Default:** `[]`
List of plugins to install and activate.
```json
{
"plugins": [
".",
"WordPress/classic-editor",
"../my-local-plugin",
"https://downloads.wordpress.org/plugin/akismet.zip"
]
}
```
**Source Types:** Same as `core` field (paths, GitHub repos, ZIP files, etc.)
**Behavior:**
- All plugins are automatically activated
- Current directory (`.`) is auto-detected as a plugin if it contains a plugin header
- Use `mappings` instead if you don't want auto-activation
### Themes
**Field:** `themes`
**Type:** `string[]`
**Default:** `[]`
List of themes to install.
```json
{
"themes": [
".",
"WordPress/theme-experiments"
]
}
```
**Source Types:** Same as `core` field
**Behavior:**
- Themes are installed but not activated
- Activate via WP-CLI: `wp-env run cli wp theme activate your-theme`
### Ports
**Field:** `port`
**Type:** `integer`
**Default:** `8888`
Primary port for the development environment.
```json
{
"port": 4000
}
```
**Access:** <http://localhost:4000>
**Environment Variable Override:** `WP_ENV_PORT` (takes precedence)
```bash
WP_ENV_PORT=4000 wp-env start
```
---
**Field:** `testsPort`
**Type:** `integer`
**Default:** `8889`
Port for the testing environment.
```json
{
"testsPort": 4001
}
```
**Environment Variable Override:** `WP_ENV_TESTS_PORT`
### MySQL Port
**Field:** `mysqlPort`
**Type:** `integer | null`
**Default:** `null` (not exposed to host)
Expose MySQL port to the host machine.
```json
{
"env": {
"development": {
"mysqlPort": 13306
},
"tests": {
"mysqlPort": 13307
}
}
}
```
**Note:** Only available in `env.development` and `env.tests` objects, not at root level.
**Environment Variable Override:**
- `WP_ENV_MYSQL_PORT` (development)
- `WP_ENV_TESTS_MYSQL_PORT` (tests)
**Connection:**
```bash
mysql -h 127.0.0.1 -P 13306 -u root -ppassword wordpress
```
### phpMyAdmin Port
**Field:** `phpmyadminPort`
**Type:** `integer | null`
**Default:** `null` (disabled)
Enable phpMyAdmin web interface.
```json
{
"phpmyadminPort": 9001
}
```
**Access:** <http://localhost:9001>
**Login:** username: `root`, password: `password`
**Environment Variable Override:**
- `WP_ENV_PHPMYADMIN_PORT` (development)
- `WP_ENV_TESTS_PHPMYADMIN_PORT` (tests)
### WP-Config Constants
**Field:** `config`
**Type:** `Object`
**Default:** See Default Constants section
Define wp-config.php constants.
```json
{
"config": {
"WP_DEBUG_LOG": true,
"WP_DEBUG_DISPLAY": false,
"CUSTOM_CONSTANT": "custom-value"
}
}
```
**Special Values:**
- Set to `null` to prevent a constant from being defined
- Boolean, string, and numeric values supported
**Merging Behavior:**
- `config` values are merged between root and `env.*` objects
- Environment-specific values override root values
### Default Constants
**Development Environment:**
```json
{
"WP_DEBUG": true,
"SCRIPT_DEBUG": true,
"WP_PHP_BINARY": "php",
"WP_TESTS_EMAIL": "admin@example.org",
"WP_TESTS_TITLE": "Test Blog",
"WP_TESTS_DOMAIN": "localhost",
"WP_SITEURL": "http://localhost:8888",
"WP_HOME": "http://localhost:8888"
}
```
**Test Environment:**
Same as development, but `WP_DEBUG` and `SCRIPT_DEBUG` are `false`.
**URLs include configured ports:**
If `port: 4000`, then `WP_HOME` becomes `http://localhost:4000`.
### Directory Mappings
**Field:** `mappings`
**Type:** `Object`
**Default:** `{}`
Map local directories to WordPress directories.
```json
{
"mappings": {
"wp-content/mu-plugins": "./mu-plugins",
"wp-content/themes/my-theme": "./themes/my-theme",
"wp-content/plugins/test-plugin": "../test-plugin",
".htaccess": "./.htaccess"
}
}
```
**Use Cases:**
- Add mu-plugins (must-use plugins)
- Mount multiple themes without activating them
- Add plugins without auto-activation
- Map custom directories
- Configure PHP settings via .htaccess
**Merging Behavior:**
- `mappings` values are merged between root and `env.*` objects
- Use for environment-specific mounts
### Multisite
**Field:** `multisite`
**Type:** `boolean`
**Default:** `false`
Enable WordPress multisite installation.
```json
{
"multisite": true
}
```
**Environment Variable Override:** `WP_ENV_MULTISITE`
```bash
WP_ENV_MULTISITE=true wp-env start
```
### Lifecycle Scripts
**Field:** `lifecycleScripts`
**Type:** `Object`
**Default:** `{}`
Execute commands at specific lifecycle events.
```json
{
"lifecycleScripts": {
"afterStart": "node scripts/bootstrap-data.js",
"afterClean": "echo 'Database cleaned'",
"afterDestroy": "rm -rf .cache"
}
}
```
**Available Events:**
- `afterStart` - After `wp-env start` completes
- `afterClean` - After `wp-env clean` completes
- `afterDestroy` - After `wp-env destroy` completes
**Environment Variable Override:**
```bash
WP_ENV_LIFECYCLE_SCRIPT_AFTER_START="npm run setup" wp-env start
```
Format: `WP_ENV_LIFECYCLE_SCRIPT_{EVENT}` (uppercase, snake_case)
**Disable Scripts:**
```bash
wp-env start --scripts=false
```
### Environment-Specific Configuration
**Field:** `env`
**Type:** `Object`
**Default:** `{}`
Override configuration for specific environments.
```json
{
"plugins": ["."],
"config": {
"WP_DEBUG": true
},
"env": {
"development": {
"themes": ["./my-theme"],
"port": 4000
},
"tests": {
"plugins": [".", "woocommerce"],
"config": {
"WP_DEBUG": false
},
"port": 4001,
"mysqlPort": 13306
}
}
}
```
**Merging Rules:**
- **Merged:** `config`, `mappings`
- **Replaced:** `plugins`, `themes`, `port`, `testsPort`, `core`, `phpVersion`, `multisite`
**Available Environments:**
- `development` - Main development environment (port 8888 by default)
- `tests` - Testing environment (port 8889 by default)
## Examples
### Latest stable WordPress + current directory as a plugin
This is useful for plugin development.
```json
{
"core": null,
"plugins": [ "." ]
}
```
### Latest development WordPress + current directory as a plugin
This is useful for plugin development when upstream Core changes need to be tested. This can also be set via the environment variable `WP_ENV_CORE`.
```json
{
"core": "WordPress/WordPress#master",
"plugins": [ "." ]
}
```
### Local wordpress-develop + current directory as a plugin
This is useful for working on plugins and WordPress Core at the same time.
If you are running a `build` of `wordpress-develop`, point `core` to the `build` directory.
```json
{
"core": "../wordpress-develop/build",
"plugins": [ "." ]
}
```
If you are running `wordpress-develop` in a dev mode (e.g. the `dev` watch command or the `build:dev` dev build), then point `core` to the `src` directory.
```json
{
"core": "../wordpress-develop/src",
"plugins": [ "." ]
}
```
### A complete testing environment
This is useful for integration testing: that is, testing how old versions of WordPress and different combinations of plugins and themes impact each other.
```json
{
"core": "WordPress/WordPress#5.2.0",
"plugins": [ "WordPress/wp-lazy-loading", "WordPress/classic-editor" ],
"themes": [ "WordPress/theme-experiments" ]
}
```
### Add mu-plugins and other mapped directories
You can add mu-plugins via the mapping config. The mapping config also allows you to mount a directory to any location in the wordpress install, so you could even mount a subdirectory. Note here that theme-1, will not be activated.
```json
{
"plugins": [ "." ],
"mappings": {
"wp-content/mu-plugins": "./path/to/local/mu-plugins",
"wp-content/themes": "./path/to/local/themes",
"wp-content/themes/specific-theme": "./path/to/local/theme-1"
}
}
```
### Avoid activating plugins or themes on the instance
Since all plugins in the `plugins` key are activated by default, you should use the `mappings` key to avoid this behavior. This might be helpful if you have a test plugin that should not be activated all the time.
```json
{
"plugins": [ "." ],
"mappings": {
"wp-content/plugins/my-test-plugin": "./path/to/test/plugin"
}
}
```
### Map a plugin only in the tests environment
If you need a plugin active in one environment but not the other, you can use `env.<envName>` to set options specific to one environment. Here, we activate cwd and a test plugin on the tests instance. This plugin is not activated on any other instances.
```json
{
"plugins": [ "." ],
"env": {
"tests": {
"plugins": [ ".", "path/to/test/plugin" ]
}
}
}
```
### Custom Port Numbers
You can tell `wp-env` to use a custom port number so that your instance does not conflict with other `wp-env` instances.
```json
{
"plugins": [ "." ],
"port": 4013,
"env": {
"tests": {
"port": 4012
}
}
}
```
These can also be set via environment variables:
- `WP_ENV_PORT` to override the development environment's web server's port.
- `WP_ENV_TESTS_PORT` to override the testing environment's web server's port.
- phpMyAdmin is not enabled by default, but its port can also be overridden for the development and testing environments via `WP_ENV_PHPMYADMIN_PORT` and `WP_ENV_TESTS_PHPMYADMIN_PORT`, respectively.
- By default, MySQL aren't exposed to the host, which means no chance of port conflicts. But these can also be overridden for the development and testing environments via `WP_ENV_MYSQL_PORT` and `WP_ENV_TESTS_MYSQL_PORT`, respectively.
### Specific PHP Version
You can tell `wp-env` to use a specific PHP version for compatibility and testing. This can also be set via the environment variable `WP_ENV_PHP_VERSION`.
```json
{
"phpVersion": "7.2",
"plugins": [ "." ]
}
```
### Multisite support
You can tell `wp-env` if the site should be multisite enabled. This can also be set via the environment variable `WP_ENV_MULTISITE`.
```json
{
"multisite": true,
"plugins": [ "." ]
}
```
### Node Lifecycle Script
This is useful for performing some actions after setting up the environment, such as bootstrapping an E2E test environment.
```json
{
"lifecycleScripts": {
"afterStart": "node tests/e2e/bin/setup-env.js"
}
}
```
### Advanced PHP settings
You can set PHP settings by mapping an `.htaccess` file. This maps an `.htaccess` file to the WordPress root (`/var/www/html`) from the directory in which you run `wp-env`.
```json
{
"mappings": {
".htaccess": ".htaccess"
}
}
```
Then, your .htaccess file can contain various settings like this:
```
# Note: the default upload value is 1G.
php_value post_max_size 2G
php_value upload_max_filesize 2G
php_value memory_limit 2G
```
This is useful if there are options you'd like to add to `php.ini`, which is difficult to access in this environment.
### Using SPX Profiling
SPX is a simple profiling extension for PHP that provides low-overhead profiling with a built-in web UI. When enabled with `--spx`, you can access the SPX profiling interface to analyze your application's performance.
To enable SPX profiling:
```
wp-env start --spx
```
Once enabled, you can access the SPX web UI by visiting any page in your WordPress environment with the query parameters `?SPX_KEY=dev&SPX_UI_URI=/`. For example:
- Development site: `http://localhost:8888/?SPX_KEY=dev&SPX_UI_URI=/`
- Test site: `http://localhost:8889/?SPX_KEY=dev&SPX_UI_URI=/`
From the SPX interface, you can: Enable profiling for subsequent requests View flame graphs and performance metrics Analyze function call timelines Examine memory usage and other performance data
SPX provides a more lightweight alternative to Xdebug for profiling, with minimal performance overhead and an intuitive web-based interface.
## Configuration Override System
### .wp-env.override.json
Create `.wp-env.override.json` for local-only configuration:
```json
{
"port": 3000,
"config": {
"LOCAL_SETTING": "local-value"
}
}
```
**Merging Behavior:**
- Override file values take precedence over `.wp-env.json`
- `config` and `mappings` are merged
- Other fields are replaced
**Example:**
`.wp-env.json`:
```json
{
"plugins": [".", "woocommerce"],
"config": {
"WP_DEBUG": true,
"KEY_1": "value-1"
}
}
```
`.wp-env.override.json`:
```json
{
"plugins": ["."],
"config": {
"KEY_1": "override-1",
"KEY_2": "value-2"
}
}
```
**Result:**
```json
{
"plugins": ["."],
"config": {
"WP_DEBUG": true,
"KEY_1": "override-1",
"KEY_2": "value-2"
}
}
```
**Best Practice:** Add to `.gitignore`:
```gitignore
.wp-env.override.json
```
## Environment Variables
Configuration fields can be overridden via environment variables. See [command-reference.md](command-reference.md) for the complete list of environment variables and their usage.
**Precedence:** Environment variables > `.wp-env.override.json` > `.wp-env.json`
## Source Type Reference
All configuration fields that accept sources (`core`, `plugins`, `themes`) support these formats:
| Type | Format | Example |
|------|--------|---------|
| Relative path | `.<path>` or `~<path>` | `"."`, `"../plugin"`, `"~/projects/theme"` |
| Absolute path | `/<path>` or `<letter>:\<path>` | `"/var/www/plugin"`, `"C:\\projects\\theme"` |
| GitHub repo | `<owner>/<repo>[/<path>][#<ref>]` | `"WordPress/gutenberg"`, `"WordPress/gutenberg#trunk"` |
| SSH repo | `ssh://user@host/<path>.git[#<ref>]` | `"ssh://git@github.com/WordPress/WordPress.git"` |
| ZIP file | `http[s]://<url>.zip` | `"https://downloads.wordpress.org/plugin/akismet.zip"` |
**Notes:**
- GitHub repos without `#<ref>` use the default branch
- Remote sources are downloaded to `~/.wp-env/`
- Relative paths are relative to the directory containing `.wp-env.json`
## Configuration Validation
wp-env validates configuration on startup. Common errors:
### Invalid JSON
```
Error: Failed to parse .wp-env.json
```
Fix: Validate JSON syntax (use a JSON validator or linter).
### Invalid Port Number
```
Error: Port must be a number between 0 and 65535
```
Fix: Use valid port numbers (typically 1024-65535 for user applications).
### Invalid Source Path
```
Error: Could not find source at path: /invalid/path
```
Fix: Verify local paths exist and are accessible.
### Conflicting Ports
```
Error: Port 8888 is already in use
```
Fix: Change port in configuration or stop the conflicting service.
## Best Practices
### Version Control
**Do commit:**
- `.wp-env.json` - Share configuration with team
**Don't commit:**
- `.wp-env.override.json` - Local-only settings
- `~/.wp-env/` - Downloaded sources and environment files
### Team Consistency
Use `.wp-env.json` for shared configuration:
```json
{
"core": "WordPress/WordPress#6.4.0",
"phpVersion": "8.1",
"plugins": ["."],
"config": {
"WP_DEBUG_LOG": true
}
}
```
Use `.wp-env.override.json` for personal preferences:
```json
{
"port": 4000,
"phpmyadminPort": 9001
}
```
### Documentation
Document custom configuration in your project README:
```markdown
## Local Development
This project uses wp-env for local development.
### Setup
1. Install wp-env: `npm -g install @wordpress/env`
2. Start environment: `wp-env start`
3. Access site: http://localhost:8888
### Custom Configuration
- Uses WordPress 6.4.0
- PHP 8.1
- Includes WooCommerce for testing
```
### Environment-Specific Settings
Use `env` for different needs in development vs testing:
```json
{
"plugins": ["."],
"env": {
"development": {
"plugins": [".", "query-monitor"],
"config": {
"WP_DEBUG_DISPLAY": true
}
},
"tests": {
"plugins": ["."],
"config": {
"WP_DEBUG_DISPLAY": false
}
}
}
}
```
### Minimal Configuration
Start minimal, add configuration as needed:
```json
{
"plugins": ["."]
}
```
Then add features incrementally based on requirements.