How to Create WordPress Maintenance Mode Plugin Using Claude AI

If you have ever needed a WordPress maintenance mode plugin but wanted full control without paying for a premium tool, you are in the right place. This step-by-step guide shows you exactly how to create a custom WordPress maintenance mode and coming soon page plugin using Claude AI — without writing a single line of code yourself. Whether you are a complete beginner, a freelancer, or a small business owner, this tutorial takes you from zero to a fully working, professionally designed plugin in one sitting.

Table of Contents

What Is a WordPress Maintenance Mode Plugin?

A WordPress maintenance mode plugin temporarily hides your website from public visitors and replaces it with a custom page — typically showing a message like “We will Be Back Soon,” a countdown timer, and an email capture form. The real site continues to run behind the scenes while you work on updates, redesigns, or bug fixes.

Maintenance mode serves two distinct use cases, and the best plugins handle both:

  • Maintenance Mode: Used when your site is actively broken or under construction. Returns a 503 HTTP status code so search engines know not to penalise your rankings.
  • Coming Soon Mode: Used when launching a brand-new website. Returns a 200 HTTP status code and often includes email capture and social links to build an audience before launch.

Without a maintenance mode page, visitors hit broken layouts or confusing error messages during updates. A polished maintenance page protects your brand and keeps visitors informed — and it protects your SEO at the same time.

Use the detailed prompt below to create same wordpress maintenance mode plugin.

Build a complete, production-ready WordPress Maintenance Mode & Coming Soon
Page plugin. Deliver all files ready to zip and install. No build step
required — plain PHP and vanilla JS only.

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
PLUGIN HEADER & IDENTITY
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Plugin Name: Maintenance Mode & Coming Soon Page
Plugin URI: []
Description: A Gutenberg-native maintenance mode and coming soon page with
countdown timer, subscriber capture, and full design controls.
Version: 1.1.0
Author: Quick Tips
Author URI:[]
Text Domain: maintenance-mode
Requires at least: 5.8
Requires PHP: 7.4
Tested up to: 6.9

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
FILE STRUCTURE
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
maintenance-mode/
├── maintenance-mode.php ← main plugin file
├── readme.txt ← WordPress.org format
├── includes/
│ ├── class-mm-activator.php
│ ├── class-mm-post-type.php
│ ├── class-mm-settings.php
│ ├── class-mm-frontend.php
│ ├── class-mm-countdown-block.php
│ └── class-mm-subscribers.php
├── blocks/
│ └── countdown/
│ ├── index.js ← plain JS block registration, no build step
│ └── editor.css
├── assets/
│ ├── css/frontend.css
│ └── js/frontend.js
└── admin/
├── css/admin.css
└── js/admin.js

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ARCHITECTURE RULES (follow exactly)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1. PRIVATE CUSTOM POST TYPE
– Name: mm_page
– show_in_rest: true (required for Gutenberg editor)
– show_in_menu: false
– public: false
– capability_type: page
– Used for the editable maintenance page content

2. SETTINGS STORAGE
– Single option key: mm_settings (array)
– Use WordPress Settings API
– All settings default to OFF (enabled: false)

3. FRONTEND INTERCEPTION
– Hook: template_redirect, priority 1
– Render a COMPLETE standalone HTML document
– Call wp_head() and wp_footer() manually (for block CSS + SEO)
– Remove _wp_render_title_tag to avoid duplicate <title>
– Maintenance mode: send 503 + Retry-After header + nocache_headers()
– Coming soon mode: send 200
– After rendering, call exit

4. ASSET REGISTRATION
– Hook register_assets() to init (NOT wp_enqueue_scripts)
– Reason: wp_enqueue_scripts fires inside wp_head(), but the plugin
calls wp_head() itself from inside render_maintenance_page(), and
the Countdown block’s render_callback also needs assets already
registered. Hooking to init ensures handles exist in time.

5. CONTENT RENDERING (critical — must follow exactly)
– Use MM_Activator::ensure_default_page() (not get_option directly)
to get the page ID, so a missing/deleted page is auto-recreated
– Before calling apply_filters(‘the_content’, …), set up the proper
WordPress post loop context:
global $post;
$previous_post = $post;
$post = $page;
setup_postdata($post);
$content = apply_filters(‘the_content’, $page->post_content);
$post = $previous_post;
if ($previous_post) { setup_postdata($previous_post); }
else { wp_reset_postdata(); }
– This is required because plugins hooking the_content assume a
proper loop context and can silently strip content without it
– After filtering, check if content is blank:
if (” === trim(wp_strip_all_tags($content))) {
$content = ‘<p>’ . esc_html__(‘This page has no content yet.
Open Edit Page Content from Maintenance Mode settings to add
a heading, message, or countdown.’, ‘maintenance-mode’) . ‘</p>’;
}

6. SELF-HEALING PAGE (MM_Activator::ensure_default_page)
– Public static method (not private, not one-time)
– Called from: activate(), render_maintenance_page(), render_settings_page()
– Logic: check if mm_page_id option points to a valid, non-trashed
mm_page post. If not, create a new one, update the option, return ID.
– Must be idempotent (calling twice in a row returns the same ID)

7. GUTENBERG COUNTDOWN BLOCK
– Block name: maintenance-mode/countdown
– Register via PHP (register_block_type) with a render_callback
– Plain JS editor registration in blocks/countdown/index.js
– NO @wordpress/scripts build step — use wp.blocks, wp.element,
wp.blockEditor from the global wp object
– Server-side render: convert targetDate string via
new DateTime($target_date, wp_timezone()) then ->getTimestamp()
– Output a div.mm-countdown with four div.mm-countdown-unit children
(days, hours, minutes, seconds), each containing:
span.mm-countdown-number (data-type attribute) + span.mm-countdown-label
– Add data-target=”[unix timestamp]” to the wrapper div
– If targetDate is empty or invalid, return empty string

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
BYPASS / ACCESS CONTROL LOGIC
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Visitors see the maintenance page UNLESS any of these are true:
– User has administrator role (always bypass, prevents lockout)
– User’s role is in the bypass_roles setting array
– Visitor’s IP is in the ip_whitelist setting (newline-separated)
– ?mm_preview=1 is in the URL AND user has manage_options capability
(this forces the maintenance page to show even for admins, for preview)

IP detection order: HTTP_CLIENT_IP → HTTP_X_FORWARDED_FOR → REMOTE_ADDR

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ADMIN SETTINGS PAGE
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
– Menu: top-level item in wp-admin sidebar
– Layout: 5 tabs, all in one <form> posting to options.php
– Tab switching via vanilla JS (no jQuery dependency)
– “Edit Page Content” button: links to Gutenberg editor for the mm_page post
– “Preview Page” button: links to home_url(‘/’).’?mm_preview=1′
– Footer credit line (inside settings page only, NOT on public page):
“Created by <a href=”https://www.youtube.com/@ParamFreelance”>Quick Tips</a>”

TAB 1 — General
– Enable Maintenance Mode (checkbox) → enabled
– Mode: Maintenance Mode / Coming Soon (radio) → mode
– Retry-After seconds (number, default 3600) → retry_after
– Auto-Disable: enable toggle + datetime-local field → auto_disable_enabled, auto_disable_at

TAB 2 — Design
– Logo upload (media picker) → logo_id
– Background image upload (media picker) → background_id
– Background color (color picker, default #0F172A) → background_color
– Custom CSS textarea → custom_css
Note in description: text colors use !important; add !important to
your overrides here if they don’t take effect

TAB 3 — Access Control
– Bypass Roles: checkboxes for each editable role → bypass_roles[]
– IP Whitelist: textarea, one IP per line → ip_whitelist

TAB 4 — Subscribers & Social
– Enable subscriber form (checkbox) → enable_subscribe_form
– Subscribe form heading (text) → subscribe_heading
– Social links: one URL field each for:
Facebook, Twitter/X, Instagram, LinkedIn, YouTube
→ social_facebook, social_twitter, social_instagram,
social_linkedin, social_youtube

TAB 5 — SEO & Scripts
– SEO Title → seo_title
– Meta Description → seo_description
– Noindex (checkbox, default true) → noindex
– Header Scripts (textarea, no sanitization — manage_options only) → header_scripts
– Footer Scripts (textarea, no sanitization — manage_options only) → footer_scripts

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
SUBSCRIBERS SYSTEM
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
– Table: {prefix}mm_subscribers (id, email VARCHAR(190), subscribed_at DATETIME)
– Create via dbDelta on activation
– AJAX actions: wp_ajax_mm_subscribe + wp_ajax_nopriv_mm_subscribe
– Validate email, check for duplicate, insert row, return JSON
– Separate admin submenu page listing all subscribers
– CSV export button (outputs all emails as downloadable .csv)

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
FRONTEND PAGE — VISUAL DESIGN
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
CSS design tokens (use CSS variables):
–mm-bg: #0F172A (deep navy background)
–mm-surface: rgba(255,255,255,0.05)
–mm-border: rgba(255,255,255,0.12)
–mm-text: #F8FAFC (off-white)
–mm-text-muted: #94A3B8 (slate)
–mm-accent: #F5B942 (amber)
–mm-accent-contrast: #0F172A
–mm-font: system-ui stack

Layout:
– #mm-maintenance-wrap: position fixed, inset 0, z-index 999999,
flex centered, overflow-y auto
– .mm-maintenance-inner: max-width 720px, flex column, centered,
gap 32px, fade-up entrance animation

CRITICAL — CSS SPECIFICITY:
Scope EVERY selector under #mm-maintenance-wrap (ID prefix) instead of
bare class selectors. Add !important to these specific properties only:
– color on .mm-page-content, headings, paragraphs, links, button text
– color on countdown numbers, labels, expired text
– color on subscribe heading, input text, button text
– success/error message colors
– display and position on #mm-maintenance-wrap itself
Reason: wp_head() loads the active theme’s stylesheet on this page.
Without this, theme CSS resets can override text colors and make
content invisible even when it’s actually present in the HTML.

Countdown cells: 4 boxed amber tabular-numeral cells in a flex-wrap row
(wraps to 2×2 on mobile). Each cell: dark translucent bg, rounded border.

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
FRONTEND JS (assets/js/frontend.js)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
– Countdown ticker: read data-target timestamp from .mm-countdown,
calculate days/hours/minutes/seconds remaining, update DOM every second
via setInterval. When expired, hide the countdown cells and show
.mm-countdown-expired-text instead.
– Subscriber form: intercept submit, post via fetch() to admin-ajax.php
with action=mm_subscribe + nonce, display success/error message,
disable button during request.
– No jQuery dependency.

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
DEFAULT PAGE CONTENT (starter Gutenberg markup)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Pre-fill the mm_page post with this block markup so the editor
never opens blank:

<!– wp:heading {“level”:1,”align”:”center”} –>
<h1 class=”has-text-align-center”>We’re Making Things Better</h1>
<!– /wp:heading –>

<!– wp:paragraph {“align”:”center”} –>
<p class=”has-text-align-center”>Our site is currently undergoing
scheduled maintenance. We’ll be back online shortly — thank you
for your patience.</p>
<!– /wp:paragraph –>

<!– wp:maintenance-mode/countdown {“targetDate”:”[+14 days from activation]”} /–>

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
DIAGNOSTIC COMMENT (add to rendered HTML)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Add this HTML comment immediately inside #mm-maintenance-wrap:

<!– mm-debug: page_id=X raw_content_length=Y –>

Where X = the resolved page ID and Y = strlen($page->post_content).
Visible only via “View Page Source” — useful for troubleshooting
blank-content issues without touching the live page.

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
SANITIZATION RULES
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
– enabled, noindex, enable_subscribe_form, auto_disable_enabled: cast to bool
– mode: whitelist [‘maintenance’, ‘coming_soon’]
– bypass_roles: array_intersect against get_editable_roles() keys
– logo_id, background_id: absint
– background_color: sanitize_hex_color
– custom_css: wp_strip_all_tags (strips <script> etc.)
– header_scripts, footer_scripts: NO sanitization (manage_options users
already have unfiltered_html; sanitizing would break legitimate script tags)
– social URLs: esc_url_raw
– retry_after: absint
– All other text fields: sanitize_text_field

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
AUTO-DISABLE SCHEDULE
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Check inside maybe_show_maintenance_page():
If auto_disable_enabled is true AND auto_disable_at is set AND
current time >= strtotime(auto_disable_at):
Set enabled = false, call MM_Settings::update_settings(), return.
This flips the plugin off automatically at the target time without
needing WP-Cron.

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
INLINE CSS INJECTED AT RENDER TIME
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Output a <style id=”mm-inline-styles”> block in <head> after wp_head():
– background-color from setting (sanitize_hex_color)
– background-image from background_id (wp_get_attachment_image_url full)
with background-size: cover; background-position: center
– custom_css content appended after

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
readme.txt REQUIREMENTS
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
WordPress.org format. Include:
– Stable tag: 1.1.0
– Changelog with both 1.0.0 (initial release) and 1.1.0 entries
– 1.1.0 entry must mention: blank content fix, self-healing page,
post-context rendering fix, empty-content fallback, hardened CSS,
diagnostic HTML comment

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
VERIFICATION STEPS (run after writing all files)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1. Run: php -l on every .php file — zero syntax errors required
2. Run: node –check on every .js file — zero syntax errors required
3. Confirm no duplicate method names within any class
4. Confirm MM_Activator::ensure_default_page() is public static
5. Confirm register_assets() is hooked to init, not wp_enqueue_scripts
6. Confirm apply_filters(‘the_content’,…) is wrapped with
setup_postdata() / wp_reset_postdata()
7. Confirm every CSS selector in frontend.css is prefixed with
#mm-maintenance-wrap
8. Zip the folder as maintenance-mode.zip and confirm it contains
exactly the expected file structure above, with no test files included

Deliver: a single maintenance-mode.zip containing all files,
ready to upload and activate in WordPress with no extra steps.

Why Build Your Own Instead of Using an Existing Plugin?

There are dozens of WordPress coming soon and maintenance mode plugins available — SeedProd, WP Maintenance Mode, LightStart, CMP, and others. So why build your own?

Full Control Over Your Plugin

Third-party plugins add their own branding, bloat your dashboard with upsells, and can conflict with your theme or other plugins. A plugin you build yourself does exactly what you need and nothing more.

No Recurring Costs

Many premium maintenance mode plugins charge monthly or annual fees for features like countdown timers, subscriber capture, and design customisation. Building your own with Claude AI costs nothing beyond your Claude subscription.

Better Security

Every additional plugin you install is a potential attack surface. A lean, custom plugin with no unnecessary dependencies is inherently more secure than a feature-bloated plugin maintained by a third party.

A Genuine Learning Experience

Even if you never write PHP yourself, walking through this process teaches you how WordPress plugins work, how AI-assisted development operates, and how to prompt an AI tool to get professional-grade results you can reuse on future projects.

What Is Claude AI and Why Use It for WordPress Development?

Claude is an AI assistant built by Anthropic, designed to be helpful, harmless, and honest. For developers and non-developers alike, Claude excels at writing, reviewing, and debugging code — including PHP, JavaScript, and the specific conventions WordPress plugins require.

Claude vs Other AI Coding Tools

While ChatGPT and GitHub Copilot are popular for AI coding, Claude stands out for WordPress plugin development for a few key reasons:

  • Longer context window: Claude can hold an entire plugin worth of code in memory at once, making multi-file projects more reliable.
  • Better instruction following: Complex multi-step prompts — like building a plugin with 14 specific features — are handled more accurately.
  • No build-step code: Claude produces plain PHP and vanilla JavaScript that works inside WordPress without a compile step. No Node.js or Webpack needed.

Free vs Pro: What Can You Do?

Claude free tier can write plugin code. However, for a project this complex — multiple files, iterative bug fixing, syntax checks, and packaging the final zip — Claude Pro is the more practical choice. The Pro plan offers higher message limits, more capable models, and the ability to execute code directly in the conversation.

Plugin Features You Will Build

This is not a basic “put up a blank page” plugin. The plugin in this tutorial is a production-ready tool with the following features:

Core Functionality

  • Maintenance Mode (503 status) and Coming Soon Mode (200 status), switchable from the admin panel
  • Proper 503 Retry-After header so Google does not deindex your site during maintenance
  • Auto-disable schedule: set a date and time for the plugin to turn itself off automatically without WP-Cron
  • Administrator bypass: the site owner always sees the real site, preventing accidental lockouts

Design and Customisation

  • Full-page dark design with deep navy background, off-white text, and amber countdown accents
  • Logo upload, background image upload, and background color picker
  • Custom CSS field for advanced style overrides

Countdown Timer (Gutenberg Block)

  • A native Gutenberg block — no Elementor or page builder required
  • Server-side rendered so the countdown is accurate on every page load
  • Four animated boxes: Days, Hours, Minutes, Seconds with amber numerals
  • Configurable target date from inside the block editor
  • Automatic expired state when the countdown reaches zero

Email Subscriber Capture

  • Optional subscriber form with a custom heading
  • Stores emails in a custom database table inside your WordPress installation
  • CSV export from the WordPress admin panel at any time
  • AJAX-powered: no page reload on form submit

Access Control

  • Role-based bypass: allow editors, authors, or custom roles to see the live site
  • IP whitelist: allow specific IP addresses to bypass maintenance mode
  • Preview mode (?mm_preview=1) for admins to check the live maintenance page

Social and SEO

  • Social media links for Facebook, Twitter/X, Instagram, LinkedIn, and YouTube
  • Custom SEO title and meta description for the maintenance page
  • Noindex toggle to prevent search engines indexing the maintenance page
  • Header and footer script fields for analytics codes, pixels, or any third-party scripts

What You Need Before You Start

You do not need any coding knowledge. You only need:

  1. A Claude AI account — free or Pro at claude.ai
  2. A self-hosted WordPress website running WordPress 5.8 or later
  3. Access to your WordPress admin dashboard
  4. A way to upload a plugin zip file via Plugins > Add New > Upload

No local development environment, no terminal, no code editor required.

Step-by-Step: How to Build the Plugin with Claude AI

Step 1: Open Claude and Start a New Conversation

Go to claude.ai and start a fresh conversation. Give it a clear title such as “WordPress Maintenance Mode Plugin” so you can return to it if the session is interrupted.

Step 2: Write Your Master Prompt

The single most important factor in getting a working plugin from Claude AI is the quality of your prompt. A vague prompt produces a basic skeleton. A detailed prompt covering the plugin architecture, features, file structure, WordPress-specific hooks, CSS requirements, and edge cases produces a production-ready result.

Your prompt should cover:

  • The plugin name, author, version, and file structure
  • Every feature the plugin must have with specific technical details
  • Which WordPress hooks to use and why (e.g. hook register_assets to init, not wp_enqueue_scripts)
  • Content rendering rules — use proper post loop context around apply_filters
  • CSS specificity requirements — scope every selector under the wrapper ID
  • Bypass logic, IP whitelist behaviour, and self-healing page recreation

Step 3: Review the Generated Plugin Files

Claude will generate all plugin files in sequence. Read through each one and confirm the file structure matches what you asked for, the admin panel has all five tabs, and the features are named and labelled correctly.

Step 4: Ask Claude to Run Syntax Checks

On Claude Pro, Claude can execute code. Ask it to run php -l on every PHP file and node –check on every JavaScript file. This catches syntax errors before you upload the plugin to your live site. If Claude finds errors, ask it to fix them in the same conversation — it has the full context of every file it wrote.

Step 5: Package and Download the Plugin

Ask Claude to zip the plugin folder and provide it as a downloadable file. On Claude Pro, Claude will package the files and present a download link in the conversation. You receive a maintenance-mode.zip file ready to upload to WordPress.

Step 6: Upload to WordPress

In your WordPress admin panel go to Plugins > Add New > Upload Plugin. Select the zip file, click Install Now, then Activate Plugin.

Step 7: Enable and Configure

After activation a new Maintenance Mode item appears in your WordPress sidebar. Visit the Design tab to set your background color and upload a logo. Click Edit Page Content to open the Gutenberg editor and customise your heading, message, and countdown timer block. Then return to the General tab and enable maintenance mode.

How to Install and Activate Your Plugin

Installing a plugin from a zip file is straightforward:

  1. Log in to your WordPress admin dashboard
  2. Go to Plugins in the left sidebar, then click Add New
  3. Click the Upload Plugin button at the top of the page
  4. Click Choose File and select your maintenance-mode.zip file
  5. Click Install Now and wait for the installation to complete
  6. Click Activate Plugin

The plugin is now active. Maintenance mode is OFF by default — you will not accidentally lock yourself out just by activating it. You need to explicitly enable it from the plugin settings.

How to Configure the Plugin Settings

General Tab

This is where you turn maintenance mode on or off, switch between Maintenance Mode and Coming Soon mode, and set up auto-scheduling. The Retry-After field (default 3600 seconds) tells search engine crawlers how long to wait before re-crawling your site.

Design Tab

Upload your logo, set a background color or background image, and add any custom CSS. The default design uses a deep navy background, off-white text, and amber countdown numerals — every element can be overridden from this tab.

Access Control Tab

Choose which user roles can bypass the maintenance page and see the real site. Administrators always bypass by default. You can also whitelist specific IP addresses — useful for showing the live site to a client while keeping it hidden from the public.

Subscribers and Social Tab

Enable the email subscriber form and set the heading text. Add your social media profile URLs. Subscribers are stored in your WordPress database and can be exported as a CSV from the Subscribers submenu at any time.

SEO and Scripts Tab

Set a custom page title and meta description for the maintenance page. Enable or disable the noindex tag. Paste in any header or footer scripts — Google Analytics, Meta Pixel, or anything else that needs to load on the page.

Editing the Maintenance Page Content in Gutenberg

Click the Edit Page Content button at the top of the settings panel to open the Gutenberg block editor. This is where you customise the heading, body text, and countdown timer. The Countdown Timer is available as a custom block — add it, set the target date, and it counts down live on the maintenance page.

Troubleshooting Common Issues

The Maintenance Page Shows But Content Is Blank

This is the most common issue. The plugin’s internal page reference can become stale if the page record is deleted or if another plugin interferes with WordPress’s content rendering pipeline. The v1.1.0 plugin includes a self-healing mechanism that automatically recreates the page if it goes missing.

To diagnose the issue, open View Page Source on the maintenance page and look for this comment near the top of the HTML:

<!– mm-debug: page_id=X raw_content_length=Y –>

If page_id is 0 or raw_content_length is 0, the self-healing has triggered and should resolve on the next page load. If the content length is greater than 0 but nothing shows, it is a CSS conflict with your theme — update to v1.1.0 which uses hardened ID-level CSS specificity.

Background Color Works But Text Is Invisible

This means your active theme’s stylesheet is overriding the plugin text color rules. The v1.1.0 plugin uses ID-level specificity (#mm-maintenance-wrap) and !important on text colors specifically to prevent this.

The Countdown Timer Does Not Appear

The countdown block is a Gutenberg block. If your maintenance page was created without it, go to Settings > Edit Page Content, click the + button to add a block, and search for Countdown Timer.

I Cannot See the Real Site When Logged In

Make sure your WordPress user account has the Administrator role. Administrators bypass maintenance mode automatically. If using a different role, add it to the Bypass Roles list in the Access Control tab.

Pro Tips for Getting the Best Results from Claude AI

Be Extremely Specific in Your Prompt

Claude performs best when given complete, detailed instructions. Instead of “add a countdown timer,” specify the block name, registration method, rendering approach, and JavaScript requirements in full. The more precise your prompt, the more reliable the output.

Work Iteratively

Start with the core plugin structure, verify it works, then ask Claude to add features one section at a time. This is much more reliable than asking for everything in one massive prompt — especially on the free tier where conversation length is limited.

Ask Claude to Explain Its Decisions

If Claude chooses a specific WordPress hook or architecture pattern, ask it why. Understanding the reasoning helps you write better prompts for future projects and makes you a more informed WordPress site owner.

Test on a Staging Site First

Never install an AI-generated plugin on a live production site without testing it on a staging environment first. Most managed WordPress hosts offer one-click staging environments.

Use the Same Conversation for Bug Fixes

If something does not work after installation, report the exact symptom back to Claude in the same conversation. Claude has the full context of every file it wrote and can diagnose issues without you re-explaining the entire plugin.

Comparison: Custom Plugin vs Popular Maintenance Mode Plugins

 

Feature

Custom Claude AI Plugin

Cost

Free (Claude account only)

Third-party branding

None — 100% clean

Countdown Timer

Yes — native Gutenberg block

Email Subscriber Capture

Yes — stored in your own database

CSV Export

Yes — built in

Role-Based Bypass

Yes — all roles configurable

IP Whitelist

Yes

Custom CSS

Yes

SEO Meta / Noindex

Yes

Header / Footer Scripts

Yes

503 Status (Maintenance)

Yes — correct HTTP header

200 Status (Coming Soon)

Yes — switchable

Auto-Disable Schedule

Yes — no WP-Cron needed

No Page Builder Required

Yes — Gutenberg only

Full Code Ownership

Yes — 100% yours

 

Frequently Asked Questions

Can I create a WordPress maintenance mode plugin without any coding knowledge?

Yes. Using Claude AI, you describe the plugin you want in plain English and Claude writes all the PHP, JavaScript, and CSS code for you. You do not need to understand any of the code to use the finished plugin — you just upload the zip file and configure it from your WordPress admin panel.

Is Claude AI free to use for WordPress plugin development?

Claude offers a free tier that can write plugin code. For a complex project like this one — where Claude also runs syntax checks, fixes bugs, and generates a downloadable zip — Claude Pro is recommended. As of 2026, Claude Pro starts at $20 per month.

Will a custom maintenance mode plugin affect my WordPress SEO?

Not if built correctly. The plugin sends a proper 503 status header with Retry-After during maintenance mode, which tells search engine crawlers to come back later without penalising your rankings. The Coming Soon mode sends a 200 status. A noindex toggle is also included for the maintenance page itself.

What is the difference between maintenance mode and coming soon mode?

Maintenance mode returns a 503 HTTP status (Service Unavailable) for temporary downtime during updates. Coming soon mode returns a 200 HTTP status and is used for pre-launch pages with countdown timers and email capture to build an audience before the site goes live.

Can I use the countdown timer without Elementor or a page builder?

Yes. The countdown timer is built as a native Gutenberg block that works directly in the standard WordPress block editor with no page builder required. It is server-side rendered, so the countdown is accurate on every page load.

How do I prevent administrators from seeing the maintenance page?

Administrators automatically bypass the maintenance page as a built-in safety net. To preview the maintenance page as an administrator, add ?mm_preview=1 to your site URL.

Can I export the email subscribers collected on the maintenance page?

Yes. Go to Maintenance Mode > Subscribers in your WordPress admin panel and click Export CSV to download all collected email addresses.

What should I do if the plugin shows a blank maintenance page?

Check View Page Source on the maintenance page and look for the mm-debug HTML comment. If raw_content_length is 0, go to Settings > Edit Page Content and add your heading, message, and countdown block. The self-healing feature in v1.1.0 will automatically recreate a missing page on the next load.

Conclusion

Building a custom WordPress maintenance mode plugin with Claude AI is one of the most practical demonstrations of what AI-assisted development can do for non-coders in 2026. In a single session, Claude AI produces a production-ready plugin with a Gutenberg countdown block, email subscriber capture, role-based bypass, IP whitelisting, SEO controls, and a professionally designed full-page overlay — without you writing a single line of code.

The plugin you have seen in this guide is fully functional, free from third-party branding, and 100% owned by you. No monthly fees, no upsells, no plugin bloat. Just a clean, purpose-built WordPress maintenance mode plugin that does exactly what you need.

If you want to follow along with the full build — including the live demonstration, the exact prompts used, and the bug-fixing session that produced v1.1.0 — watch the complete video tutorial on the Quick Tips YouTube channel at https://www.youtube.com/@ParamFreelance.

Ready to build yours? Open Claude at claude.ai, use the master prompt from the video description, and you will have a working plugin in under an hour.

How to Create a WordPress Maintenance Mode Plugin Using Claude AI

The AI-powered business operating system

Take Your Business To The Next Level

Get 30 Days Free Trial + Free Live Bootcamp
to Launch HighLevel Together

Share this article:

Facebook
Twitter
LinkedIn
Reddit
WhatsApp
Picture of Prashant P Mittal

Prashant P Mittal

Prashant Mittal is a freelance web designer with 15+ years and 1,800+ sites built. He publishes free WordPress, Elementor, WooCommerce & GoHighLevel tutorials at paramfreelance.com

Read more about author

You may also like to read.