# wp-env Command Reference Complete reference for all `wp-env` commands, options, and environment variables. ## Command Overview | Command | Description | |---------|-------------| | `wp-env start` | Install and start the WordPress environment | | `wp-env stop` | Stop the WordPress environment | | `wp-env clean` | Clean the WordPress databases | | `wp-env run` | Run arbitrary commands in containers | | `wp-env destroy` | Destroy the WordPress environment completely | | `wp-env logs` | Display PHP and Docker logs | | `wp-env install-path` | Get the path where environment files are stored | ## wp-env start Installs and initializes the WordPress environment, including downloading specified remote sources. ``` wp-env start [options] ``` ### Options | Option | Type | Default | Description | |--------|------|---------|-------------| | `--debug` | boolean | `false` | Enable debug output | | `--update` | boolean | `false` | Download source updates and apply WordPress configuration | | `--xdebug` | string | - | Enable Xdebug (see Xdebug section below) | | `--spx` | string | - | Enable SPX profiling (see SPX section below) | | `--scripts` | boolean | `true` | Execute any configured lifecycle scripts | ### Behavior - On first run: Downloads WordPress, creates containers, initializes environment - Subsequent runs: Starts existing environment without changes - With `--update`: Re-downloads sources and re-applies configuration (doesn't overwrite content) ### Environment Variables These environment variables override `.wp-env.json` settings: | Variable | Description | Example | |----------|-------------|---------| | `WP_ENV_PORT` | Development environment web server port | `WP_ENV_PORT=3333 wp-env start` | | `WP_ENV_TESTS_PORT` | Testing environment web server port | `WP_ENV_TESTS_PORT=3334 wp-env start` | | `WP_ENV_MYSQL_PORT` | MySQL port for development environment | `WP_ENV_MYSQL_PORT=13306 wp-env start` | | `WP_ENV_TESTS_MYSQL_PORT` | MySQL port for testing environment | `WP_ENV_TESTS_MYSQL_PORT=13307 wp-env start` | | `WP_ENV_PHPMYADMIN_PORT` | phpMyAdmin port for development | `WP_ENV_PHPMYADMIN_PORT=9001 wp-env start` | | `WP_ENV_TESTS_PHPMYADMIN_PORT` | phpMyAdmin port for testing | `WP_ENV_TESTS_PHPMYADMIN_PORT=9002 wp-env start` | | `WP_ENV_HOME` | Directory for wp-env files | `WP_ENV_HOME="./local" wp-env start` | | `WP_ENV_CORE` | WordPress version/source | `WP_ENV_CORE="WordPress/WordPress#trunk" wp-env start` | | `WP_ENV_PHP_VERSION` | PHP version to use | `WP_ENV_PHP_VERSION="8.0" wp-env start` | | `WP_ENV_MULTISITE` | Enable multisite | `WP_ENV_MULTISITE=true wp-env start` | Note: Environment variables take precedence over `.wp-env.json` values. ### Xdebug Support Enable Xdebug for debugging PHP code: ```bash # Enable with default "debug" mode wp-env start --xdebug # Enable with specific modes wp-env start --xdebug=profile,trace,debug # When using npm run (in local project dependencies) npm run wp-env start -- --xdebug ``` **Xdebug Modes:** - `debug` - Step debugging (default when --xdebug is used) - `develop` - Development aids - `coverage` - Code coverage analysis - `gcstats` - Garbage collection statistics - `profile` - Profiling - `trace` - Function trace See [Xdebug documentation](https://xdebug.org/docs/all_settings#mode) for mode details. **Requirements:** - PHP version >= 7.2 (Xdebug won't install on legacy PHP versions) - IDE configuration for port 9003 **IDE Configuration Example (VS Code):** ```json { "name": "Listen for XDebug", "type": "php", "request": "launch", "port": 9003, "pathMappings": { "/var/www/html/wp-content/plugins/your-plugin": "${workspaceFolder}/" } } ``` ### SPX Profiling SPX is a lightweight profiling extension with a built-in web UI: ```bash # Enable SPX profiling wp-env start --spx # With specific mode wp-env start --spx=enabled ``` **Access SPX UI:** - Development: - Testing: **SPX Features:** - Flame graphs and performance metrics - Function call timelines - Memory usage analysis - Minimal performance overhead See [SPX documentation](https://github.com/NoiseByNorthwest/php-spx) for details. ### Examples ```bash # Basic start wp-env start # Start with updates wp-env start --update # Start with custom port WP_ENV_PORT=4000 wp-env start # Start with Xdebug enabled wp-env start --xdebug # Start with multisite and custom PHP version WP_ENV_MULTISITE=true WP_ENV_PHP_VERSION="8.1" wp-env start # Start with debug output wp-env start --debug ``` ## wp-env stop Stops running WordPress containers and frees the ports. ``` wp-env stop [options] ``` ### Options | Option | Type | Default | Description | |--------|------|---------|-------------| | `--debug` | boolean | `false` | Enable debug output | ### Behavior - Stops all containers for the current project - Preserves all data (database, uploads, configuration) - Frees ports (8888, 8889, etc.) - Containers can be restarted with `wp-env start` ### Example ```bash wp-env stop ``` ## wp-env clean Cleans (resets) WordPress databases. ``` wp-env clean [environment] [options] ``` ### Arguments | Argument | Choices | Default | Description | |----------|---------|---------|-------------| | `environment` | `all`, `development`, `tests` | `tests` | Which environment's database to clean | ### Options | Option | Type | Default | Description | |--------|------|---------|-------------| | `--debug` | boolean | `false` | Enable debug output | | `--scripts` | boolean | `true` | Execute any configured lifecycle scripts | ### Behavior ⚠️ **Warning:** Permanently deletes all posts, pages, media, users (except admin), and other WordPress content. - Resets database to fresh WordPress installation - Preserves WordPress core files and configuration - Keeps admin user (username: `admin`, password: `password`) ### Examples ```bash # Clean tests database only (default) wp-env clean wp-env clean tests # Clean development database wp-env clean development # Clean both databases wp-env clean all ``` ## wp-env run Runs arbitrary commands in Docker containers. ``` wp-env run [options] ``` ### Arguments | Argument | Type | Description | |----------|------|-------------| | `container` | string (required) | The Docker service to run the command on | | `command` | string (required) | The command to run | ### Available Containers | Container | Description | Available Tools | |-----------|-------------|-----------------| | `cli` | WP-CLI environment (development) | wp-cli, composer, phpunit, bash | | `tests-cli` | WP-CLI environment (testing) | wp-cli, composer, phpunit, bash | | `wordpress` | WordPress PHP environment (development) | php | | `tests-wordpress` | WordPress PHP environment (testing) | php | | `mysql` | MySQL database (development) | mysql | | `tests-mysql` | MySQL database (testing) | mysql | | `composer` | Composer environment | composer | | `phpmyadmin` | phpMyAdmin (if enabled) | - | ### Options | Option | Type | Default | Description | |--------|------|---------|-------------| | `--debug` | boolean | `false` | Enable debug output | | `--env-cwd` | string | `"."` | Working directory inside container (relative to WordPress root) | ### Working Directory - Default: WordPress root (`/var/www/html`) - Paths without leading slash are relative to WordPress root - Use `--env-cwd` for commands that need specific directory context ### Argument Parsing Commands with options that conflict with wp-env options require `--` separator: ```bash # This shows wp-env help (--help interpreted by wp-env) wp-env run cli php --help # This shows PHP help (--help passed to php) wp-env run cli php -- --help ``` ### Examples #### WP-CLI Commands ```bash # List users wp-env run cli wp user list # Install and activate a plugin wp-env run cli wp plugin install contact-form-7 --activate # Create a post on tests instance wp-env run tests-cli wp post create --post_title="Test" --post_status=publish # Update permalink structure wp-env run cli "wp rewrite structure /%postname%/" # Open WordPress shell (interactive PHP) wp-env run cli wp shell ``` #### Composer Commands ```bash # Run composer install in a plugin directory wp-env run cli --env-cwd=wp-content/plugins/your-plugin composer install # Update dependencies wp-env run cli --env-cwd=wp-content/plugins/your-plugin composer update # Show installed packages wp-env run cli --env-cwd=wp-content/plugins/your-plugin composer show ``` #### PHPUnit Commands ```bash # Run tests in a plugin wp-env run tests-cli --env-cwd=wp-content/plugins/your-plugin phpunit # Run specific test file wp-env run tests-cli --env-cwd=wp-content/plugins/your-plugin phpunit tests/test-sample.php # Run with coverage wp-env run tests-cli --env-cwd=wp-content/plugins/your-plugin phpunit --coverage-html coverage ``` #### Shell Access ```bash # Open bash shell in CLI container wp-env run cli bash # Open bash in tests container wp-env run tests-cli bash # Run a bash script wp-env run cli bash /var/www/html/wp-content/plugins/your-plugin/scripts/setup.sh ``` #### Direct PHP Execution ```bash # Run PHP script wp-env run cli php /var/www/html/wp-content/plugins/your-plugin/scripts/migrate.php # Execute PHP code directly wp-env run cli php -r "echo phpversion();" ``` ## wp-env destroy Destroys the WordPress environment completely. ``` wp-env destroy [options] ``` ### Options | Option | Type | Default | Description | |--------|------|---------|-------------| | `--debug` | boolean | `false` | Enable debug output | | `--scripts` | boolean | `true` | Execute any configured lifecycle scripts | ### Behavior ⚠️ **Warning:** Permanently deletes: - All Docker containers - All Docker volumes (databases, uploads, etc.) - All Docker networks - All local files in the wp-env home directory Use this when: - Environment is corrupted beyond repair - Need to start completely fresh - Freeing up disk space - Removing wp-env from a project ### Example ```bash # Destroy everything wp-env destroy # Create fresh environment wp-env start ``` ## wp-env logs Displays PHP and Docker logs for the WordPress environment. ``` wp-env logs [environment] [options] ``` ### Arguments | Argument | Choices | Default | Description | |----------|---------|---------|-------------| | `environment` | `development`, `tests`, `all` | `development` | Which environment to display logs from | ### Options | Option | Type | Default | Description | |--------|------|---------|-------------| | `--debug` | boolean | `false` | Enable debug output | | `--watch` | boolean | `true` | Watch for logs as they happen (follow mode) | ### Behavior - Shows PHP error logs and Docker container logs - By default, follows/tails logs in real-time (press Ctrl+C to stop) - Use `--watch=false` to show current logs and exit ### Examples ```bash # View development logs (follows by default) wp-env logs # View testing environment logs wp-env logs tests # View both environments wp-env logs all # Show logs without following wp-env logs --watch=false # View with debug output wp-env logs --debug ``` ## wp-env install-path Gets the path where all environment files are stored. ``` wp-env install-path ``` ### Behavior Returns the absolute path to the directory containing: - Docker files and configurations - Downloaded WordPress core - PHPUnit files - Downloaded plugins, themes, and other sources ### Path Format - Default location: `$WP_ENV_HOME/$md5_of_project_path` - macOS/Windows default: `~/.wp-env/$md5_of_project_path` - Linux default: `~/wp-env/$md5_of_project_path` (for Snap compatibility) ### Example ```bash $ wp-env install-path /home/user/.wp-env/63263e6506becb7b8613b02d42280a49 ``` ## Global Options Options available for all commands: | Option | Type | Default | Description | |--------|------|---------|-------------| | `--debug` | boolean | `false` | Enable debug output for troubleshooting | | `--help` | boolean | `false` | Show help for the command | | `--version` | boolean | `false` | Show wp-env version number | ## Lifecycle Scripts Lifecycle scripts run automatically at certain points. Configure in `.wp-env.json`: ```json { "lifecycleScripts": { "afterStart": "node scripts/setup-e2e.js", "afterClean": "echo 'Database cleaned'", "afterDestroy": "rm -rf custom-cache" } } ``` ### Available Lifecycle Events | Event | When It Runs | Use Cases | |-------|--------------|-----------| | `afterStart` | After `wp-env start` completes | Bootstrap data, run migrations, configure environment | | `afterClean` | After `wp-env clean` completes | Log cleanup, reset custom data | | `afterDestroy` | After `wp-env destroy` completes | Clean up external resources | ### Environment Variable Override Override lifecycle scripts via environment variables: ```bash WP_ENV_LIFECYCLE_SCRIPT_AFTER_START="npm run bootstrap" wp-env start ``` Format: `WP_ENV_LIFECYCLE_SCRIPT_{EVENT_NAME}` (uppercase, snake_case) ## Exit Codes All wp-env commands use standard exit codes: | Code | Meaning | |------|---------| | `0` | Success | | `1` | Error (see error message for details) | ## Tips and Best Practices ### Using with npm Scripts Add wp-env commands to `package.json` for convenience: ```json { "scripts": { "wp-env": "wp-env", "env:start": "wp-env start", "env:stop": "wp-env stop", "env:clean": "wp-env clean all && wp-env start", "env:reset": "wp-env destroy && wp-env start", "wp": "wp-env run cli wp", "composer": "wp-env run cli --env-cwd=wp-content/plugins/your-plugin composer", "test": "wp-env run tests-cli --env-cwd=wp-content/plugins/your-plugin phpunit" } } ``` Then use: `npm run env:start`, `npm run test`, etc. ### Passing Flags to npm Scripts When using `npm run wp-env`, use `--` to pass flags: ```bash # Wrong: --update goes to npm, not wp-env npm run env:start --update # Right: --update passed to wp-env npm run env:start -- --update ``` ### Command Chaining Chain commands for complex workflows: ```bash # Reset and start fresh wp-env clean all && wp-env start # Destroy, recreate, and install a plugin wp-env destroy && wp-env start && wp-env run cli wp plugin install woocommerce --activate ``` ### Checking Environment Status Verify wp-env is running properly: ```bash # Check running containers docker ps # Should show three containers by default: # - wordpress (port 8888) # - tests-wordpress (port 8889) # - mariadb (port 3306) # Check wp-env version wp-env --version # View install path wp-env install-path ``` ### Working with Multiple Projects Each project has its own isolated environment: ```bash # Project 1 cd ~/projects/plugin-a wp-env start # Uses port 8888 # Project 2 (different port) cd ~/projects/plugin-b WP_ENV_PORT=4000 wp-env start # Uses port 4000 ``` ## WordPress PHPUnit Tests wp-env includes WordPress' PHPUnit test files automatically. ### Environment Variable - `WP_TESTS_DIR` - Points to PHPUnit test files location within containers - Files correspond to the installed WordPress version ### Custom wp-tests-config.php Override the default test configuration: ```php // In your bootstrap.php file define('WP_TESTS_CONFIG_FILE_PATH', '/path/to/custom/wp-tests-config.php'); ``` WordPress will use your custom file instead of the default. ### Running Tests ```bash # Run all tests wp-env run tests-cli --env-cwd=wp-content/plugins/your-plugin phpunit # Run specific test file wp-env run tests-cli --env-cwd=wp-content/plugins/your-plugin phpunit tests/test-sample.php # Run with bootstrap file wp-env run tests-cli --env-cwd=wp-content/plugins/your-plugin phpunit --bootstrap=tests/bootstrap.php ``` ## Database Access Direct database access credentials: | Environment | Host | Port | User | Password | Database | |-------------|------|------|------|----------|----------| | Development | `localhost` | `WP_ENV_MYSQL_PORT` (random if not set) | `root` | `password` | `wordpress` | | Testing | `localhost` | `WP_ENV_TESTS_MYSQL_PORT` (random if not set) | `root` | `password` | `wordpress-tests` | **Note:** MySQL ports are not exposed by default. Set `WP_ENV_MYSQL_PORT` or `WP_ENV_TESTS_MYSQL_PORT` to expose them. ### Connecting with MySQL Client ```bash # Expose MySQL port first WP_ENV_MYSQL_PORT=13306 wp-env start # Connect from host mysql -h 127.0.0.1 -P 13306 -u root -ppassword wordpress ``` ### Using phpMyAdmin ```bash # Enable phpMyAdmin on port 9001 WP_ENV_PHPMYADMIN_PORT=9001 wp-env start # Access at http://localhost:9001 # Login: root / password ``` Or configure in `.wp-env.json`: ```json { "phpmyadminPort": 9001 } ```