Bedrock WordPress
Can you say which plugin version runs on your site and who uploaded it?
I build WordPress on Roots Bedrock: Composer manages the core and plugins, configuration is separated per environment, the webroot is isolated and deploys come from git. No more overwriting files over FTP.
A classic WordPress install is built from the start around the idea that files get uploaded into it. A plugin is installed with a click, somebody edits the theme directly on the server, the database credentials sit in a file in the web root, and the only versioning is the fact that someone put it there once. After a year nobody can tell which change was intentional and which is a leftover from the previous supplier. A local copy cannot be reproduced reliably, testing happens on the live site, and every deploy is a manual operation with an FTP client open.
Bedrock, from the Roots project, takes WordPress and arranges it the way every other PHP application is arranged today. The core, plugins and themes are Composer dependencies with recorded versions, configuration is read from environment variables, and what is publicly reachable is separated from what should not be. The project becomes a repository you can clone, build and deploy identically on a laptop, on staging and in production. For the client it means a site that is portable and that anyone comfortable with git can take over.
01
Plugins and core managed by Composer
On Bedrock plugins are not installed in the admin, they are declared in the dependency file together with a version. Thanks to the WPackagist registry that covers ordinary plugins from the official directory, and paid licences are added through a private repository. The lock file then states exactly what runs in production, so an update is a change in the repository rather than a click that leaves no trace. If a new version breaks something, rolling back is one command and one deploy, not a hunt for the backup from the right night.
- Plugin and core versions recorded in the repository
- The official plugin directory through WPackagist
- Licensed premium plugins from a private repository
- An update is a reviewable change, not an invisible click
- Rolling back is a single deploy
02
Mu-plugins for what must never be switched off
Part of a site's functionality has no business being toggleable in the admin. Registering custom post types, an integration with an invoicing system, security restrictions or a mail gateway connection are part of the project, not optional add-ons. I write those as mu-plugins, which always load and cannot be deactivated with one click in the plugin list. It also separates client-specific code from the theme, so the theme can be replaced later without half the site's logic disappearing with it.
- Critical functionality cannot be deactivated by accident
- Custom post types and integrations live outside the theme
- The theme can be replaced without losing logic
- A clear boundary between appearance and function
- Fewer third-party plugins in the project
03
Per-environment configuration and an isolated webroot
Bedrock splits configuration into a shared part and a per-environment part, with credentials read from environment variables kept outside the repository. Development can have debugging on and indexing off while production does the opposite, and nobody has to flip switches by hand before a deploy. Only the webroot directory is publicly reachable, while dependencies and configuration sit above it and cannot be fetched through a browser. That layout alone removes a whole class of common vulnerabilities that exist purely because something is sitting in the web root that should not be.
- Separate config for local, staging and production
- Credentials in environment variables, not in the repository
- Only the webroot is public, everything else is out of reach
- Debugging and indexing are not toggled manually
- Less surface for the usual vulnerabilities
04
Deploying from git instead of an FTP client
Once the project is a repository, deployment stops being a ritual. A change is built, the whole prepared state is uploaded and then switched to, so the live site never sits in a half-uploaded directory. The same procedure runs for staging and production, which removes the it-works-on-my-machine surprises. Database and uploaded files are backed up outside the repository, because content does not belong in code. The result is a site where you can say exactly what was deployed, when, and what that change contained.
- A deploy is one step, not an hour in an FTP client
- The site never runs in a half-uploaded state
- The same procedure for staging and production
- A change history you can roll back through
- Content and uploads kept separate from code
05
Migrating an existing install, and the cost
Moving to Bedrock is not a rewrite. I keep the existing theme and content, convert plugins into versioned dependencies, move custom tweaks into mu-plugins and set the environments up so staging can be cloned from production at any time. The work happens on a copy and production is switched over only once the new version has been verified. I work at 40 EUR per hour including VAT. Moving a typical business site onto Bedrock is usually 8 to 20 hours, and a new project built on Bedrock from the start costs no more than a classic install.
- Content and theme stay, the arrangement changes
- Custom tweaks move into mu-plugins
- The switch happens only after verification on a copy
- Migrating a site roughly 8 to 20 hours
- 40 EUR per hour including VAT, no premium on new projects
?
Frequently asked questions about Bedrock WordPress
Does anything change for editors in the admin?
Nothing changes. The WordPress admin looks and behaves exactly the same and content is managed no differently. Bedrock only changes how the project is arranged on the server and how code changes reach it.
Can plugins still be installed from the admin on Bedrock?
Technically yes, but I deliberately restrict it, because a plugin added that way would not be recorded in the repository and would disappear on the next deploy. Adding a plugin through Composer takes a minute and leaves a trace.
Does Bedrock work on ordinary shared hosting?
On some hosts yes, on others no, because Bedrock needs the site's document root pointed at a subdirectory. I always verify the specific host before migrating, and if it cannot be done I recommend either a configuration change or a different provider.
Does Bedrock make routine maintenance more expensive?
In practice it makes it cheaper. Updates are done in batches and can be tested on staging first, a bad change is reverted in one step, and nobody spends an hour working out what changed on the server. The saving is clearest on sites that change regularly.
What does migrating an existing site to Bedrock cost?
A typical business site is 8 to 20 hours, which is 320 to 800 EUR including VAT at 40 EUR per hour. The number moves with how many licensed plugins there are, how much was hacked directly into core, and the state of the theme.
Want a WordPress you can deploy in a single step?
Tell me where the site runs, how many plugins it has and who has access to it. I will say whether moving to Bedrock pays off and how many hours it takes.
Discuss Bedrock