=== AI to Elementor — HTML Importer for Elementor === Contributors: georget777 Tags: elementor, html import, ai, page builder, import Requires at least: 5.8 Requires Plugins: elementor Tested up to: 7.1 Requires PHP: 7.4 Stable tag: 1.3.44 License: GPLv2 or later License URI: https://www.gnu.org/licenses/gpl-2.0.html Convert any HTML page into a fully editable Elementor template with one click. Built for AI-generated pages and hand-written HTML alike. == Description == **AI to Elementor — HTML Importer for Elementor** converts HTML code into native Elementor templates — no copy-pasting into HTML widgets, no broken layouts. Your HTML becomes real Elementor containers, headings, text editors, images, buttons, and videos that you can edit visually. *This plugin is an independent project and is not affiliated with, endorsed by, or sponsored by Elementor Ltd. "Elementor" is a trademark of Elementor Ltd. This plugin is a conversion bridge **for** Elementor.* **Perfect for:** * AI-generated pages from ChatGPT, Lovable, bolt.new, v0, or any code generator * Static HTML websites you want to migrate to WordPress + Elementor * Landing pages built in code that need to become editable templates * Agencies converting client HTML mockups into Elementor sites **How it works:** 1. Paste the HTML for **one page**, or upload that page as an .html/.zip file 2. Click "Convert to Elementor" 3. Open your new template in the Elementor editor 4. Repeat for each additional page **Important — convert one page at a time:** This is a page converter, not a whole-site importer. Each conversion turns a single HTML page into one editable Elementor template. To migrate a multi-page site, convert each page separately (e.g. index.html, about.html, contact.html — one at a time). A .zip may contain one page's HTML plus its images and CSS, but it should not contain an entire website. **For the best results,** follow our HTML guidelines — cleaner, well-structured HTML converts far more accurately (especially for AI-generated pages): [https://aitoelementor.com/ai-guidelines/](https://aitoelementor.com/ai-guidelines/) **Features:** * Converts HTML to native Elementor widgets (not HTML widgets) * Preserves fonts, colors, spacing, and layout * Supports containers, sections, headings, text, images, buttons, videos, icons, and more * ZIP upload with automatic image import to Media Library * Google Fonts detection and registration * **Works with Elementor 4** — converted pages import as classic elements, which Elementor 4 officially supports and lets you edit alongside its new Atomic elements (verified on Elementor 4.2) **What it costs (straight answer):** The plugin is free and every feature is unlocked — nothing is disabled in the code. The conversion itself runs on an external service (see below), and that service is metered: * **Free tier: one (1) free conversion per website**, no sign-up and no key required. Use it to try the plugin on a real page and see the quality before you decide anything. * **Paid tiers (optional):** if you need to convert more pages, the service operator offers subscription plans with higher monthly conversion quotas at [aitoelementor.com](https://aitoelementor.com). You enter the key in Settings. This is a service quota, not a crippled plugin — the plugin code is identical on the free and paid tiers. When you reach the free limit the plugin keeps working and simply tells you the quota is reached; nothing breaks or disappears. == External Service: AI to Elementor Conversion API == This plugin sends HTML content to the AI to Elementor conversion service for processing. The conversion is performed by a Node.js-based engine that runs on the service's external servers — it is not feasible to ship the engine inside a PHP plugin (the engine is ~17 MB of bundled JavaScript that uses headless-browser APIs, a CSS-tree parser, and other Node-only dependencies that cannot run in PHP). **What the plugin sends to the service:** * Your HTML content (the page you want to convert) * The template title you choose * Your site's domain (used by the service to associate usage with your account) * Your subscription key, if you have entered one in Settings (optional — without a key the service allows one free conversion per site) **What the service keeps:** * A copy of the HTML you submitted, retained for up to 90 days to identify and fix conversion bugs, then deleted automatically. Stored with your site's domain and a timestamp only — never with your subscription key or email. Not shared with third parties and not used to train any model offered to others. This applies on the free tier as well as paid plans, and you can opt out in Settings > Data & Privacy or request deletion at privacy@aitoelementor.com. Full terms: Section 9.4 of the Terms of Service linked below. **What the service returns:** * Elementor-compatible JSON template data, which the plugin saves as an Elementor template on your site * A list of Google Fonts detected in your HTML, which the plugin registers via Elementor **Service operator and policies:** * Service URL: [https://api.aitoelementor.com](https://api.aitoelementor.com) * Operator website: [https://aitoelementor.com](https://aitoelementor.com) * Terms of Service: [https://aitoelementor.com/terms-and-conditions/](https://aitoelementor.com/terms-and-conditions/) * Privacy Policy: [https://aitoelementor.com/privacy-policy](https://aitoelementor.com/privacy-policy) The service has a free tier that allows one (1) conversion per website with no key, and optional paid subscription tiers with higher monthly conversion quotas. Both tiers use the same plugin code; the subscription is purely a service-side relationship with the operator and is not a condition of using the plugin. The plugin works fully on the free tier without any subscription. Quotas (if reached) are enforced by the external service and reported back to the plugin as plain error messages. The service URL can be changed in **Settings → AI to Elementor** if you operate your own compatible conversion endpoint. == Installation == 1. Upload the plugin folder to `/wp-content/plugins/` (or install directly from the WordPress Plugins screen → Add New) 2. Activate the plugin through the "Plugins" menu in WordPress 3. Ensure Elementor is installed and activated 4. Go to "AI to Elementor" > "Convert" in the admin menu 5. Paste HTML or upload a file and click "Convert to Elementor" == Frequently Asked Questions == = Do I need Elementor Pro? = No. The plugin works with the free version of Elementor. = Does it work with Elementor 4 (the Atomic editor)? = Yes. Converted pages import as classic elements, which Elementor 4 officially supports alongside Atomic — you edit them exactly as before, and classic elements have no deprecation date. Verified on Elementor 4.2. If your site ships a widget your template uses as "legacy" (off by default), the plugin tells you exactly which one and how to enable it after the import. = What HTML can I convert? = Any valid HTML page — from AI code generators, static websites, landing page builders, or hand-coded HTML. The converter handles modern CSS layouts including flexbox and grid. = How do I get the best conversion quality? = Cleaner, well-structured HTML converts more accurately — semantic tags, sensible class names, and standard CSS layouts all help, while heavily-nested or obfuscated markup (common in some AI exports) is harder to map. We publish a short set of HTML guidelines with concrete do's and don'ts here: https://aitoelementor.com/ai-guidelines/ — worth a look before converting AI-generated pages. = Can I import a whole website at once? = No — and this is important. The plugin converts **one page per conversion**, not an entire site in a single step. Each conversion produces one Elementor template from one HTML page. If you have a multi-page website, convert each page on its own: paste or upload index.html and convert it, then about.html, then contact.html, and so on. If you upload a .zip, it should contain a single page's HTML plus that page's images and CSS — not a full-site export. Trying to convert a whole site in one go will not work as expected. = My converted page is blank / empty on the front end — why? = The most common cause is that Elementor's **Flexbox Container** feature is turned off on your site. Converted templates are built from containers, so with that feature disabled the page renders blank (even though the template imported correctly). The plugin now detects this and shows a warning with a one-click **Enable Flexbox Containers** button (for administrators). You can also enable it manually at **Elementor → Settings → Features → Flexbox Container** (set it to Active and save). After enabling, reload the page — it will render. = My icons came in as markup instead of editable images — why? = Icons drawn as inline SVG can be imported two ways. By default they are kept as markup: they render exactly as designed, but they are not editable through Elementor image controls, and the import notice tells you how many were kept that way. The alternative is to save each icon into your Media Library as a real file, which makes it an ordinary Elementor Image widget. That is off by default on purpose — writing SVG into a Media Library is a security decision that belongs to the site owner, not to a plugin. Every icon is re-sanitised through a geometry allowlist and Elementor's own SVG sanitizer before anything is written, and the permission is scoped to the import itself rather than switching on SVG uploads site-wide. To enable it, add this to a small plugin or your theme functions.php: `add_filter( 'htel_import_svg_icons', '__return_true' );` Convert the page again afterwards — the setting applies at import time, so pages already imported keep the markup they arrived with. = What happens to images in my HTML? = If you upload a ZIP file containing your HTML and images folder, all images are automatically imported to your WordPress Media Library and the paths are updated in the template. = How many conversions do I get for free? = The conversion service includes one (1) free conversion per website — no sign-up or key required — so you can try it on a real page first. If you need to convert more, the service operator offers optional paid subscription plans with higher monthly quotas; you enter the key in Settings. The plugin itself requires no subscription and locks no features — the quota is on the external conversion service, and the plugin works the same on both tiers. = Where does my HTML go? = To the conversion service at `api.aitoelementor.com`. See the "External Service" section above for full details, including the operator's Terms of Service and Privacy Policy links. = Where are my converted templates? = Templates are saved to the Elementor Template Library. Go to "Templates" > "Saved Templates" in your WordPress admin, or use the direct link provided after conversion. = Which AI page generators does it work with? = It works with the HTML output of any code generator — ChatGPT, Claude, Lovable, bolt.new, v0, Cursor, and Anthropic Stitch are all supported, including the offline/bundled export formats some of them produce. It also works with plain hand-written HTML and static site exports. If it's valid HTML, the converter can process it. = What happens after I use my 1 free conversion? = The plugin keeps working — you simply see a plain message from the service saying you've used your free conversion for this site. Nothing in the plugin is disabled or locked. If you need to convert more pages you can optionally subscribe to a paid plan on the service operator's website and paste the key into Settings. = Is my HTML kept or shared? = Your HTML is sent to the conversion service to perform the conversion, and the service also keeps a copy for up to 90 days to find and fix conversion bugs. It is stored with your site's domain and a timestamp only — never with your subscription key or email — and is deleted automatically. It is not shared with third parties and is not used to train any model offered to others. This applies on the free tier as well as paid plans. You can switch it off: untick sampling in the plugin's Settings > Data & Privacy, and nothing further is kept. You can also ask for anything already collected from your site to be deleted by emailing privacy@aitoelementor.com with your domain. Full terms are in Section 9.4 of the operator's Terms of Service, linked in the "External Service" section above. The plugin does not send anything in the background — it only contacts the service when you click Convert, enter a key, or save Settings. = The conversion failed or my page looks off — what do I do? = The result screen auto-diagnoses common causes (security/optimization plugins like Wordfence or SG Security blocking the request, outbound HTTPS blocked, or request-body size). Follow the on-screen guidance for your specific setup. For best fidelity, upload a ZIP that includes your HTML plus its images and CSS files so the converter has the full page. == Screenshots == 1. Main conversion screen — paste HTML or upload a file 2. Successful conversion with template link 3. Converted template in the Elementor editor 4. Settings page — service connection and data preferences == Changelog == = 1.3.44 = * Improved: when icons on your page are kept as markup instead of becoming editable images, the import now says so and how many. This already happened — some pages arrived with a dozen icons as raw HTML — but nothing explained why, so the only available conclusion was that the conversion had gone badly. It had not: keeping them as markup is deliberate, because saving SVG files into a Media Library is a security decision that belongs to you rather than to a plugin. * The notice tells the two cases apart: the setting being switched off, which you can change, and a write that failed even though it is switched on. The FAQ explains how to enable native icon import if you want it; icons are re-sanitised before anything is saved either way. = 1.3.43 = * The import screen now points to the free design skill: one text file you hand to Claude, which writes the page for a real business before you convert it. Nothing installs on your site, and there is no account or email to give. * Privacy, stated plainly: the conversion service keeps a copy of the HTML you submit for up to 90 days to find and fix conversion bugs, stored with your site domain and a timestamp only, never with your subscription key or email, then deleted automatically. It is not shared with third parties and is not used to train any model offered to others. You can switch it off in Settings > Data & Privacy, or ask for anything already collected to be deleted by emailing privacy@aitoelementor.com. This applies on the free tier as well as paid plans, and the paid build of 1.3.42 did not carry this disclosure. = 1.3.42 = * ZIP uploads: an image referenced by a stylesheet from its own folder — for example a stylesheet in css/ using ../images/photo.jpg, which is how most site builders lay a site out — is now found in your archive and imported. Previously that reference was left pointing at a file that was never uploaded, so the image did not appear and nothing said why. Backgrounds in the same stylesheet were the usual casualty. * The same fix covers a stylesheet referring to a file sitting beside it, such as url(bg.png). = 1.3.41 = * ZIP uploads: a stylesheet, image or background referenced with a cache-busting query string (for example style.css?v=2) is now found inside your archive and imported. Previously the reference was left pointing at a file that was never uploaded, and the page arrived unstyled with nothing reported. * ZIP uploads: a reference that selects part of a file — for example an icon out of an SVG sprite, sprite.svg#gear — keeps that selection when the file is imported. Only the cache-busting part of the reference is dropped. = 1.3.40 = * Global Typography: with “Add the page's colours and fonts to my Elementor Site Settings” enabled, headings and body text now arrive as full Global Font presets (size, weight, line height, responsive values) that your widgets reference — edit “Heading 2” once in Site Settings and every matching heading follows. Pages whose headings vary keep their individual styling untouched. If your Site Settings already hold a different style for a heading level, new pages keep their own styling for that level instead of adopting it, and the import notice says so. = 1.3.39 = * Elementor Pro: converting the same navigation again now reuses the WordPress menu it already created instead of adding a duplicate with a random suffix. Menus carry an identity marker, so reuse works even for menus you have since renamed or reordered. * You are now always told when a conversion creates or reuses a WordPress menu — previously the notice only appeared for header/footer template imports. * Fixed: an empty or malformed navigation payload could create a blank menu on every conversion. = 1.3.38 = * Housekeeping: one internal file-deletion call now goes through WordPress's own wrapper, so backup and antivirus plugins that watch file deletions see it. No change to what is imported or how. = 1.3.37 = * When part of your page cannot be imported, the plugin now tells you in your site's error log instead of dropping it silently. That covers ZIP uploads (files skipped for an unsafe path, images or stylesheets we could not read, extra pages we did not import), colours and fonts beyond the per-page limit for Site Settings, inline SVG icons removed by our safety filter, and navigation menus that could not be rebuilt. * Fixed: an SVG icon our safety filter rejected was written into the page unfiltered. It is now removed instead, and you are told. * Fixed: when a page could not be prepared for Elementor, you were shown "Template created successfully" and given a link to an empty template. You now get an error and nothing is added to your library. * Fixed: an image from a ZIP that could not be finished is no longer left behind in your Media Library with nothing pointing at it. * Fixed: a ZIP containing a file named with two dots in a row, such as photo..final.jpg, was skipped as if it were unsafe. * Fixed: if the first page in a ZIP was empty or unreadable, you were told no page was found even when a good one was there. = 1.3.36 = * Fixed: on a site with a small memory limit, a page carrying large embedded fonts could fail part-way through and leave an empty template in your library. The work is now checked against the memory your host actually has before it starts, and if it will not fit the page still converts with the fonts left where they were. * Fixed: a payload that claims to be an image but is not one is no longer saved to your Media Library as a broken file. Images are identified by their own contents rather than by what the page calls them, so a PNG mislabelled as a JPEG is saved correctly as a PNG. * Fixed: on WordPress multisite, your network administrator's list of allowed upload types is now respected. * When something cannot be saved, the conversion now says so in your site's error log instead of leaving it silently. That covers images and fonts we could not read, files your host refused to store, images copied from other sites that could not be fetched, and anything left over from a conversion that had to be undone. * Fixed: if a conversion was interrupted part-way through, files it had already copied into your Media Library could be left behind with nothing pointing at them. They are now removed. = 1.3.35 = * Fonts embedded in your page are now saved to your Media Library as real font files instead of being carried inside the page itself. On pages that embed their fonts this is the bulk of what gets imported - on our own test pages it moved 5.3 MB out of the page content, up to 1.4 MB from a single page. Those bytes used to be stored in your database and re-sent on every page view. * A payload that is not actually a font is left exactly where it was, so nothing that merely claims to be a font ends up in your Media Library. * Fixed: when a page carried an image encoded across several lines - which is how many editors and "Save Page As" captures write them - only part of the image was saved and the picture broke. The whole image is saved now, and anything we cannot read completely is left alone rather than saved in part. This affected images in every previous version. * Converting the same page twice no longer adds a second copy of the same file. = 1.3.34 = * Fixed: when you ticked "I'm converting a header or footer" and uploaded a FOOTER, it was imported as a header template unless the page title happened to contain the word "footer". Footers are now recognised from the markup, which is what the checkbox always implied. If you imported a footer since 1.3.31 and it landed as a header, re-import it — the content was never wrong, only the template type. * Site Styles: with the new "Add this page's colours and fonts to my Site Settings" option ticked, the palette and the font families found on the page are added to your Elementor kit as Global Colors and Global Fonts. Nothing is ever removed or overwritten — entries you renamed or recoloured are left exactly as they are, and importing the same page twice adds nothing. Up to 12 colours and 4 fonts per page; they accumulate, so converting a whole site can leave dozens of entries in a list Elementor does not paginate. The option is OFF by default. * Fixed: a font family whose own name contains a comma — "PT Sans, Narrow" is a real one — was cut short at the comma, so your text fell back to a default font. It now survives intact, everywhere it is used. = 1.3.33 = * Fixed: the plugin could be offered an update to an OLDER version than the one installed, and installing it would downgrade the plugin. The update check now refuses any version that is not newer than the one you are running, whatever the update service says. * Fixed: after an update, the previous update check was still cached and could keep offering a version that no longer applied. The cached answer is now discarded as soon as the installed version changes. = 1.3.32 = * Fixed: 1.3.31 installed a plugin folder with no plugin file inside it, so WordPress deactivated it with "Plugin file does not exist". The release archive had been built with a Windows tool that writes the wrong path separator; the files were all present but under one long name instead of in folders. If you installed 1.3.31, delete the plugin from the Plugins screen and install this version — your settings, licence and imported templates are untouched, they live in the database and not in the plugin folder. * Everything listed under 1.3.31 below is in this release too. = 1.3.31 = * New: convert a header or footer on its own. Tick "I'm converting a header or footer (site part)" and the result comes back as a header or footer template, with the navigation built from real Elementor widgets instead of a block of raw HTML. Assigning it as your site's header needs Elementor Pro's Theme Builder; without Pro you still get a fully editable template in your library, you just cannot set it as the site header. * New: if you paste something that looks like a header or footer on its own, the plugin now offers to convert it as a site part instead of quietly treating it as a whole page. * Improved: a navigation menu written as a list now comes across as separate links, instead of being read as a single menu item. * Improved: pages that used to come out wider than the original now match their source. In our regression set of 183 real pages, thirteen that overflowed horizontally — the worst by 420 pixels — no longer do, and none got worse. * Improved: percentage spacing such as `padding: 0 6%` keeps its percentage instead of being converted to pixels. * Fixed: a decorative corner badge drawn in CSS — a "SALE" or "OUR PICK" ribbon — is no longer painted across the whole card it sits on. * Fixed: when our rendering service is busy, you are now told to try again shortly instead of being told your page is built by JavaScript. Those are two different problems and only one of them is yours to fix. = 1.3.30 = * Fixed: a conversion is no longer counted against your quota unless the template actually reaches your site. Previously the count was taken the moment the conversion service finished, so an import that failed afterwards — a security plugin blocking the response, a server error part-way through saving — still used up an attempt. On the free tier that could leave you unable to try again after a single failed attempt. = 1.3.29 = * Improved: when part of a page is stored inside a `