A theme that works on a local install still needs a final pass before it's genuinely ready for a live site. None of this is complicated, but skipping it is exactly how small, avoidable problems make it to production.
| Check | Why |
|---|---|
WP_DEBUG is false in wp-config.php | A debug-enabled site can print raw PHP errors and warnings straight onto the page — visible to any visitor, and a real information leak |
screenshot.png is a real, current screenshot | Cosmetic, but the first thing anyone sees in Appearance → Themes |
| Every template file was actually tested | A single post, a page, the homepage, an archive, a 404, and every custom post type's single and archive views — each is a separate file that can fail independently |
| No leftover debug code | Stray var_dump(), print_r(), or console.log() calls left in from development |
| Browser console is free of errors | A broken enqueue or a missing dependency often only shows up here, not visually |
| Permalinks were re-saved once | Settings → Permalinks → Save Changes, to make sure every custom post type and taxonomy's URLs are actually registered |
With Classic Editor and Gutenberg both out of the picture, it's worth double-checking that every custom field a template reads actually has real, sensible fallback behavior when left blank — an empty options-page phone number shouldn't leave a dangling, empty <a> tag anywhere on the live site.
Local isn't the same as production
If a hosting environment supports it, testing on an actual staging copy of the live server — not just a local install — catches the class of bugs that only show up under real server config: PHP version differences, missing extensions, file permission issues. Worth doing at least once before a genuine launch.
That's the full path this section set out to cover — from an empty theme folder to a working, custom-built WordPress theme with its own post types, structured content, and settings, built entirely on plain PHP templates and three focused plugins, with no page builder and no block editor anywhere in the way.