Changelog
Every release since 1.0.0, read straight from changelog.md in the repository. Installed copies pick these up through the plugin's own updater.
-
Added
- WP-CLI
wp freighter listtakes--format(table, csv, ids, json, yaml) and--field.--format=idsprints a space-separated id list for shell loops, such asfor id in $(wp freighter list --format=ids); do STACKED_SITE_ID=$id wp plugin update --all; done.
Changed
- Admin redesign The Tools → WP Freighter screen is rebuilt without Vue, Vuetify, Axios or the Material Design icon font. Plain HTML, one stylesheet and one script, in the same light/dark design language as wpfreighter.com. Plugin assets drop from 4.9 MB to under 40 KB.
- Saving Renaming a site or changing a mode shows a save bar with a summary of what changed, plus Discard. Leaving the page with unsaved changes asks first.
- Dialogs New site, clone and delete use native dialogs; the double
confirm()prompts are gone. The delete dialog states which content folder goes with the site and how large it is. - Errors Failed requests show their message on screen instead of only in the browser console.
- Theme Light, dark or system (right-click the theme button), remembered per browser.
Fixed
- WP-CLI
wp freighter clonenow works as documented. The command was registered asclone_site, which still works as an alias. - New tenant ids skip prefixes already in use. A new or cloned site took the next id after the highest registered one, with no check that
stacked_<id>_tables were free. When the main site itself sits on astacked_<n>_prefix (a tenant pulled out into its own install keeps it) and the count reached n, creating or cloning dropped and replaced the main site's own tables with a fresh install, and deleting that tenant then removed them entirely. Ids now skip the main site's prefix and any prefix that already has tables. - Blank new sites A new tenant site is now given a theme that exists in its theme root. In shared and hybrid mode the installer recorded the default theme even on hosts that no longer carry it, leaving an empty front end; such sites now fall back to the main site's theme. Dedicated sites still download the default theme, and copy the main site's theme in if the download fails.
Removed
WPFreighter\Dev\AssetFetcherand thecomposer update-assetsscript; there are no vendored front-end libraries to fetch any more.
- WP-CLI
-
Fixed
- WP CLI Fixed issue with detecting domain mapping
-
Added
- Dark Mode Support Added full support for dark mode. The interface now automatically respects system preferences (
prefers-color-scheme) and includes a manual toggle in the toolbar to switch between light and dark themes. - Vue 3 & Vuetify 3 Completely upgraded the admin dashboard dependencies to Vue.js 3.5.22 and Vuetify 3.10.5. This modernization improves rendering performance and ensures long-term compatibility.
- Self-Healing Logic Implemented
Site::ensure_freighter(), which automatically restores the plugin files and forces activation on a tenant site before context switching. This prevents errors if the plugin was manually deleted or deactivated in a child environment. - New CLI Command Added
wp freighter regenerate. This utility allows administrators to manually trigger a refresh of thewp-content/freighter.phpbootstrap file andwp-config.phpadjustments via the command line.
Changed
- Terminology Updated UI and CLI text to refer to sites as "Tenant Sites" instead of "Stacked Sites" for better clarity.
- UI Visuals Refined input fields, tables, and overlays to use transparent backgrounds, allowing the plugin interface to blend seamlessly with the native WordPress Admin color scheme.
- Cache Busting Introduced
WP_FREIGHTER_VERSIONconstant to ensure admin assets are properly refreshed in browser caches immediately after an update.
Fixed
- Bootstrap Location Updated the detection logic for
freighter.phpto useABSPATHinstead ofWP_CONTENT_DIR, resolving path resolution issues on specific hosting configurations.
- Dark Mode Support Added full support for dark mode. The interface now automatically respects system preferences (
-
Added
- Bootstrap Architecture Introduced
wp-content/freighter.phpto handle site loading logic. This significantly reduces the footprint withinwp-config.phpto a singlerequire_onceline, making the configuration more robust and easier to read. - Local Dependencies Removed reliance on external CDNs (delivr.net) for frontend assets. Vue.js, Vuetify, and Axios are now bundled locally within the plugin, improving privacy, compliance (GDPR), and offline development capabilities.
- Manual Configuration UI Added a dedicated interface for environments with strict file permissions. If the plugin cannot write to
wp-config.phpor create the bootstrap file, it now provides the exact code snippets and a "Copy to Clipboard" feature for manual installation. - Session Gatekeeper Implemented stricter security logic for cookie-based context switching. The plugin now actively verifies that a user is authenticated or in the process of logging in before allowing access to a tenant site via cookies.
- "Login to Main" Button Added a quick-access button in the toolbar to return to the main parent site dashboard when viewing a tenant site with domain mapping enabled.
Changed
- Context Switching Refactored the context switching logic to force an immediate header reload when setting the
stacked_site_idcookie. This resolves issues where the context switch would occasionally fail on the first attempt. - Asset Management Added a developer utility (
WPFreighter\Dev\AssetFetcher) to programmatically fetch and update frontend vendor libraries.
Fixed
- Cookie Reliability Fixed an issue where the site ID cookie wasn't being set early enough during the request lifecycle for specific hosting configurations.
- Bootstrap Architecture Introduced
-
Added
- Hybrid Mode Introduced a new "Hybrid" file mode that shares plugins and themes across all sites while keeping the
uploadsfolder unique for each site. Perfect for agencies managing standardized stacks with different media libraries. - WP-CLI Integration Added robust CLI commands (
wp freighter) to manage sites, clone environments, toggle file modes, and handle domain mapping via the terminal. - Developer API Introduced the
WPFreighter\Siteclass, allowing developers to programmatically create, clone, login, and delete tenant sites. - Environment Support Added support for the
STACKED_SITE_IDenvironment variable to enable context switching in CLI and server environments. - Object Cache Compatibility Now modifies
WP_CACHE_KEY_SALTinwp-config.phpto ensure unique object caching for every tenant site. - Storage Stats Added directory size calculation to the delete site dialog, providing warnings for dedicated content deletion.
Changed
- Architecture Refactor Moved core logic from
Run.phpinto dedicatedSiteandCLImodels for better maintainability. - Admin Assets Migrated inline Vue.js logic from the PHP template to a dedicated
admin-app.jsfile. - Kinsta Compatibility Enhanced support for copying Kinsta-specific
mu-pluginswhen creating sites in dedicated mode.
Fixed
- Database Hardening Implemented
$wpdb->prepare()across all database write operations to prevent SQL injection vulnerabilities. - Input Sanitization Added strict input sanitization (
sanitize_text_field,sanitize_user) to all REST API endpoints.
- Hybrid Mode Introduced a new "Hybrid" file mode that shares plugins and themes across all sites while keeping the
-
Added
- REST API Implementation Completely replaced legacy
admin-ajaxcalls with secure WordPress REST API endpoints (wp-freighter/v1) for better stability and permission handling. - Clone Specific Sites Added functionality to clone any specific tenant site directly from the site list, not just the main site.
- Enhanced Clone Dialog New UI dialog allowing users to define the Label or Domain immediately when cloning a site.
- Smart Defaults The "New Site" form now pre-fills the current user's email and username, and automatically generates a secure random password.
- Manifest Support Added
manifest.jsonfor standardized update checking.
Changed
- Frontend Dependencies Updated Vue.js to v2.7.16, Vuetify to v2.6.13, and Axios to v1.13.2.
- Updater Logic Migrated the update checker to pull release data directly from the GitHub repository (
raw.githubusercontent.com) instead of the previous proprietary endpoint. - Admin Bar The "Exit WP Freighter" button now utilizes a Javascript-based REST API call for a smoother exit transition.
Fixed
- Theme Upgrader Noise Implemented a silent skin for the
Theme_Upgraderto prevent HTML output from breaking JSON responses when installing default themes on new sites. - Fallback Logic The updater now falls back to a local manifest file if the remote check fails.
- REST API Implementation Completely replaced legacy
-
Changed
- Site cloning will copy current source content folder over to new
/content/<id>/. - Refresh WP Freighter configs on plugin update.
Fixed
- PHP 8 warnings and errors.
- Site cloning will copy current source content folder over to new
-
Fixed
- PHP 8 issues.
-
Added
- Free for everyone Removed EDD integration.
- Automatic Updates Integrated with Github release.
- Settings link to plugin page.
-
Fixed
- Bad logic where configurations weren't always regenerated after sites changed.
- Various PHP warnings.
-
Added
- Automatic installation of default theme when creating new sites if needed.
- Overlay loader while new sites are installing.
- Fields for domain or label on the new site dialog.
Changed
- Compatibility for alternative
wp-config.phplocation. - Force HTTPS in urls.
Fixed
- Inconsistent response of sites array.
-
Added
- Initial release of WP Freighter.
- Ability to add or remove tenant sites with database prefix
stacked_#_. - Clone existing site to new database prefix.
- Add new empty site to new database prefix.
- Domain mapping off or on.
- Files shared or dedicated.