A comprehensive WordPress environment management utility with typed getters, system detection and secure configuration handling.
- Multi-Source Configuration: WordPress constants, .env files, and getenv() with intelligent priority
- Typed Getters: Type-safe methods for bool, int, float, and array values
- Environment Detection: Automatic development, staging, and production environment detection
- Container Detection: Docker, Kubernetes, Podman, and other containerization detection
- Performance Caching: Smart caching system with sensitive data protection
- Security-Focused: Built-in protection for sensitive configuration values
- WordPress Integration: Native WordPress hooks and filters for customization
- Zero Dependencies: Works with or without external environment libraries
- Bedrock Compatible: Seamless integration with modern WordPress setups
Install via Composer:
composer require wp-spaghetti/wp-env<?php
use WpSpaghetti\WpEnv\Environment;
// Get environment variables with fallbacks
$dbHost = Environment::get('DB_HOST', 'localhost');
$debug = Environment::getBool('WP_DEBUG', false);
$maxUploads = Environment::getInt('MAX_UPLOADS', 10);
$allowedTypes = Environment::getArray('ALLOWED_TYPES', ['jpg', 'png']);
// Check environment type
if (Environment::isDevelopment()) {
// Development-specific code
error_reporting(E_ALL);
}
// Check containerization
if (Environment::isDocker()) {
// Docker-specific configuration
$redisHost = 'redis'; // Use container name
}WP Env uses the following priority order:
- WordPress Constants (
define()in wp-config.php) - .env files (via oscarotero/env if available)
- System environment (
getenv()) - Default values
<?php
// wp-config.php
define('API_TIMEOUT', 30);
// .env file
API_TIMEOUT=60
// System environment
export API_TIMEOUT=90
// Result: 30 (WordPress constant wins)
$timeout = Environment::getInt('API_TIMEOUT', 10);<?php
// In your plugin or theme
use WpSpaghetti\WpEnv\Environment;
class MyPlugin
{
public function __construct()
{
// Validate required configuration
Environment::validateRequired([
'MY_PLUGIN_API_KEY',
'MY_PLUGIN_SECRET'
]);
add_action('init', [$this, 'init']);
}
public function init(): void
{
$config = Environment::load([
'MY_PLUGIN_API_KEY',
'MY_PLUGIN_TIMEOUT' => 30,
'MY_PLUGIN_RETRIES' => 3,
'MY_PLUGIN_ENABLED' => true
]);
// Environment-specific behavior
if (Environment::isProduction()) {
$this->enableCaching();
}
if (Environment::isDebug()) {
$this->enableDetailedLogging();
}
}
}Get environment variable with fallback to default value.
Get environment variable as boolean. Recognizes: 1, true, on, yes, enabled.
Get environment variable as integer with type conversion.
Get environment variable as float with type conversion.
Get environment variable as array (comma-separated values).
Get required environment variable (throws exception if missing).
Validate that all required environment variables are set.
Environment::validateRequired([
'DB_HOST',
'DB_NAME',
'API_KEY'
]);Load multiple environment variables at once.
// Simple array
$vars = Environment::load(['KEY1', 'KEY2', 'KEY3']);
// With defaults
$vars = Environment::load([
'API_URL' => 'https://api.example.com',
'TIMEOUT' => 30,
'ENABLED' => true
]);Get current environment type: development, staging, or production.
Check if running in development environment.
Check if running in staging environment.
Check if running in production environment.
Check if running inside a Docker container.
Check if running in any containerized environment (Docker, Podman, etc.).
Check if WordPress debug mode is enabled (WP_DEBUG).
Check if WordPress is running in multisite mode.
Check if running via CLI (WP-CLI or PHP CLI).
Check if running via web request.
Get server software (nginx, apache, litespeed, iis).
Get PHP SAPI information.
Get comprehensive environment information for debugging.
Clear internal caches (useful for testing).
Add key to sensitive list (prevents caching/logging).
<?php
// Basic WordPress configuration
define('WP_DEBUG', true);
define('WP_ENVIRONMENT_TYPE', 'development');
// Custom application settings
define('API_BASE_URL', 'https://api.example.com');
define('CACHE_ENABLED', true);
define('MAX_UPLOAD_SIZE', 50);
define('ALLOWED_EXTENSIONS', 'jpg,png,gif,pdf');
// Container-specific settings
define('REDIS_HOST', 'redis');
define('ELASTICSEARCH_URL', 'http://elasticsearch:9200');# Environment identification
WP_ENVIRONMENT_TYPE=development
WP_DEBUG=true
# Database configuration
DB_HOST=db
DB_NAME=wordpress
DB_USER=wp_user
DB_PASSWORD=secure_password
# Application settings
API_BASE_URL=https://api.staging.example.com
CACHE_TTL=3600
MAX_RETRIES=5
FEATURE_FLAGS=feature1,feature2,feature3
# Container settings
REDIS_HOST=redis
REDIS_PORT=6379
ELASTICSEARCH_URL=http://elasticsearch:9200services:
wordpress:
image: wordpress:latest
environment:
- WP_ENVIRONMENT_TYPE=development
- WP_DEBUG=true
- DB_HOST=db
- REDIS_HOST=redis
- API_TIMEOUT=60
- DOCKER_CONTAINER=true
volumes:
- .:/var/www/html
depends_on:
- db
- redis
db:
image: mysql:8.0
environment:
- MYSQL_DATABASE=wordpress
- MYSQL_USER=wp_user
- MYSQL_PASSWORD=secure_password
redis:
image: redis:alpineWP Env provides several WordPress hooks for customization:
// Modify any environment value
add_filter('wp_env_get_value', function($value, $key, $default) {
// Force debug mode for specific users
if ($key === 'WP_DEBUG' && current_user_can('administrator')) {
return true;
}
return $value;
}, 10, 3);// Override environment detection
add_filter('wp_env_get_environment', function($environment, $originalEnv) {
// Custom logic for environment detection
if (str_contains($_SERVER['HTTP_HOST'] ?? '', 'beta.')) {
return 'staging';
}
return $environment;
}, 10, 2);// Override Docker detection
add_filter('wp_env_is_docker', function($isDocker) {
// Custom Docker detection logic
return file_exists('/app/.dockerenv');
});// Add custom sensitive keys
add_filter('wp_env_is_sensitive_key', function($isSensitive, $key) {
$customSensitive = [
'STRIPE_SECRET_KEY',
'MAILCHIMP_API_KEY',
'GOOGLE_ANALYTICS_SECRET'
];
return $isSensitive || in_array($key, $customSensitive);
}, 10, 2);// React to cache clearing
add_action('wp_env_cache_cleared', function() {
// Your custom cache clearing logic
wp_cache_flush();
});<?php
use WpSpaghetti\WpEnv\Environment;
class PluginConfigManager
{
private array $config;
public function __construct()
{
$this->loadConfiguration();
}
private function loadConfiguration(): void
{
// Load all plugin settings at once
$this->config = Environment::load([
'MYPLUGIN_API_URL' => 'https://api.example.com',
'MYPLUGIN_TIMEOUT' => 30,
'MYPLUGIN_RETRIES' => 3,
'MYPLUGIN_CACHE_TTL' => 3600,
'MYPLUGIN_FEATURES' => [],
'MYPLUGIN_DEBUG' => false
]);
// Environment-specific overrides
if (Environment::isDevelopment()) {
$this->config['MYPLUGIN_DEBUG'] = true;
$this->config['MYPLUGIN_TIMEOUT'] = 5; // Shorter timeout for dev
}
if (Environment::isDocker()) {
$this->config['MYPLUGIN_API_URL'] = 'http://api:8080'; // Container URL
}
// Validate critical configuration
if (Environment::isProduction()) {
Environment::validateRequired([
'MYPLUGIN_API_KEY',
'MYPLUGIN_SECRET_KEY'
]);
}
}
public function get(string $key, $default = null)
{
return $this->config[$key] ?? $default;
}
}<?php
use WpSpaghetti\WpEnv\Environment;
class ServiceProvider
{
public function register(): void
{
switch (Environment::getEnvironment()) {
case Environment::ENV_DEVELOPMENT:
$this->registerDevelopmentServices();
break;
case Environment::ENV_STAGING:
$this->registerStagingServices();
break;
case Environment::ENV_PRODUCTION:
$this->registerProductionServices();
break;
}
// Container-specific services
if (Environment::isContainer()) {
$this->registerContainerServices();
}
}
private function registerDevelopmentServices(): void
{
// Development-only services
add_action('wp_footer', [$this, 'addDebugInfo']);
// Use different API endpoints
$apiUrl = 'http://localhost:3000/api';
}
private function registerProductionServices(): void
{
// Production optimizations
add_action('init', [$this, 'enableCaching']);
// Production API endpoints
$apiUrl = Environment::get('PROD_API_URL', 'https://api.example.com');
}
private function registerContainerServices(): void
{
// Container-specific networking
$redisHost = Environment::get('REDIS_HOST', 'redis');
$dbHost = Environment::get('DB_HOST', 'db');
}
}<?php
use WpSpaghetti\WpEnv\Environment;
class MultiEnvironmentConfig
{
private array $environments = [
Environment::ENV_DEVELOPMENT => [
'debug' => true,
'cache_ttl' => 0,
'api_url' => 'http://localhost:3000',
'log_level' => 'debug'
],
Environment::ENV_STAGING => [
'debug' => true,
'cache_ttl' => 300,
'api_url' => 'https://staging-api.example.com',
'log_level' => 'info'
],
Environment::ENV_PRODUCTION => [
'debug' => false,
'cache_ttl' => 3600,
'api_url' => 'https://api.example.com',
'log_level' => 'error'
]
];
public function get(string $key, $default = null)
{
$currentEnv = Environment::getEnvironment();
$envConfig = $this->environments[$currentEnv] ?? [];
// Try environment-specific config first
if (isset($envConfig[$key])) {
return $envConfig[$key];
}
// Fall back to environment variable
return Environment::get(strtoupper($key), $default);
}
public function getApiUrl(): string
{
return $this->get('api_url');
}
public function getCacheTtl(): int
{
return (int) $this->get('cache_ttl');
}
public function shouldEnableDebug(): bool
{
return (bool) $this->get('debug');
}
}// Get comprehensive environment info
$info = Environment::getDebugInfo();
print_r($info);
// Check specific values
echo "Environment: " . Environment::getEnvironment() . "\n";
echo "Is Docker: " . (Environment::isDocker() ? 'yes' : 'no') . "\n";
echo "Debug Mode: " . (Environment::isDebug() ? 'enabled' : 'disabled') . "\n";Environment not detected correctly:
- Set
WP_ENVIRONMENT_TYPEconstant in wp-config.php - Use
.envfile withWP_ENV=development - Check domain-based detection logic
Values not loading:
- Verify constant names (WordPress constants take priority)
- Check if oscarotero/env is installed for .env support
- Clear cache with
Environment::clearCache()
Container detection issues:
- Ensure Docker environment variables are set
- Check if
.dockerenvfile exists - Use custom detection with hooks
- PHP 8.0 or higher
- WordPress 5.0 or higher (for WordPress-specific features)
- Optional: oscarotero/env for .env file support
Please see CHANGELOG for a detailed list of changes for each release.
We follow Semantic Versioning and use Conventional Commits to automatically generate our changelog.
- Major versions (1.0.0 → 2.0.0): Breaking changes
- Minor versions (1.0.0 → 1.1.0): New features, backward compatible
- Patch versions (1.0.0 → 1.0.1): Bug fixes, backward compatible
All releases are automatically created when changes are pushed to the main branch, based on commit message conventions.
For your contributions please use:
See CONTRIBUTING for detailed guidelines.
