Blog
Actionable tips and updates to help you ship plugins, themes, and client sites faster
8 min readHow to delete a theme in WordPress, and what deleting it leaves behind
Appearance, Themes, Theme Details, Delete. That removes the folder. It does not remove the theme's Customizer settings or Site Editor changes, which stay in the database and come back if you reinstall it.
8 min read403 Forbidden in WordPress: find out who said no before you fix anything
A 403 is a refusal, and five different layers can send one: your CDN, a server firewall, Apache or nginx, a security plugin, or WordPress itself. The response body and one line of the error log tell you which.
8 min readWordPress page ID: how to find it, and when it changes
Open the page in the editor and read the number after post= in the address bar. That is the easy part. The ID can also change when content moves between sites, and anything that hardcoded it breaks quietly.
8 min readHow to check your WordPress version, and which number to trust
The fastest place is Dashboard, Updates. But WordPress has two version numbers, a security plugin can change one of them, and the admin footer hides it when you are behind. Here is which check to trust.
8 min readwp-env: setup, what changed in 12.0, and where it stops
Since 11.0, wp-env no longer creates the 8889 test site, and 12.0 needs Node 22.13. The current setup, the errors people actually hit, and the jobs a local Docker WordPress is the wrong tool for.
5 min read"Cannot modify header information - headers already sent by": read the path, then check output_buffering
The fix is in the file named after "output started at", not the one after "in". If the warning appeared after a host move with no code change, the cause is a php.ini setting that was hiding the bug all along.
8 min read"The site is experiencing technical difficulties": what the exact wording tells you
WordPress printed this sentence in version 5.2 only. Every release since says "There has been a critical error", so seeing the old wording today narrows the cause before you touch a single plugin.
9 min read"The response is not a valid JSON response" in WordPress: read the response before you fix anything
The block editor prints this sentence when the server answered, but not with JSON. The first 300 bytes of that answer tell you whether it was a firewall, a PHP warning or a rewrite rule, and whether your post saved anyway.
8 min read"Sorry, you are not allowed to access this page" in WordPress: which of three checks failed
WordPress prints this sentence from one check, after it has already loaded and logged you in. Where you see it tells you which of three causes you have, and file permissions and PHP versions are not among them.