Plugin Documentation
Plugin Documentation

Export WP Pages
to Static HTML

Surgical, flexible static HTML export for WordPress. Export individual posts, hand-picked pages, or any custom post type — in any status, rendered as any user role.

Version 1.3.3.5
GPLv2 or later
WordPress 5.8 – 6.7
PHP 7.4 – 8.3

Overview

§ 01

Export WP Pages to Static HTML is a WordPress plugin that converts your dynamic WordPress content into clean, self-contained static HTML files. Unlike full-site generators that convert everything in one go, this plugin gives you surgical control — exporting exactly the content you need, in the status you want, as the user role you choose.

The plugin is built around a fault-tolerant background export engine that uses WordPress cron, a database queue, exponential backoff for retries, a watchdog for stalled processes, and adaptive batch sizing — making it suitable for everything from a single landing page to large multi-post exports.

Why Export WP Pages to Static HTML?

Precision Export
Choose exactly which posts, pages, or CPT items to export. No need to regenerate your entire site on every change.
Role-Based Rendering
Render pages exactly as a specific WordPress user role sees them — subscriber, editor, or any custom role. Temporary users are created and cleaned up automatically.
Fault Tolerant
Failed URLs auto-retry with exponential backoff. A watchdog reclaims stuck processing rows. Exports can be paused, resumed, or cancelled without data loss.
Organised Output
Optionally group assets into /images, /css, and /js directories for clean, developer-ready output. Flatten parent post URLs to root-level .html files.
Flexible Delivery
Download a ZIP archive, upload directly to an FTP/SFTP server, or receive an email notification when the export completes.
In-Browser Preview
Browse all generated files — HTML pages, images, CSS, JS — directly inside the WordPress admin panel before downloading.

What It Is Not Suitable For

Not suitable for: Sites requiring real-time dynamic content (live chat, WooCommerce checkout, membership portal logins). Also not designed as an automated full-site deployment pipeline — consider the Pro version for bulk and full-site generation.

Requirements

§ 02
Component Minimum Recommended Notes
WordPress5.86.7+Tested up to 6.7
PHP7.48.1+PHP 8.x gives better performance
PHP ZipArchiveRequired for ZIPFor auto-ZIP creation; gracefully skipped if absent
PHP FTP extensionOptionalRequired only if using FTP/SFTP delivery
WP-Cron / Server CronRequiredServer cronBackground processing relies on WP-Cron or a server-side cron job
Writable uploadsRequiredExports written to wp-content/wp-to-html-exports/
REST APIRequiredPlugin uses its own wp_to_html/v1/ namespace
MySQL / MariaDBAny WP-supportedCreates 3 custom tables on activation

Theme & Plugin Compatibility

Compatible with all WordPress themes including block themes and classic themes. Tested page builders include Elementor, Divi, Beaver Builder, Bricks Builder, and Gutenberg. SEO plugins (Yoast SEO, Rank Math, AIOSEO, SEOPress) work correctly. All public registered custom post types are auto-detected.

Installation

§ 03

Automatic (Recommended)

1
Open the Plugin Installer
In your WordPress dashboard, navigate to Plugins → Add New.
2
Search and Install
Search for Export WP Pages to Static HTML, then click Install Now and Activate.
3
Navigate to the Plugin
Go to Tools → Export WP Pages to Static HTML to access the export panel.

Manual Installation

1
Download the ZIP
Download the plugin .zip file from WordPress.org.
2
Upload via Dashboard
Go to Plugins → Add New → Upload Plugin, select the ZIP file, then click Install Now and Activate.
3
Verify Activation
On activation, the plugin creates 3 database tables (wp_to_html_queue, wp_to_html_assets, wp_to_html_status) and the export directory at wp-content/wp-to-html-exports/.
Deactivation note: When the plugin is deactivated, its cron hooks are cleared and all three database tables are dropped automatically. Export files in wp-to-html-exports/ are preserved.

Quick Start

§ 04
1
Open the Export Panel
Navigate to Tools → Export WP Pages to Static HTML.
2
Choose an Export Scope
In the sidebar, select Custom (free) or a Pro scope (All Posts / All Pages / Full Site). For Custom, use the search or browse tabs to select specific posts, pages, or CPT items.
3
Configure Options (Optional)
Expand the accordion sections to set Post Status, Login Role, Asset Options, and Delivery & Notifications.
4
Start Export
Click Start Export. The progress panel shows real-time URL and asset progress. You can Pause, Resume, or Cancel at any point.
5
Download or Preview
When complete, click Preview to browse the exported file tree in-browser, or click Download ZIP to save the archive.

Export Scopes

§ 05
ScopeTierDescription
Custom (Selected) Free Hand-pick individual posts, pages, or custom post type items. Use the search field or browse tabs by content type. Supports multi-select and "Select All" for bulk picks within the current view.
All Posts Pro Export every post (or selected custom post types) across all configured statuses in one run.
All Pages Pro Export your entire pages library in one click.
Full Site Pro Complete WordPress-to-static-HTML conversion including all public post types.
Available scopes are controlled by wp_to_html_allowed_scopes() and can be extended via the wp_to_html/allowed_scopes filter. The Pro plugin can define the WP_TO_HTML_PRO_ACTIVE constant or load the WpToHtml_Pro\Plugin class to unlock Pro scopes.

Post Status Support

§ 06

One of the key differentiators of this plugin is support for all five WordPress post statuses. Most static export plugins only handle published content. This plugin lets you export content in any state, making it ideal for client previews and archiving.

StatusSlugUse Case
PublishedpublishStandard live content export
DraftdraftPreview unpublished pages before they go live
PrivateprivateExport content visible only to logged-in users
Pending ReviewpendingExport content awaiting editorial approval
ScheduledfutureExport pre-scheduled posts before their publish date

Role-Based Export

§ 07

Role-based export allows you to render pages exactly as a specific WordPress user role would see them. This is essential for membership sites, gated content previews, and delivering client work that correctly reflects role-dependent visibility.

How it Works

1
Role Selection
Choose any registered WordPress user role from the Login Role selector in the export panel sidebar.
2
Temporary User Created
The plugin calls wp_create_user() with a randomised login and password, assigns the chosen role, and flags the user with wp_to_html_temp_export_user = 1 meta. The password is never stored.
3
Auth Cookie Generation
At request time, a short-lived authentication cookie (15 minutes) is generated with wp_generate_auth_cookie() and injected into each HTTP request made to fetch pages. Cookies are never persisted to the database.
4
Automatic Cleanup
After the export completes, the temporary user is permanently deleted using wp_delete_user(). Only users flagged with the wp_to_html_temp_export_user meta are ever deleted — your real users are never touched.
If a temporary export user already exists in the export context and is still valid, it is reused rather than creating a new one, reducing database churn on large exports.

Asset Options

§ 08

Asset Collection Modes

ModeWhat Gets IncludedBest For
Strict Only assets directly referenced (CSS, JS, images) by the exported pages themselves Minimal, lean exports; known external CDN assets
Hybrid Default Directly referenced assets plus the full WordPress media library Most use cases; balances completeness and performance
Full Referenced assets + media library + theme assets + all plugin assets Full site archiving; maximum fidelity

Group Assets by Type

When Group assets by type is enabled, all exported assets are automatically sorted into clean subdirectories:

Output directory structure
/wp-to-html-exports/
├── index.html
├── about.html
├── images/
│   ├── logo.png
│   └── hero.jpg
├── css/
│   ├── style.css
│   └── theme.min.css
└── js/
    ├── app.js
    └── vendor.min.js

Parent Posts in Root Directory

When Parent posts in root dir is enabled, parent-level posts are flattened to root-level .html files instead of nested directories:

OptionOutput Path
Disabled (default)/about/index.html
Enabled/about.html

URL Discovery & Crawling

§ 09

Before any HTML is exported, the plugin uses an intelligent URL discovery system to collect all URLs that need to be fetched. The Url_Discovery class orchestrates a set of specialised crawler classes, each targeting a different class of WordPress URL.

CrawlerClassDiscovers
SitemapSitemap_CrawlerURLs listed in sitemap.xml and sub-sitemaps
TaxonomyTaxonomy_CrawlerCategory, tag, and custom taxonomy archive pages
AuthorAuthor_CrawlerAuthor archive pages
Post Type ArchivePost_Type_Archive_CrawlerPost type archive URLs (e.g. /portfolio/)
Date ArchiveDate_Archive_CrawlerYear/month/day archive pages
PaginationPagination_CrawlerPaginated archive and post pages
RSSRss_CrawlerRSS feed URLs
REST APIRest_Api_CrawlerREST API endpoint URLs (optional)

URL Include / Exclude Rules

The Url_Rules engine applies include and exclude rule sets to every discovered URL before it is added to the export queue. This lets you filter out specific paths or restrict exports to a subset of URLs using pattern matching.

Discovery Limits

LimitDefaultFilter to Override
Max pages crawled50url_discovery_max_pages arg
Max total URLs20,000url_discovery_max_urls arg

Export Engine

§ 10

Background Processing Pipeline

The export runs entirely in the background via WordPress Cron (wp_to_html_process_event). The engine uses an adaptive batch system that adjusts the number of URL batches per cron tick based on observed performance.

Adaptive Batch Sizing
Uses an exponentially weighted moving average (EWMA) of batch execution time. Processes 3 batches/tick on fast servers, 1 on slow shared hosting. Memory usage is also considered.
Concurrency Lock
A short-lived transient lock (wp_to_html_export_lock, 45s default) prevents concurrent cron ticks from processing simultaneously. Contended ticks self-heal by rescheduling and nudging WP-Cron.
Exponential Backoff for Retries
Failed URLs and assets are rescheduled with exponential backoff: delay = base × 2^(retry-1), capped at a configurable maximum. Default: base 5s, cap 120s for URLs; base 5s, cap 180s for assets.
Watchdog Repair
On every tick, the watchdog scans for rows stuck in processing state for longer than the TTL threshold (default: 120s for URLs, 180s for assets) and reclaims them back to pending for retry.
Pause / Resume / Cancel
The export lifecycle supports four states: running, paused, stopped, and completed. Pausing stops background work without corrupting the queue. Cancelling clears the queue and resets to idle.
Re-run Failed URLs Only
A dedicated endpoint allows re-running only failed items without restarting the entire export. Each failed entry records a retry_count, last_error, and last_attempt_at timestamp.
Pipeline Stage Reporting
Progress is reported in stages: fetch_urlsfetch_assetswrapup. The UI receives stage-aware progress so users know whether URLs or assets are currently being processed.
Auto-ZIP with Multi-Part Support
On completion, the plugin automatically creates a ZIP archive (requires PHP ZipArchive). For large exports, files are split into multiple parts (default: 1,000 files/part, configurable via filter). Auto-ZIP is skipped if total work exceeds the configured threshold (default: 5,000 items).

Export State Machine

Export state transitions
idle ──[Start Export]──► running ──[All done]──► completed
                 │                    │
                 │           [Pause]  ▼
                 │                 paused ──[Resume]──► running
                 │
                 └──────────────[Cancel]──► stopped ──► idle

Delivery & Notifications

§ 11

FTP / SFTP Upload

The FTP_Uploader class handles direct server-to-server delivery. Configure your FTP settings under Settings → FTP/SFTP.

SettingDefaultDescription
hostFTP server hostname or IP address
port21FTP port (use 22 for SFTP)
userFTP username
passFTP password (stored in WordPress options; consider wp-config.php constants for hardening)
ssl0Enable FTPS (SSL) — requires ftp_ssl_connect() PHP function
passive1Use passive mode (recommended for NAT/firewalls)
timeout20Connection timeout in seconds (5–120)
base_pathRemote base directory path (must start with /)
Remote paths are normalised: backslashes are converted to forward slashes, a leading slash is enforced, and trailing slashes are removed. You can browse the remote directory tree from within the FTP settings panel.

Email Notification

Enable Notify on complete to receive an email when the export finishes. The notification includes the export status, site name, timestamp, and (if created) the ZIP filename.

The initiating admin user always receives the notification. You can add additional recipient email addresses (comma-separated) in the Delivery panel. Emails are sent using wp_mail() — no external service required.

ZIP Download

After export completion, all files are bundled into a ZIP archive automatically (if ZipArchive is available). For large exports:

Multi-Part ZIPs
Exports exceeding the per-part file limit (default: 1,000 files) are automatically split into multiple ZIP parts, each labelled -part1of3.zip, -part2of3.zip, etc.
Auto-ZIP Threshold
If total work (URLs + assets) exceeds 5,000 items, auto-ZIP is skipped to avoid PHP memory/timeout issues. Users can download grouped asset ZIPs (HTML, images, CSS, JS) on-demand from the preview panel.

Export Preview

§ 12

After every export, the built-in file browser lets you preview all generated files — HTML pages, images, CSS, and JS — directly inside the WordPress admin panel without leaving the export screen.

From the preview panel you can also download groups of assets as ZIP archives (e.g., all images, all CSS, all HTML files) in a single click. This is especially useful when auto-ZIP is skipped for large exports.

Architecture

§ 13

Class Overview

ClassNamespaceResponsibility
CoreWpToHtmlBootstraps the plugin, registers cron hooks, manages DB schema upgrades, drives the background processing loop (adaptive batches, watchdog, ZIP creation, email/FTP delivery)
AdminWpToHtmlRegisters admin menu pages (Tools → Export WP Pages to Static HTML and System Status), enqueues assets, localizes the JS config object
RESTWpToHtmlRegisters all wp_to_html/v1/ REST routes, manages the background runner token, creates/destroys temporary export users for role-based rendering
ExporterWpToHtmlFetches individual URLs, rewrites asset paths, saves HTML files, processes asset batches, logs progress. Reads export context from wp_to_html_export_context option
Asset_ManagerWpToHtmlTracks discovered assets in the database, handles deduplication and queuing
Asset_ExtractorWpToHtmlParses HTML to extract referenced CSS, JS, and image URLs
Bulk_Asset_CollectorWpToHtmlImplements Hybrid and Full asset collection modes by enumerating the media library and theme/plugin directories
FTP_UploaderWpToHtmlProvides FTP/FTPS connection, upload, and remote directory listing
DiagnosticWpToHtmlRuns system health checks (PHP version, ZipArchive, writability, DB permissions, REST API loopback) with 15-minute result caching
Advanced_DebuggerWpToHtmlOptional diagnostic layer (enabled via WP_TO_HTML_ADVANCED_DEBUG): captures PHP fatal errors, records progress markers, detects stuck exports
Url_DiscoveryWpToHtml\UrlDiscoveryOrchestrates all URL crawlers, applies include/exclude rules, enforces discovery limits
Url_RulesWpToHtml\UrlDiscoveryApplies include/exclude URL pattern rules during discovery

Plugin Constants

ConstantValueDescription
WP_TO_HTML_VERSION'1.3.3.5'Current plugin version
WP_TO_HTML_PATHplugin_dir_path()Absolute filesystem path to the plugin directory
WP_TO_HTML_URLplugin_dir_url()URL to the plugin directory
WP_TO_HTML_EXPORT_DIRWP_CONTENT_DIR . '/wp-to-html-exports'Absolute path to the export output directory
WP_TO_HTML_DEBUGfalseEnables verbose internal logging to export-log.txt
WP_TO_HTML_ADVANCED_DEBUGfalseEnables fatal-error capture and stuck-export detection. Set true in wp-config.php
WP_TO_HTML_PRO_ACTIVEDefine as true to signal Pro plugin is active and unlock Pro scopes

Database Schema

§ 14

The plugin creates three custom tables on activation using dbDelta() for safe schema migrations. All tables use the current WordPress table prefix.

wp_to_html_queue
idBIGINT UNSIGNED AIPrimary key
urlTEXTThe page URL to export
statusVARCHAR(20)pending | processing | done | failed
retry_countINTNumber of attempts so far
last_errorLONGTEXTError message from the last failed attempt
last_attempt_atDATETIMEWhen the last attempt was made
next_attempt_atDATETIMEEarliest time the next retry may run (backoff)
started_atDATETIMEWhen processing began (used by watchdog)
created_atDATETIMERow insertion timestamp
wp_to_html_assets
idBIGINT UNSIGNED AIPrimary key
urlTEXTAsset URL (unique, 191-char key for index)
found_onTEXTURL of the page where this asset was discovered
asset_typeVARCHAR(30)asset | image | css | js | etc.
local_pathTEXTRelative output path after download
statusVARCHAR(20)pending | processing | done | failed
retry_countINTRetry counter
last_errorLONGTEXTLast error message
next_attempt_atDATETIMEBackoff retry schedule
started_atDATETIMEProcessing start (for watchdog)
wp_to_html_status
idBIGINT UNSIGNED AIAlways 1 — single-row table
stateVARCHAR(20)idle | running | paused | stopped | completed
is_runningTINYINT(1)1 if export is actively processing
pipeline_stageVARCHAR(30)fetch_urls | fetch_assets | wrapup
total_urlsINTTotal URLs in the queue
processed_urlsINTSuccessfully exported URLs
failed_urlsINTPermanently failed URLs
total_assetsINTTotal assets queued
processed_assetsINTSuccessfully downloaded assets
failed_assetsINTPermanently failed assets
watchdog_runsINTTotal watchdog ticks executed
watchdog_repairsINTTotal stuck items reclaimed
updated_atDATETIMEAuto-updated on row change

Hooks & Filters

§ 15
Filter wp_to_html/allowed_scopes
Modify the array of allowed export scopes. Free: ['selected']. Pro adds: 'all_posts', 'all_pages', 'full_site'.
Args: array $scopes
Filter wp_to_html/pro_active
Return true to signal that the Pro plugin is active. Used as a fallback when neither the WP_TO_HTML_PRO_ACTIVE constant nor the WpToHtml_Pro\Plugin class is found.
Args: bool $active
Filter wp_to_html_bg_lock_ttl_seconds
Override the background processing lock TTL. Default: 45 seconds. Lower values reduce the chance of stall after a PHP crash; higher values reduce risk of two ticks running concurrently on slow servers.
Filter wp_to_html_bg_tick_delay_seconds
Delay between background processing ticks. Default: 2 seconds (minimum: 1).
Filter wp_to_html_bg_tick_time_budget_seconds
Maximum execution time per background tick. Default: 18.0 seconds. Reduce on servers with tight PHP time limits.
Filter wp_to_html_bg_target_batches
Override the computed batches-per-tick target. Args: int $target, array $stats, object $status
Filter wp_to_html_bg_target_batches_cap
Maximum batches per tick (hard cap). Default: 6.
Filter wp_to_html_auto_zip_enabled
Enable or disable automatic ZIP creation on export completion. Default: true.
Filter wp_to_html_auto_zip_max_work
Maximum total items (URLs + assets) before auto-ZIP is skipped. Default: 5000. Set to 0 to always ZIP.
Filter wp_to_html_zip_files_per_part
Files per ZIP archive part. Default: 1000. Reduce if ZIP creation fails due to PHP memory limits.
Filter wp_to_html_watchdog_url_ttl_seconds
Seconds before a URL row stuck in processing is reclaimed by the watchdog. Default: 120.
Filter wp_to_html_watchdog_asset_ttl_seconds
Seconds before an asset row stuck in processing is reclaimed. Default: 180.
Filter wp_to_html_url_max_retries
Maximum retry attempts per URL before it is permanently marked failed. Default: 3.
Filter wp_to_html_asset_max_retries
Maximum retry attempts per asset. Default: 3.
Action wp_to_html_process_event
WordPress cron action that drives the background export loop. Fires every wp_to_html_bg_tick_delay_seconds seconds while an export is running.
Action wp_to_html_build_queue_event
WordPress cron action for background queue building. Processes 50 URLs per tick to avoid blocking the REST response.

REST API Reference

§ 16

All endpoints are registered under the wp_to_html/v1 namespace and require a valid WordPress nonce (wp_rest). Authentication uses the standard WordPress REST API authentication layer.

EndpointMethodDescription
/wp_to_html/v1/exportPOSTStart a new export. Accepts scope, selected items, post status, login role, asset options, and delivery settings.
/wp_to_html/v1/statusGETReturns current export status including state, progress counters, and pipeline stage.
/wp_to_html/v1/pollGETLightweight status poll endpoint optimised for frequent UI polling.
/wp_to_html/v1/logGETReturns the current export log entries.
/wp_to_html/v1/pausePOSTPause the running export.
/wp_to_html/v1/resumePOSTResume a paused export.
/wp_to_html/v1/stopPOSTCancel the export and reset to idle.
/wp_to_html/v1/contentGETList posts/pages/CPT items for the content picker.
/wp_to_html/v1/exportsGETList exported files for the preview panel.
/wp_to_html/v1/downloadGETStream a ZIP download of a specific asset group or the full export.
/wp_to_html/v1/ftp-settingsGET/POSTRead and save FTP/SFTP configuration.
/wp_to_html/v1/ftp-testPOSTTest FTP connection with current settings.
/wp_to_html/v1/ftp-listPOSTList remote FTP directory contents.
/wp_to_html/v1/system-statusGETRun and return system diagnostics.
/wp_to_html/v1/check-can-runGETQuick preflight check before starting an export.
/wp_to_html/v1/failed-urlsGETList all permanently failed URLs with error details.
/wp_to_html/v1/rerun-failedPOSTReset failed items to pending and reschedule.
/wp_to_html/v1/queue-resetPOSTClear the entire queue and reset status to idle.
/wp_to_html/v1/clear-tempPOSTDelete any leftover temporary export users.
/wp_to_html/v1/reset-diagnosticsPOSTClear the cached diagnostics report.
/wp_to_html/v1/runnerPOSTInternal non-blocking background runner endpoint, authenticated by a secret token.
/wp_to_html/v1/s3-settingsGET/POSTPro Read and save AWS S3 configuration.
/wp_to_html/v1/s3-testPOSTPro Test S3 connection.

System Diagnostics

§ 17

Navigate to Tools → WP to HTML System Status to run a full environment health check. Results are cached for 15 minutes; click Force Refresh to re-run immediately.

CheckWhat It TestsAction if Failing
PHP & WP VersionsPHP ≥ 7.4, WordPress ≥ 5.8Upgrade PHP or WordPress
ZipArchive ExtensionPHP ZipArchive class is availableEnable the zip extension in php.ini
Export Directory Writablewp-content/wp-to-html-exports/ exists and is writableFix file permissions (chmod 755) or create the directory manually
Filesystem MethodWordPress can write files without FTP credentialsSet define('FS_METHOD', 'direct'); in wp-config.php
Database PermissionsMySQL user can CREATE TABLE, ALTER TABLE, INSERT, UPDATEGrant additional DB permissions to the WordPress DB user
REST API LoopbackWordPress can make HTTP requests to its own REST APICheck firewall rules, WP_HTTP_BLOCK_EXTERNAL constant, or SSL certificate validity

Advanced Debugging

For difficult-to-diagnose issues, enable the Advanced Debugger by adding to wp-config.php:

wp-config.php
define('WP_TO_HTML_ADVANCED_DEBUG', true);

When enabled, the Advanced Debugger registers a register_shutdown_function to capture PHP fatal errors, records timestamped progress markers on each tick, and detects exports that appear stuck (no progress for a configurable threshold, default 120 seconds).

Frequently Asked Questions

§ 18

Will running an export affect my live WordPress site?

No. Exports are written to a separate directory (/wp-content/wp-to-html-exports/). Your live WordPress installation remains fully intact and unchanged.

What is the difference between this plugin and Simply Static?

Simply Static and most full-site generators convert your entire WordPress site. This plugin is designed for precision: you choose exactly which posts, pages, or CPT items to export, and in what status and user-role context. This makes it better suited for client deliveries, partial static exports, and content archiving.

Can I export draft or private posts?

Yes. All five post statuses are supported: Publish, Draft, Private, Pending, and Scheduled. Select the desired statuses in the Post Status section of the export panel.

An export seems stuck — what should I do?

First, check the System Status page for any failed health checks, especially the REST API Loopback. If WP-Cron is not running reliably, configure a server-side cron job. If items are stuck in processing, the watchdog will reclaim them automatically on the next tick (within 120–180 seconds). You can also use the Re-run failed button to retry all failed items, or use the Queue Reset endpoint to start fresh.

Does it work on WordPress Multisite?

The free plugin works on individual sites within a multisite network. Each site in the network has its own export directory and database tables (using the site-specific table prefix).

Where are exports stored?

Exports are written to wp-content/wp-to-html-exports/. This directory is created automatically on plugin activation. The export log is stored as export-log.txt in the same directory and is excluded from ZIP archives.

How do I clear exported files?

Use the Queue Reset button in the export panel, or delete the contents of wp-content/wp-to-html-exports/ manually via FTP or the server's file manager. Deactivating the plugin also drops the database tables but preserves the export files.

Can I hook into the export process?

Yes. Several WordPress filters let you customise batch sizes, retry counts, ZIP behaviour, and more. See the Hooks & Filters section for the full list.

Pro Features

§ 19
FeatureDescription
All Posts ExportExport every post (or selected custom post types) in one run across all configured statuses.
All Pages ExportExport your entire pages library with one click.
Full Site ExportComplete WordPress-to-static-HTML conversion: all public post types, archives, and discovered URLs.
AWS S3 DeploymentPush exports directly to an Amazon S3 bucket. Configure bucket name, region, and credentials. Registered as the wp_to_html/v1/s3-settings and wp_to_html/v1/s3-test REST endpoints.
Priority SupportEmail support and priority bug fixes.

The Pro plugin integrates seamlessly by either defining the WP_TO_HTML_PRO_ACTIVE constant, loading the WpToHtml_Pro\Plugin class, or returning true on the wp_to_html/pro_active filter. No modifications to the free plugin core are required.

Changelog

§ 20
1.3.3.5 Latest
ImprovedWatchdog now auto-repairs stuck export processes using TTL-based reclaim and exponential backoff
ImprovedFailed URL tracking with per-URL retry count and last error detail stored in the queue table
ImprovedRe-run only failed URLs without restarting the full export
ImprovedExponential backoff for asset retries reduces load on the origin server
ImprovedAsset collection mode (Strict / Hybrid / Full) saved in export context and honoured across cron runs
FixedExport context correctly propagated to background worker on server cron runs
Addedsingle_root_index and root_parent_html options now persisted in export context
1.3.0
AddedFTP/SFTP upload with remote directory browser
AddedEmail notification on export complete (with additional recipient field)
AddedIn-browser file preview panel with asset ZIP download
AddedGroup assets by type (images/css/js subdirectory organisation)
AddedParent posts in root dir option for flat URL structure
1.2.0
AddedRole-based export (export as a specific WordPress user role)
AddedPost status filter (Publish, Draft, Private, Pending, Scheduled)
AddedCustom post type support in export selector
AddedSmart URL discovery crawlers (sitemap, pagination, taxonomy, author, RSS, REST API, date archives)
1.1.0
AddedPause / Resume / Cancel export controls
AddedSystem Status diagnostics page
AddedBulk asset collector with Strict, Hybrid, and Full modes
1.0.0 Initial Release
AddedOne-click static HTML export for selected posts and pages
AddedZIP download of exported files