Repository navigation
Troubleshooting
Problems people hit with SafeHouse, grouped by where they show up. Each entry starts with what you see, then the cause and the fix. If you are locked out of the site, go to Recover from a lockout first.
Use your browser's find (Ctrl+F or ⌘F) with a few words of the message you see.
- Turn on safe mode:
wp shouse safe-mode on, or create an empty filewp-content/shouse-safe-mode. - Try again. If the problem is gone, SafeHouse causes it.
- Turn safe mode off and switch modules off one at a time, with
wp shouse module disable <id>or on SafeHouse → Modules, until the problem goes away. That module is the one. - Check the Activity log on the SafeHouse page, or run
wp shouse log, for entries from the time it happened.
You see: "Too many failed login attempts from your address. Try again in 15 minutes." The number of minutes varies.
Cause: Login limits locked out your address after too many failed logins from it. Each further lockout of the same address lasts four times longer, up to 24 hours.
Fix: wait, or have another administrator select Lift all lockouts in SafeHouse → Modules → Login limits → Details, or run wp shouse login unlock <your address>. To stop it happening again from your office, add its address to Never lock out these addresses.
You see: "This account is paused for new devices after many failed attempts. Log in from a device you used before, or try again in an hour."
Cause: someone failed to log into this account 10 times within an hour from browsers that never logged into it. For one hour, only browsers that did can log in.
Fix: log in from a browser you used for this account before, or wait an hour, or run both wp shouse login unlock <login> and wp shouse login unlock <e-mail>.
You see: many users report "Too many failed login attempts from your address" at the same time.
Cause: the site is behind a proxy, CDN or load balancer that SafeHouse does not know about, so every visitor seems to come from the proxy's address. Login limits locked out that one address.
Fix:
- Run
wp shouse login unlock --all, or select Lift all lockouts. - Tell SafeHouse about the proxy: Behind Cloudflare or a proxy.
Verify: Tools → Site Health shows "Login limits block password guessing".
You see: this result in Tools → Site Health, or a note in Login limits Details.
Cause: requests come from a Cloudflare address while SafeHouse is not set up for Cloudflare, or from a private address without SHOUSE_TRUSTED_PROXIES. SafeHouse then stops locking out addresses, so it does not lock out every visitor, and keeps only the per-account rule.
Fix: set up the proxy: Behind Cloudflare or a proxy. On a local or Docker development site this result is expected.
You see: the app or an old desktop editor fails to log in; xmlrpc.php answers "XML-RPC is disabled on this site."
Cause: Hardening turns XML-RPC off by default.
Fix: turn off Disable XML-RPC in Hardening if you need the app. Jetpack and WooPayments keep XML-RPC on automatically.
You see: "The anti-bot check did not pass. Please wait for it to finish and try again."
Cause: Cloudflare Turnstile did not confirm the form. Common reasons: the form was sent before the check finished, the page sat open until the token expired, the browser or an extension blocks challenges.cloudflare.com, or the site was opened under a host name other than its WordPress or site address.
Fix: reload the page, wait a moment, and send the form again. Allow challenges.cloudflare.com in content blockers. Open the site under its own address. On wp-login.php, each failure also counts as a failed login for Login limits.
You see: "The anti-bot check is unavailable right now. Please try again in a few minutes."
Cause: your server could not reach Cloudflare, or Cloudflare rejected the secret key, and When Cloudflare cannot be reached is set to Block the submission.
Fix: check outgoing HTTPS from the server and SHOUSE_TURNSTILE_SECRET_KEY. To let forms through during an outage, set When Cloudflare cannot be reached to Let the submission through and log it.
You see: "This looks like an automated submission. Please make sure JavaScript is on and try again." on registration, lost password or comments.
Cause: the honeypot did not get its proof. The visitor has JavaScript off, sent the form without typing, tapping or clicking in it, or the form is a custom one that does not print SafeHouse's honeypot fields.
Fix: turn JavaScript on. For a custom form, make it fire the standard WordPress hooks (see Developer hooks), or turn off Honeypot on registration, lost password and comments. After rotating the WordPress salts, clear the page cache: cached forms carry an outdated proof.
Cause and fix, in order of likelihood:
- It works but is invisible. Turnstile runs in a mode that shows a widget only when Cloudflare wants the visitor to interact.
- Bot protection is off by default. Switch it on.
- Its Details say "Turnstile is off: add SHOUSE_TURNSTILE_SITE_KEY and SHOUSE_TURNSTILE_SECRET_KEY to wp-config.php." Add the keys.
- Its Details say Cloudflare test keys are not allowed on a production site. Use real keys, or set
WP_ENVIRONMENT_TYPEtostagingordevelopmenton a test site. - The field shows "Handled by Wordfence Login Security, skipped here.": Wordfence's reCAPTCHA protects login and registration instead.
- Comment forms show it only to visitors who are not logged in.
You see: block checkout, express payment buttons (Apple Pay, Google Pay) outside the checkout page, or a headless store fails with the error code shouse_bots.
Cause: Turnstile on checkout checks every order sent to the WooCommerce Store API. Buttons and apps outside the checkout page cannot pass the check.
Fix: turn off Turnstile on checkout in Bot protection if the shop uses express payment buttons or another storefront.
You see: logged-in customers get "We will be back soon".
Cause: Maintenance mode shows the normal site only to users with the capability in Who sees the normal site. Customers can only read.
Fix: set Who sees the normal site to Every logged-in user, or switch Maintenance mode off.
You see: "Installing plugins and themes is locked by SafeHouse. Unlock it first (SafeHouse in the admin menu or wp shouse unlock)." The Add Plugin button and the file editor may be missing too.
Cause: Install lockdown is on.
Fix: select Unlock installs for 30 minutes in Install lockdown Details, or run wp shouse unlock --minutes=15. If the button is missing, SHOUSE_LOCKDOWN_UI_UNLOCK is false and only WP-CLI can unlock.
You see: the default role is Editor or Shop manager, but new accounts become Subscribers.
Cause: Hardening's Keep new accounts out of admin-level roles treats any role that can post raw HTML, manage users, plugins, settings or the shop as admin-level. Editors and Shop managers have some of those rights.
Fix: if new accounts really should get that role, turn the setting off.
Check, in order:
- SafeHouse → General → Alert recipients, or the site's admin e-mail when that field is empty.
- Whether the site can send mail at all. Set up SMTP mail and use Send a test e-mail to me.
- Whether WordPress's scheduled tasks run. The hourly and daily checks need visits to the site, or a system cron when
DISABLE_WP_CRONis set. - Whether the event is e-mailed at all. Address lockouts, bot blocks and Plugin health findings never are: see Alerts and reports.
- Change alerts records its first baseline silently. Only changes after that are e-mailed.
Cause: your deploy changes plugin folders or wp-config.php, and Change alerts reports it at the next hourly check.
Fix: run wp shouse watch accept at the end of every deploy. See Deploy with git or CI.
You see: "Security vulnerability in installed software" on every wp-admin screen.
Cause: an installed plugin, theme or WordPress version has a vulnerability with a CVSS score of 7 or more, or no fix yet. Inactive plugins and unused themes count too, because their files can still be attacked. The notice cannot be dismissed.
Fix: update the software to the version named in the notice, or delete it. The notice disappears as soon as the update finishes.
You see: this result in Site Health, or "The last download failed: …" in Vulnerability alerts Details.
Cause: the site could not download or verify the data from updates.designhouse.me. SafeHouse retries every hour and keeps the previous data meanwhile.
Fix: check outgoing HTTPS from the server, then select Check now. A signature or checksum failure is also written to the activity log as advisories_rejected.
The reason is printed under the module's description. The common ones:
| Reason | What to do |
|---|---|
| "Wordfence is active and already warns about vulnerable plugins, themes and WordPress versions." | Nothing: Wordfence does this job. See Running with Wordfence. |
| "Wordfence brute force protection is on and already limits login attempts." | Nothing, or switch Wordfence's brute force protection off to use Login limits. |
| "Needs WooCommerce." | Omnibus price history only works in WooCommerce shops. |
| "DISALLOW_FILE_MODS in wp-config.php already blocks all installs and updates." | Nothing: WordPress already blocks installs. |
| "DISALLOW_UNFILTERED_HTML is set in wp-config.php, so nobody may add raw scripts." | Remove the constant to use Header and footer scripts. |
| "The LiteSpeed Cache plugin is active and manages the server cache itself." | Use one of the two, not both. |
| "Add SHOUSE_CLOUDFLARE_TOKEN … and SHOUSE_CLOUDFLARE_ZONE … to wp-config.php." | Add both constants. The zone ID must be exactly 32 hexadecimal characters. See Cloudflare cache. |
Safe mode is on. See Leave safe mode.
| Note next to it | Cause |
|---|---|
| "Handled by …, skipped here." | Another plugin or wp-config.php already does this. See Running with Wordfence. |
| "Pinned by SHOUSE_MODULES in wp-config.php." | The module is forced on or off in code. |
| "Settings are locked by SHOUSE_LOCK_SETTINGS in wp-config.php. Change them in code." | The whole page is read-only. |
| "Set in wp-config.php with SHOUSE_TRUSTED_PROXIES." | The proxy is set in code. |
| No note, on a script field | Your account may not post unfiltered HTML, so it cannot edit Header and footer scripts. |
Every save of SafeHouse settings clears the whole LiteSpeed and Cloudflare page cache when those modules run, because many settings change what visitors see. This includes wp shouse module enable and disable.
You see: "Error: 'login' is not a registered subcommand of 'shouse'. See 'wp help shouse' for available subcommands."
Cause: module commands exist only while their module runs. The module is off, Unavailable, or safe mode is on.
Fix: check wp shouse status. The always-available commands are listed on Command line reference.
See LiteSpeed page cache. Test in a private window: logged-in users, commenters and visitors with a cart always skip the cache. On LiteSpeed Enterprise the server cache must be turned on with CacheLookup public on.
- A change made with WP-CLI reaches the LiteSpeed cache only with the next web request. Run
wp shouse cache purge. - Cloudflare cache clears the changed post, the home page and the post's archives, not feeds, paginated archive pages, or author and date archives. Clear everything with Clear the whole Cloudflare cache or
wp shouse cloudflare purge. - Changes within 30 seconds of a previous purge wait for a scheduled task.
You see: this result in Site Health, "The last call on … failed: …" in Cloudflare cache Details, or cloudflare_purge_failed in the activity log.
Cause: usually the API token lacks the Cache Purge permission for this zone, or the zone ID belongs to another zone.
Fix: create a token with only Zone → Cache Purge for this zone, update SHOUSE_CLOUDFLARE_TOKEN, and select Clear the whole Cloudflare cache to test it. See Cloudflare cache.
You see: this critical result in Site Health, with a reason.
Cause: Redis is down, the connection settings are wrong, or the PhpRedis extension is missing in the web server's PHP. The site keeps working on WordPress's own cache, only slower.
Fix: check the WP_REDIS_* constants and the Redis server, then run wp shouse object-cache status. See Redis object cache.
| Message | Fix |
|---|---|
| "The PhpRedis extension is not installed for the PHP that runs WP-CLI. The web server's PHP needs it as well." | Install PhpRedis for the command-line PHP too. |
| "Another plugin's object-cache.php drop-in is installed. Remove it (or deactivate that plugin) first." | Disable the other object cache first. |
| "Redis is not usable: …" | Check the address, password and that Redis runs. |
| "Redis 6.0 or newer is required (this server: …)." | Upgrade Redis. |
You see: "Sending failed: …" after Send a test e-mail to me, or mail_failed in the activity log.
Cause and fix: see SMTP mail. The usual causes are a wrong host or port (465 needs 'ssl', 587 needs 'tls'), wrong credentials, or a From address on a domain the SMTP server may not send for.
Check Omnibus price history. The usual causes: Show the lowest price next to reduced prices is off; another Omnibus plugin is active ("Handled by …, skipped here."); the product is not on sale yet; or the variable product's variations have different prices, in which case the line shows for the picked variation. Run wp shouse omnibus history <id> to see what is on record.
The product was already reduced, or created on sale, when SafeHouse started recording, so no earlier price is on record. The figure becomes accurate at the product's next price change. Run wp shouse omnibus status: such products show regular in the source column.
Run wp shouse update-check:
| Result | Meaning |
|---|---|
Updates are disabled by SHOUSE_DISABLE_UPDATES. |
Updates are off on purpose. |
This is a git checkout; updates are disabled so they cannot overwrite it. |
Deploy new versions yourself. |
Manifest signature is invalid. |
The manifest is not signed with a key this version trusts. Check the activity log for update_rejected. If it persists, report it privately. |
HTTP … |
The server cannot reach updates.designhouse.me. |
Up to date. |
There is no newer release. |
You see: "The downloaded SafeHouse package does not match the signed checksum. Update cancelled."
Cause: the downloaded file differs from the signed release, through corruption in transit or tampering. SafeHouse deleted it and installed nothing.
Fix: try the update again later. If it keeps failing, report it privately on the repository's Security tab. See Signed updates.
Open an issue and include:
- the output of
wp shouse status - the WordPress, PHP, WooCommerce and SafeHouse versions
- the exact message, and the activity log entries from around the time it happened (
wp shouse log --limit=50) - what you expected and what happened instead
Report security problems privately on the repository's Security tab with Report a vulnerability, never in a public issue.
These pages describe SafeHouse 0.2.0 and were last reviewed on 2026-10-07. · Repository · Releases · Changelog · Report a problem with these pages
Search every page and heading in the Pages box.
Start here
Modules
- All modules
- Security: Hardening · Login limits · Bot protection · Install lockdown
- Alerts: Change alerts · Plugin health · Vulnerability alerts
- Performance: LiteSpeed page cache · Cloudflare cache · Redis object cache
- WooCommerce: Omnibus price history
- Site tools: SMTP mail · Header and footer scripts · Duplicate posts and pages · Maintenance mode · Tweaks
Guides
- Behind Cloudflare or a proxy
- Running with Wordfence
- Configure in wp-config
- Deploy with git or CI
- Replacing other plugins
- Upgrade from WPHouse
Reference
Trust
Help