Many WordPress sites. One install.

WP Freighter turns a single WordPress installation into a multi-tenant host. Each tenant site gets its own database tables and, if you want, its own wp-content. New sites take seconds. No second server, no multisite.

MIT licenseWordPress 5.4+PHP 7.0+Since 2020

The install serving this page. wpfreighter.com is tenant 4. Every site in the list is a separate WordPress site with its own users, plugins and uploads.

One request, one prefix.

There is no magic layer. WordPress already supports any table prefix and any content directory; Freighter just decides which ones to use before core loads.

  1. wp-config.php includes the bootstrap

    One line after $table_prefix pulls in wp-content/freighter.php. The plugin writes both; if your host blocks writes it shows you the exact lines to paste.

  2. The bootstrap picks the tenant

    By the requested hostname when domain mapping is on, or by the signed stacked_site_id cookie an administrator sets when switching sites. Under WP-CLI it reads STACKED_SITE_ID.

  3. Prefix and paths are swapped

    $table_prefix becomes stacked_4_. In hybrid and dedicated mode the content and upload paths point at content/4/.

  4. WordPress loads as usual

    No patched core, no multisite tables, no shared user table. Remove the plugin and the main site is untouched.

requestGET https://cove.run/
mapped totenant 15

$table_prefix'wp_' → 'stacked_15_'
WP_CONTENT_DIR…/wp-content → …/content/15
WP_PLUGIN_DIR…/content/15/plugins
uploads…/content/15/uploads

thenrequire wp-settings.php
SharedOne wp-content/ for every site. Brand variants and language editions that share one media library.
HybridShared plugins and themes, uploads per site under content/‹id›/. Agencies with a standard stack and unique client content. Update a plugin once.
DedicatedA whole content/‹id›/ per site. True isolation: staging copies, plugin-update trials, sites with nothing in common.

What that buys you.

Clones in seconds
Cloning copies database tables and nothing else. A hybrid-mode staging copy of a 2 GB site is ready before you finish reading this sentence: wp freighter clone main --name="Staging".
A sandbox next to production
The original reason it exists. Clone the live site, switch into the clone from the admin bar, reproduce the problem, switch back. Administrator access is all it takes; no SFTP, no second host.
Domain mapping
Point any hostname at any tenant. Leave it off and tenants ride on the parent domain, reachable through the admin switcher and magic login.
Magic login
wp freighter login 15 prints a one-time URL straight into that tenant's dashboard. Same from PHP with Site::login().
Self-healing tenants
Before switching context the plugin checks it is present and active on the target tenant and restores itself if someone deleted it from a child site.
A CLI and a PHP API, not just a screen
Everything the Tools page does is a wp freighter command and a static method on WPFreighter\Site. Script provisioning from your own tooling.

Talks to your terminal and your code.

WP-CLI

# where am I, what mode, how many tenants
wp freighter info

# provisioning
wp freighter add --title="Client A" --name="client-a"
wp freighter clone main --name="Staging"
wp freighter clone 2 --name="Dev copy"
wp freighter delete 4

# configuration
wp freighter files set dedicated
wp freighter domain set on
wp freighter regenerate

# any wp command, inside a tenant
STACKED_SITE_ID=15 wp plugin update --all

PHP

$site = \WPFreighter\Site::create([
    'title'  => 'Project Alpha',
    'name'   => 'alpha',
    'domain' => 'alpha.example.com', // optional
    'email'  => 'admin@example.com',
]);
// $site['stacked_site_id'] → 21

$staging = \WPFreighter\Site::clone('main', [
    'name' => 'Staging',
]);

$url = \WPFreighter\Site::login(21, 'post-new.php');

\WPFreighter\Site::delete(21);

Read before you ship it.

Tenants share one install, so they share the things an install has only one of.

  • Root files are shared. .htaccess, robots.txt, wp-config.php and the WordPress core version are the same for every tenant.
  • One PHP, one server, one database. Tenants are separate sites, not separate machines. Size the host for the sum of them.
  • WP-Cron needs traffic. A quiet tenant's scheduled jobs wait for a visitor. Drive them with a system cron and STACKED_SITE_ID=<id> wp cron event run --due-now.
  • It writes to wp-config.php and wp-content. On hosts that forbid that, you paste the bootstrap and the include line by hand. The plugin shows you both.

Built for a fleet. Run on one.

WP Freighter started in 2020 as the maintenance sandbox for Anchor Hosting's managed WordPress customers. It has hosted the company's own tool sites on a single install since then; the list at the top of this page is that install.

Six years, twenty tenants, one wp-config.php.

Install it.

  • RequiresWordPress 5.4+, PHP 7.0+
  • TestedWordPress 6.9
  • Version1.5.1, released 2025-12-13
  • LicenseMIT
  • Updatesin-plugin, from GitHub releases
# from the command line
wp plugin install --activate \
  https://github.com/WPFreighter/wp-freighter/releases/latest/download/wp-freighter.zip

# or upload the zip under Plugins → Add New, then open Tools → WP Freighter