The actual threat model
Nobody is targeting your plumbing company's website personally. What is happening is automated: bots continuously scan every IP address for known-vulnerable plugin versions, weak passwords and exposed files. Almost every WordPress compromise comes from one of three things — an out-of-date plugin, a reused password, or an insecure host neighbour. Defend against those and you have handled the realistic risk.
The high-value, low-effort list
- Update weekly. Core, plugins, themes. Enable auto-updates for plugins from vendors you trust. Delete plugins you are not using — deactivated plugins are still files on disk and can still be exploited.
- Unique passwords plus two-factor. A password manager and a 2FA plugin (Wordfence Login Security, WP 2FA) close off credential stuffing entirely.
- No user called "admin", and no account with Administrator rights that does not need it. Editors should be Editors.
- Limit login attempts. Wordfence, Solid Security or Limit Login Attempts Reloaded. Cheap and effective.
- Disable the file editor:
define('DISALLOW_FILE_EDIT', true);inwp-config.php. It stops a stolen admin session from becoming remote code execution in two clicks. - Block PHP execution in uploads. The single most common way a file-upload bug becomes a shell. On nginx:
location ~* /uploads/.*\.php$ { deny all; }. - HTTPS everywhere, with HSTS once you are confident.
- Keep PHP current. PHP 8.1 and earlier are end of life. Old PHP is unpatched PHP.
Backups: the 3-2-1 rule for a small site
Three copies, on two kinds of media, one off-site. In practice:
| Copy | Where | How often |
|---|---|---|
| 1 — live | The site itself | Continuous |
| 2 — host backup | Your host's automatic daily backup | Daily, 14–30 days retention |
| 3 — your own off-site copy | Backblaze B2, Cloudflare R2, Google Drive — an account your host does not control | Daily or weekly, 90 days |
Copy 3 is the one that matters. If your host has a billing dispute with you, suffers a ransomware event, or goes under, copies 1 and 2 vanish together. UpdraftPlus sending to your own storage account costs nothing and takes ten minutes to set up.
Test a restore. Once a quarter, restore into a staging site and click around. Backups fail silently far more often than anyone expects — a database export that stopped completing three months ago looks exactly like a healthy one in a file listing.
If you are hacked
- Take the site offline or into maintenance mode. Do not "clean it while it runs".
- Change every password: WordPress admins, hosting panel, SFTP, database, and any reused elsewhere.
- Restore from a backup predating the compromise — check when suspicious files first appeared, not when you noticed.
- Update everything before putting it back online, or you will be reinfected within the day.
- Look for persistence: unexpected admin users, modified
wp-config.php, files in uploads with a.phpextension, unknown scheduled tasks (wp cron event list). - If card or personal data may have been exposed, you have UK GDPR obligations — potentially an ICO report within 72 hours. Take advice early.