Title: Forms Converter Add-on For HTML Page Publisher
Author: XCast3D
Published: <strong>October 29, 2026</strong>
Last modified: October 29, 2026

---

Search plugins

![](https://ps.w.org/forms-converter-add-on-for-html-page-publisher/assets/banner-
772x250.png?rev=3774165)

![](https://ps.w.org/forms-converter-add-on-for-html-page-publisher/assets/icon-
256x256.png?rev=3774165)

# Forms Converter Add-on For HTML Page Publisher

 By [XCast3D](https://profiles.wordpress.org/xcastaneda/)

[Download](https://downloads.wordpress.org/plugin/forms-converter-add-on-for-html-page-publisher.1.0.0.zip)

 * [Details](https://wordpress.org/plugins/forms-converter-add-on-for-html-page-publisher/#description)
 * [Reviews](https://wordpress.org/plugins/forms-converter-add-on-for-html-page-publisher/#reviews)
 *  [Installation](https://wordpress.org/plugins/forms-converter-add-on-for-html-page-publisher/#installation)
 * [Development](https://wordpress.org/plugins/forms-converter-add-on-for-html-page-publisher/#developers)

 [Support](https://wordpress.org/support/plugin/forms-converter-add-on-for-html-page-publisher/)

## Description

**Independent add-on:** Forms Converter Add-on For HTML Page Publisher is made and
supported by Xavier Castaneda. It is not an official HTML Page Publisher add-on,
and HTML Page Publisher’s author doesn’t provide support for it. Support: https://
github.com/xcast3d/forms-for-html-page-publisher/issues

This add-on is built specifically for the original [HTML Page Publisher](https://wordpress.org/plugins/html-page-publisher/)
plugin. HTML Page Publisher remains responsible for uploading, storing, versioning,
and serving the static landing pages; this add-on supplies form detection, conversion,
and rendering. It requires HTML Page Publisher 1.5.2 or later and does not replace
it.

HTML Page Publisher publishes uploaded static landing pages as-is, outside the theme.
Landing pages generated by AI tools or page builders usually include a `<form>` 
that doesn’t submit anywhere. This add-on converts those static forms into working
Gravity Forms, Contact Form 7 or WPForms forms (see Detect Forms below), and lets
you place any existing form in a page with an HTML comment placeholder:

    ```
    <!-- form:gravity:12 --> – Gravity Forms
    <!-- form:cf7:34 --> – Contact Form 7
    <!-- form:wpforms:56 --> – WPForms (Lite or Pro)
    ```

Optional flags (both default to false, since landing pages usually have their own
heading):

    ```
    <!-- form:wpforms:56 title=true description=true -->
    ```

The older `<!-- gravity-form:12 -->` syntax keeps working.

#### Keeping the landing page’s design (styles=page)

    ```
    <!-- form:cf7:34 styles=page button-class="btn btn-primary" -->
    ```

With `styles=page`, the form plugin’s visual theme is turned off and the landing
page’s own CSS styles the form:

 * Gravity Forms: theme CSS off (`gform_disable_css`), plain markup without Orbital
   variables, no “* indicates required fields” note.
 * WPForms: its “No styles” level (a small functional stylesheet only).
 * Contact Form 7: its functional stylesheet stays; auto-paragraphs are off and 
   the submit `<input>` becomes an equivalent `<button>`, so button rules written
   for the original page apply.
 * `button-class` is added to the submit button; `class` and `id` (optional) go 
   on the rendered form and a wrapper.
 * A small base stylesheet fills gaps (field spacing, choice lists, hidden honeypots,
   readable validation messages). Its layout rules use `:where()`, so any rule in
   the page wins.

Without `styles=page`, forms use the form plugin’s own theme.

Converted forms use `styles=page` by default (filter `ffhpp_default_styles`). The
original `<form>` becomes a `<div>` with the same class, id and other presentational
attributes, and anything inside the form before the first field (a heading, intro
text) or after the button stays in place around the placeholder:

    ```
    <div id="signup" class="signup-form"><h2>Tell us about your project</h2><!-- form:cf7:34 styles=page button-class="btn btn-primary" --></div>
    ```

So rules like `.signup-form`, `.signup-form input`, `.signup-form label`, `#signup…`
and `.btn-primary` keep working. Textarea `rows` and the submit button text carry
over.

What it does:

 * Replaces only these explicit placeholders. Shortcodes elsewhere in the uploaded
   HTML are left untouched.
 * Prints only the styles, scripts and settings the form plugin needs, not the theme’s
   head or footer.
 * Routes submissions that post to the page URL (no-JS fallbacks, Gravity Forms’
   iframe AJAX) to the form plugin’s own handler, and only for forms whose placeholder
   is in that page. JavaScript submissions use each plugin’s own endpoint (Gravity
   Forms iframe, Contact Form 7 REST API, WPForms admin-ajax).
 * The form plugin’s own validation, anti-spam, notifications, confirmations and
   entry storage apply.
 * Missing, inactive or trashed forms, or an inactive form plugin: a visible warning
   in draft previews; an HTML comment (nothing visible) on published pages.

Requires HTML Page Publisher 1.5.2 or later and at least one of: Gravity Forms (
2.9+; tested with 3.2.0), Contact Form 7 (tested with 6.2.3), WPForms Lite/Pro (
tested with Lite 2.0.3).

#### Detect Forms: convert raw HTML forms

AI-generated pages often ship a `<form>` with no working backend. **HTML Pages  
Detect Forms** finds them:

 * Pages are flagged whenever their HTML is written (upload, replace, editor save,
   restore); the submenu shows a count badge, and HTML Pages screens show a notice.
 * Each detected form shows its fields (label, type, required flag, choices, HTML
   name), the submit button text and where the form currently posts. Forms that 
   post to an external service are marked, and converting one asks for confirmation.
 * **Convert to** lets you pick the form plugin when more than one is active. Differences
   for the chosen plugin are listed before converting (for example, fields WPForms
   Lite doesn’t have).
 * Converting creates the form, then replaces exactly that `<form>…</form>` in the
   page with its placeholder. The rest of the page is untouched.
 * The page is saved through HTML Page Publisher’s page service, which keeps the
   previous version in the page’s history, so a conversion can be undone there.
 * If the page changed after it was reviewed, the conversion is refused. If saving
   the page fails, the new form is deleted again.

Field mapping:

 Detected
 Gravity Forms Contact Form 7 WPForms Lite (Pro)

 text, search, password
 Single Line Text `[text]` Single Line Text

 email
 Email `[email]` Email

 tel
 Phone `[tel]` Single Line Text (Phone)

 url
 Website `[url]` Single Line Text (Website)

 number, range
 Number `[number]` Numbers

 date
 Date `[date]` Single Line Text (Date)

 hidden
 Hidden, filled from the query string `[hidden … default:get]` skipped (
Hidden, `{query_var}`)

 textarea
 Paragraph Text `[textarea]` Paragraph Text

 select
 Drop Down `[select … first_as_label]` Dropdown

 radio group
 Radio Buttons `[radio]` Multiple Choice

 checkbox group
 Checkboxes `[checkbox]` Checkboxes

 lone “I agree…” checkbox
 Consent `[acceptance]` Checkboxes, one choice, label 
hidden

A lone checkbox counts as consent when its text mentions agree, consent, accept,
privacy, terms, policy or opt-in. Labels come from `<label for>`, a wrapping `<label
>`, a group’s `<legend>`, then `aria-label`, `placeholder`, `title` or `name`. Choice
values are kept (Contact Form 7 uses “Text|value” pipes).

Created forms get each plugin’s usual defaults: a confirmation message and an admin
email notification. Contact Form 7’s mail body lists every field, with Reply-To 
set to the first email field.

Converting requires the publisher’s capability plus `unfiltered_html` (the same 
check as its HTML editor), and permission to create forms in the chosen plugin (`
gravityforms_create_form`, `wpcf7_edit_contact_forms`, or WPForms’ `create_forms`).

#### WP-CLI

Commands live under the publisher’s own `wp htmlpp` namespace:

 * `wp htmlpp forms plugins` – supported form plugins, whether each is active, and
   its placeholder.
 * `wp htmlpp forms detect [<slug>]` – raw HTML forms per page (fields, button, 
   where it posts). `--format`, `--fields`.
 * `wp htmlpp forms convert <slug> --to=<gravity|cf7|wpforms> [--form=<n>|--all][--
   styles=page|plugin] [--dry-run] [--porcelain]` – convert forms; `--dry-run` shows
   the fields, notes and placeholder without changing anything. Run as an administrator(`--
   user=<login>`), since form plugins check the current user’s permissions.
 * `wp htmlpp forms placeholders [<slug>] [--problems]` – every placeholder and 
   whether its form can be shown (`ok`, `form missing`, `plugin inactive`, `unknown
   plugin`).

Examples:

    ```
    wp htmlpp forms detect
    wp htmlpp forms convert spring-promo --to=cf7 --dry-run
    wp htmlpp forms convert spring-promo --to=gravity --all --user=admin
    wp htmlpp forms placeholders --problems
    ```

Converted forms are titled after the page, with “— form N” (by position in the page)
when it has more than one.

### Support

Open an issue at https://github.com/xcast3d/forms-for-html-page-publisher/issues
with your WordPress, HTML Page Publisher and form plugin versions. For problems 
with HTML Page Publisher itself (uploading or publishing pages), use its support
forum: https://wordpress.org/support/plugin/html-page-publisher/

### How it integrates with HTML Page Publisher

Uses only HTML Page Publisher’s public hooks and page service (version 1.5.2 or 
later):

 * `htmlpp_page_html` – replace placeholders and inject assets.
 * `htmlpp_before_serve` – route a form submission before the page is served.
 * `htmlpp_page_created` / `htmlpp_page_updated` – flag pages that contain HTML 
   forms.
 * `htmlpp_page_meta_defaults` – register the per-page form count (`html_forms`),
   read and written through `htmlpp()->pages`.
 * `htmlpp_serve_priority` – serve pages after form plugins have initialised (see
   below).
 * `htmlpp()->pages` – read pages and their HTML, and save a converted page with
   a version backup (`update_html()`).

Two adjustments, both needed because pages are served during `init`:

 1. HTML Page Publisher serves pages at `init` priority 0 by default, before form plugins
    initialise (`init`, 10). This add-on raises that to priority 20 through `htmlpp_serve_priority`(
    filterable with `ffhpp_serve_priority`). Pages are still served before WordPress’s
    main query runs.
 2. Contact Form 7 and WPForms register their scripts on `wp_enqueue_scripts`, which
    never fires on these pages. When one of their forms is on a page, the add-on runs
    that action once, keeps the registrations, and discards whatever the theme or other
    plugins enqueued.

### Adding another form plugin

Extend `FFHPP_Adapter` (form_exists, render, create_form, delete_form, edit_url,
can_create, and optionally submission routing and conversion notes) and add an instance
with the `ffhpp_adapters` filter. Its `id()` becomes the placeholder key: `<!-- 
form:{id}:{form ID} -->`.

### Filters

 * `ffhpp_adapters` (FFHPP_Adapter[]) – form plugin adapters, in order of preference.
 * `ffhpp_serve_priority` (int, default 20) – init priority pages are served at.
 * `ffhpp_form_markup` (string $markup, string $adapter, int $form_id, bool $preview)–
   rendered form HTML before it replaces the placeholder.
 * `ffhpp_consent_pattern` (string $pattern) – regex that marks a lone checkbox 
   as a consent field.
 * `ffhpp_default_styles` (string ‘page’|’plugin’, FFHPP_Adapter $adapter, array
   $form) – styling mode written into converted placeholders.

Filters and actions used the `htmlpp_forms_` prefix before 0.7.0 (for example `htmlpp_forms_adapters`).
The old names still work in 0.7.0 with a deprecation notice when `WP_DEBUG` is on,
and will be removed in the next release.

### Actions

 * `ffhpp_form_converted` (string $adapter, int $form_id, string $slug, array $form)–
   after an HTML form was converted.

### Known limitations

 * Contact Form 7 does not store submissions; it only sends email. Use working email
   delivery (or the Flamingo plugin) on the live site.
 * Contact Form 7 radio buttons always require a choice.
 * Form plugins’ scripts include WordPress’s jQuery where they need it. A page that
   bundles its own jQuery will load two copies.
 * Every page request now runs after other plugins’ `init` callbacks (priority <
   20), slightly later than before.
 * Multi-page forms, file uploads, payment add-ons and redirect confirmations have
   not been tested yet.
 * Converted forms use the form plugin’s markup. With styles=page, rules that target
   the form through its class/id and element types (`.signup-form input`, `#signup
   label`) keep working; rules that depend on the original structure (`.signup-form
   > label`, sibling selectors, grid placement of direct children, classes on individual
   fields) do not, and `form.signup-form` no longer matches (it’s a `<div>` now).
   Page JavaScript bound to the old form stops working.
 * The page’s `label` rules also reach the labels of radio and checkbox choices,
   which may make them bolder than in the original.
 * File inputs, color pickers and custom widgets are not converted; forms are detected
   in the raw source, so a `<form>` inside a `<script>` string or HTML comment would
   also be listed.

## Screenshots

[⌊HTML Page Publisher's landing-page dashboard shows published pages and flags pages
with unconnected forms.⌉⌊HTML Page Publisher's landing-page dashboard shows published
pages and flags pages with unconnected forms.⌉[

HTML Page Publisher’s landing-page dashboard shows published pages and flags pages
with unconnected forms.

[⌊Detect Forms lists every detected field, requirement, button, and destination 
before conversion.⌉⌊Detect Forms lists every detected field, requirement, button,
and destination before conversion.⌉[

Detect Forms lists every detected field, requirement, button, and destination before
conversion.

[⌊A converted Gravity Form keeps the landing page's custom layout, colors, fields,
and button styling.⌉⌊A converted Gravity Form keeps the landing page's custom layout,
colors, fields, and button styling.⌉[

A converted Gravity Form keeps the landing page’s custom layout, colors, fields,
and button styling.

## Installation

 1. Install and activate **HTML Page Publisher** 1.5.2 or later.
 2. Install and activate at least one supported form plugin: Gravity Forms, Contact
    Form 7, or WPForms.
 3. Install and activate **Forms Converter Add-On for HTML Page Publisher**.
 4. Upload a landing page with HTML Page Publisher.
 5. Go to **HTML Pages  Detect Forms** to review and convert its static forms.

To use an existing form instead, edit the landing page HTML and insert one of the
placeholder comments shown above.

## FAQ

### Which form plugins are supported? Do I need a paid version?

Gravity Forms 2.9 or later, Contact Form 7, and WPForms Lite or Pro are supported.
Gravity Forms requires its own paid license. Contact Form 7 and WPForms Lite are
free. WPForms Lite does not include Phone, Website, Date, or Hidden fields, so those
are converted to text fields or skipped; the review screen explains any differences
before conversion.

### Can I use a form that already exists in my form plugin?

Yes. Add its placeholder to the landing page HTML, such as `<!-- form:gravity:12--
>`, `<!-- form:cf7:34 -->`, or `<!-- form:wpforms:56 -->`. Replace the number with
the form’s ID. Detect Forms is only needed when you want to convert a raw HTML form
already present on the page.

### Will converting a form change my landing page’s design?

Converted forms use `styles=page` by default so the landing page’s CSS remains in
control. The original form’s class, ID, headings, introductory content, button classes,
and content after the button are retained around the new form. Exact field markup
comes from the selected form plugin, so selectors that depend on the original form’s
direct-child structure may need adjustment.

### Can I undo a conversion?

Yes. Conversion saves the page through HTML Page Publisher, which keeps the previous
version. Open the page in HTML Page Publisher and restore the earlier version from
its version history. The form created in the form plugin is not removed automatically
when you restore the page.

### Why is conversion disabled?

Conversion requires permission to edit the published HTML and permission to create
forms in the selected form plugin. HTML Page Publisher respects `DISALLOW_FILE_EDIT`
and `DISALLOW_FILE_MODS`; when either setting disables page editing, form conversion
is disabled too. On multisite, the user may also need the `unfiltered_html` capability.

### Where are submissions stored?

Submission behavior comes from the selected form plugin. Gravity Forms stores entries.
WPForms Pro stores entries; WPForms Lite requires Lite Connect or an upgrade for
entry storage. Contact Form 7 sends email and does not store entries unless you 
add a plugin such as Flamingo. Confirm that outgoing email works on your site.

### What happens if the add-on or form plugin is deactivated?

The landing page continues to load, but placeholders cannot render their forms. 
On a published page they become invisible HTML comments; a draft preview shows an
administrator-facing warning. Reactivate the required plugin or restore the page’s
earlier version.

### Is this an official HTML Page Publisher add-on?

No. Forms Converter Add-on For HTML Page Publisher is an independently developed
companion to the original [HTML Page Publisher](https://wordpress.org/plugins/html-page-publisher/)
plugin. HTML Page Publisher is required, but this add-on is made and supported separately
by Xavier Castaneda. Use this plugin’s GitHub issue tracker for add-on support rather
than asking the HTML Page Publisher author.

## Reviews

There are no reviews for this plugin.

## Contributors & Developers

“Forms Converter Add-on For HTML Page Publisher” is open source software. The following
people have contributed to this plugin.

Contributors

 *   [ XCast3D ](https://profiles.wordpress.org/xcastaneda/)

[Translate “Forms Converter Add-on For HTML Page Publisher” into your language.](https://translate.wordpress.org/projects/wp-plugins/forms-converter-add-on-for-html-page-publisher)

### Interested in development?

[Browse the code](https://plugins.trac.wordpress.org/browser/forms-converter-add-on-for-html-page-publisher/),
check out the [SVN repository](https://plugins.svn.wordpress.org/forms-converter-add-on-for-html-page-publisher/),
or subscribe to the [development log](https://plugins.trac.wordpress.org/log/forms-converter-add-on-for-html-page-publisher/)
by [RSS](https://plugins.trac.wordpress.org/log/forms-converter-add-on-for-html-page-publisher/?limit=100&mode=stop_on_copy&format=rss).

## Changelog

#### 1.0.0

 * First public release.
 * Renamed to Forms Converter Add-on For HTML Page Publisher (slug, folder, main
   file and text domain `forms-converter-add-on-for-html-page-publisher`). Sites
   running a 0.x version from GitHub: deactivate and delete the old `forms-for-html-
   page-publisher` folder, then install this one. Placeholders, hooks, WP-CLI commands
   and converted forms are unchanged.
 * Detect and convert static HTML forms to Gravity Forms, Contact Form 7, or WPForms.
 * Preserve landing-page styling with `styles=page` and version-backed undo.
 * Render existing forms through explicit placeholders and provide WP-CLI commands.
 * Load WordPress’s bundled jQuery when a legacy theme replaces the normal handle
   with an empty footer-loaded placeholder.
 * Keep broad landing-page heading styles from making Gravity Forms validation summaries
   unreadable.
 * Admin notices are limited: dependency warnings only on the Plugins screen (dismissible);
   the unconverted-forms notice only on the HTML Pages list, dismissible per user
   until more pages are flagged.
 * Detect Forms’ styles and script, and the styles=page base stylesheet, load through
   WordPress’s style and script APIs.
 * Gravity Forms fields created by conversion include an empty description, which
   Gravity Forms expects for consent fields.

#### 0.7.0

 * Requires HTML Page Publisher 1.5.2 or later. The add-on now uses only its public
   hooks and page service.
 * Pages are served after form plugins load through HTML Page Publisher’s new `htmlpp_serve_priority`
   filter, instead of re-hooking its renderer.
 * The Detect Forms count badge is cached instead of re-reading every page on each
   admin screen.
 * New prefix `ffhpp` for the add-on’s own code: classes (`FFHPP_Adapter`…), filters
   and actions (`ffhpp_adapters`, `ffhpp_serve_priority`, `ffhpp_form_markup`, `
   ffhpp_consent_pattern`, `ffhpp_default_styles`, `ffhpp_form_converted`) and CSS
   classes (`ffhpp-embed`, `ffhpp-page-styles`). The `htmlpp_forms_*` hooks still
   work for this release, with a deprecation notice. Placeholders, WP-CLI commands(`
   wp htmlpp forms`) and converted forms are unchanged.
 * Detect Forms moved to `admin.php?page=ffhpp-detect-forms` (same menu location).
 * Detect Forms also lists form placeholders that can’t be shown (no form with that
   ID, form plugin inactive, unknown plugin), with the placeholder code, so a page
   that silently shows no form is easy to spot.
 * Converting: text taken from the page (labels, choices, placeholders, button text)
   has any HTML tags removed, and square brackets in Contact Form 7 labels become
   parentheses so they can’t be read as form-tags.

#### 0.6.0

 * Renamed to Forms for HTML Page Publisher (slug, folder and text domain `forms-
   for-html-page-publisher`). Placeholders, hooks and WP-CLI commands are unchanged.
   Reactivate the plugin after updating, since its folder name changed.

#### 0.5.0

 * WP-CLI: `wp htmlpp forms plugins|detect|convert|placeholders`.
 * Converted form titles are numbered by position in the page, stable across separate
   conversions.

#### 0.4.0

 * styles=page placeholder mode: the form plugin’s theme is off and the landing 
   page’s CSS styles the form; base stylesheet for gaps and readable validation 
   messages.
 * Converting keeps the form’s class, id, heading/intro content and button classes(
   the `<form>` becomes a `<div>` around the placeholder), plus textarea rows.
 * Gravity Forms: asterisk required indicator on converted forms.

#### 0.3.0

 * Renamed to HTML Page Publisher – Forms (folder and text domain `htmlpp-forms`);
   hooks renamed from `htmlpp_gf_*` to `htmlpp_forms_*`.
 * Adapters for Contact Form 7 and WPForms alongside Gravity Forms; new `<!-- form:{
   plugin}:{id} -->` placeholder (the Gravity-only syntax still works).
 * Detect Forms can convert to any active form plugin, with per-plugin notes before
   converting.

#### 0.2.0

 * Lone consent/agree checkboxes convert to Gravity Forms’ Consent field.
 * Detect Forms screen: flag pages with HTML forms, preview detected fields, convert
   to Gravity Forms with version backup.

#### 0.1.0

 * Initial release: placeholder rendering, asset injection, submission processing,
   iframe AJAX postbacks.

## Meta

 *  Version **1.0.0**
 *  Last updated **3 days ago**
 *  Active installations **Fewer than 10**
 *  WordPress version ** 5.9 or higher **
 *  Tested up to **7.1.4**
 *  PHP version ** 7.4 or higher **
 * Tags
 * [AI](https://wordpress.org/plugins/tags/ai/)[html](https://wordpress.org/plugins/tags/html/)
   [landing page](https://wordpress.org/plugins/tags/landing-page/)[static html](https://wordpress.org/plugins/tags/static-html/)
 *  [Advanced View](https://wordpress.org/plugins/forms-converter-add-on-for-html-page-publisher/advanced/)

## Ratings

No reviews have been submitted yet.

[Your review](https://wordpress.org/support/plugin/forms-converter-add-on-for-html-page-publisher/reviews/#new-post)

[See all reviews](https://wordpress.org/support/plugin/forms-converter-add-on-for-html-page-publisher/reviews/)

## Contributors

 *   [ XCast3D ](https://profiles.wordpress.org/xcastaneda/)

## Support

Got something to say? Need help?

 [View support forum](https://wordpress.org/support/plugin/forms-converter-add-on-for-html-page-publisher/)