How to convert Figma to WordPress: 4 routes compared (2026 guide)
How to convert Figma to WordPress in 2026: Elementor, a block theme with theme.json, a custom theme or a converter plugin, plus a design hand-off checklist.
If you are wondering how to convert Figma to WordPress, there are four real routes: rebuild the design in a page builder such as Elementor, build a block theme with theme.json and patterns, code a custom classic or hybrid theme, or run an automated converter plugin and clean up what it produces. None of them is a one-click export. The right route depends on how complex the design is, who will edit the site afterwards, and how much speed and long-term flexibility matter to you.
Quick answer: For most business sites in 2026, I build Figma designs as a block theme: Figma variables become
theme.jsonpresets, sections become patterns, and the client edits everything in the normal WordPress editor. Choose Elementor when your team already uses it. Choose a custom coded theme for complex, data-heavy layouts. Use converter plugins only as a starting point for simple pages.
Four ways to convert Figma to WordPress, compared
| Route | Best for | Editing for the client | Speed and code quality | Main risk |
|---|---|---|---|---|
| Page builder (Elementor) | Marketing teams that already know Elementor | Visual drag and drop | Heavier markup and assets | Builder lock-in, slower pages |
Block theme (theme.json, patterns) |
Most business sites and blogs | Native WordPress editor | Light, standards-based | Needs a developer who knows the block editor |
| Custom classic or hybrid theme | Complex layouts, custom data, strict performance | Fields and templates the developer defines | Leanest, full control | More build time, editing limited to what is planned |
| Converter plugin or AI tool | Quick prototypes, simple landing pages | Depends on output (builder or blocks) | Often messy, needs cleanup | Hidden accessibility and responsive problems |
I compare WordPress itself against fully custom builds in WordPress vs a custom website. This guide assumes WordPress is the right platform and focuses on getting the Figma design into it properly.
Before you build: the Figma hand-off checklist
Most Figma to WordPress projects go wrong before a line of code is written, because the file is a set of pretty pictures rather than a system. Before I quote or start a build, I check the file against this list.
Design tokens
- Colors defined as Figma variables (or at least color styles), with clear names such as
brand/primary,neutral/900,surface/base. No one-off hex values scattered across frames. - Text styles for each heading level, body, small text, buttons and labels, using a limited set of sizes.
- Spacing that follows a scale (for example 4, 8, 16, 24, 32, 48, 64), ideally as number variables.
- Radius and shadow values reused consistently.
Components
- Buttons, cards, form fields, navigation, footer and repeated sections built as Figma components, not copy-pasted groups.
- Component variants for each state: default, hover, focus, active, disabled, and error states for form fields.
Responsive frames
- At least desktop and mobile frames for every page template, ideally tablet as well. Auto Layout used throughout, so I can see how sections should stretch or stack.
- Notes for behavior between breakpoints: does the three-column grid become two columns or one? Does the navigation collapse into a menu?
Content and assets
- Real or realistic copy, not lorem ipsum. Headline length changes layouts.
- Images exported or exportable at sensible sizes, icons as SVG, and font licenses confirmed for web use.
- Empty, loading and error states for anything dynamic: search with no results, a form error, a 404 page.
If the design lacks some of this, it is still buildable, but every missing decision becomes a guess during development or a revision later. Fixing it in Figma first is cheaper.
Route 1: Figma to Elementor
Figma to Elementor works well when your team already uses Elementor and wants to keep editing visually. The process is a manual rebuild:
- Set global styles first. In Elementor's Site Settings, recreate the Figma color variables as global colors and the text styles as global fonts. Elementor version 4 (the "atomic" editor, default on new sites since April 2026 according to Elementor's V4 FAQ (opens in a new tab)) adds Variables, Classes and Components, which map much more cleanly to a Figma design system than the old per-widget styling.
- Match breakpoints. Set Elementor's breakpoints to match the Figma frames, then build desktop first and adjust tablet and mobile.
- Build with containers, not absolute positioning. Flexbox and grid containers mirror Figma's Auto Layout. Absolute positioning looks right at one width and breaks at every other.
- Save sections as templates or components so the header, footer, CTA blocks and cards stay consistent across pages.
The trade-off is weight. Builder pages ship more markup, CSS and JavaScript than a block theme, which shows up in Core Web Vitals. Turn on the builder's performance features, avoid nested containers several levels deep, and do not install add-on packs for one widget. If interaction responsiveness suffers, my guide to improving INP on WordPress covers what to fix.
Route 2: Figma to WordPress block theme
A Figma to WordPress block theme build is my default for business sites, because the structure of a good Figma file maps almost directly onto how block themes work:
| Figma | Block theme |
|---|---|
| Color variables | settings.color.palette in theme.json |
| Text styles (font, size) | settings.typography.fontFamilies and fontSizes, then styles.elements for headings |
| Spacing variables | settings.spacing.spacingSizes |
| Frame content width | settings.layout.contentSize and wideSize |
| Radius and shadow values | settings.custom and settings.shadow.presets |
| Light and dark modes | Style variations in the theme's /styles folder |
| Repeated sections | Patterns in the /patterns folder |
| Components with variants | Block style variations, or a custom block when behavior is needed |
| Page frames | Templates (/templates) and template parts (/parts) |
Mapping Figma variables to theme.json
theme.json is the file where a block theme declares its design tokens and default styles. The current schema is version 3 (introduced in WordPress 6.6 and still current in WordPress 7.1; you can confirm the version and every allowed key in the official theme.json schema (opens in a new tab) and the Theme Handbook (opens in a new tab)). A trimmed example built from a typical Figma file:
{
"$schema": "https://schemas.wp.org/wp/7.1/theme.json",
"version": 3,
"settings": {
"appearanceTools": true,
"useRootPaddingAwareAlignments": true,
"color": {
"defaultPalette": false,
"custom": false,
"palette": [
{ "slug": "base", "name": "Base", "color": "#ffffff" },
{ "slug": "contrast", "name": "Contrast", "color": "#111827" },
{ "slug": "primary", "name": "Primary", "color": "#1d4ed8" },
{ "slug": "muted", "name": "Muted", "color": "#f3f4f6" }
]
},
"typography": {
"fluid": true,
"defaultFontSizes": false,
"customFontSize": false,
"fontFamilies": [
{
"slug": "body",
"name": "Inter",
"fontFamily": "Inter, system-ui, sans-serif",
"fontFace": [
{
"fontFamily": "Inter",
"fontWeight": "400 700",
"fontStyle": "normal",
"src": ["file:./assets/fonts/inter-variable.woff2"]
}
]
}
],
"fontSizes": [
{ "slug": "small", "name": "Small", "size": "0.875rem", "fluid": false },
{ "slug": "medium", "name": "Medium", "size": "1rem", "fluid": false },
{ "slug": "large", "name": "Large", "size": "1.5rem", "fluid": { "min": "1.25rem", "max": "1.5rem" } },
{ "slug": "x-large", "name": "Extra large", "size": "2.75rem", "fluid": { "min": "2rem", "max": "2.75rem" } }
]
},
"spacing": {
"defaultSpacingSizes": false,
"spacingSizes": [
{ "slug": "20", "name": "XS", "size": "0.5rem" },
{ "slug": "40", "name": "S", "size": "1rem" },
{ "slug": "50", "name": "M", "size": "1.5rem" },
{ "slug": "60", "name": "L", "size": "3rem" },
{ "slug": "70", "name": "XL", "size": "4rem" }
]
},
"layout": { "contentSize": "720px", "wideSize": "1200px" },
"custom": { "radius": { "card": "12px" } }
},
"styles": {
"color": {
"background": "var(--wp--preset--color--base)",
"text": "var(--wp--preset--color--contrast)"
},
"typography": { "fontFamily": "var(--wp--preset--font-family--body)" },
"elements": {
"button": {
"color": {
"background": "var(--wp--preset--color--primary)",
"text": "var(--wp--preset--color--base)"
},
"border": { "radius": "var(--wp--custom--radius--card)" },
":hover": { "color": { "background": "var(--wp--preset--color--contrast)" } },
":focus-visible": { "outline": { "width": "3px", "style": "solid", "color": "var(--wp--preset--color--contrast)" } }
}
}
}
}
Three details make this work well for a client:
- Use slugs that describe roles, not colors.
primaryandcontrastsurvive a rebrand;blue-600does not. "custom": falseand"customFontSize": falseremove the free color picker and arbitrary font sizes, so editors stay on the design system instead of inventing new shades.- Fluid type (
"fluid": truewithminandmax) scales headings smoothly between the mobile and desktop frames, which usually matches what the designer intended better than fixed breakpoints.
Figma's REST API for variables is limited to Enterprise plans, so on most projects I read the values in Dev Mode or export them with a Figma plugin, then write theme.json by hand. With a small design system, that takes less time than setting up an automated token pipeline.
Turning Figma sections into patterns
Each repeated section (hero, feature grid, testimonials, CTA, pricing table) becomes a pattern: a PHP file in the theme's /patterns folder that WordPress registers automatically. The reliable way to write one is to build the section in the Site Editor using your presets, copy the block markup, and paste it into the file:
<?php
/**
* Title: Hero with call to action
* Slug: mytheme/hero-cta
* Categories: banner
* Keywords: hero, header, cta
*/
?>
<!-- wp:group {"tagName":"section","align":"full","style":{"spacing":{"padding":{"top":"var:preset|spacing|70","bottom":"var:preset|spacing|70"}}},"backgroundColor":"muted","layout":{"type":"constrained"}} -->
<section class="wp-block-group alignfull has-muted-background-color has-background" style="padding-top:var(--wp--preset--spacing--70);padding-bottom:var(--wp--preset--spacing--70)">
<!-- wp:heading {"level":1,"fontSize":"x-large"} -->
<h1 class="wp-block-heading has-x-large-font-size"><?php echo esc_html__( 'Your headline here', 'mytheme' ); ?></h1>
<!-- /wp:heading -->
<!-- wp:paragraph {"fontSize":"large"} -->
<p class="has-large-font-size"><?php echo esc_html__( 'One sentence that explains the offer.', 'mytheme' ); ?></p>
<!-- /wp:paragraph -->
<!-- wp:buttons -->
<div class="wp-block-buttons"><!-- wp:button -->
<div class="wp-block-button"><a class="wp-block-button__link wp-element-button" href="/contact/"><?php echo esc_html__( 'Get in touch', 'mytheme' ); ?></a></div>
<!-- /wp:button --></div>
<!-- /wp:buttons -->
</section>
<!-- /wp:group -->
Because patterns use presets (var:preset|spacing|70, has-muted-background-color), a later change in theme.json updates every page that uses them. Sections that must stay identical everywhere, such as a footer CTA, can be synced patterns instead, so one edit updates the whole site.
Route 3: custom classic or hybrid theme
Some designs do not fit the block editor comfortably: complex filtering, product configurators, layouts driven by custom data, or pages where marketing should only change text and images inside a fixed structure. For those I build a custom theme in PHP templates, usually as a hybrid: theme.json still defines the tokens so the editor matches the front end, while key templates are coded and content comes from custom fields or custom blocks.
This route gives the cleanest markup and the fastest pages, and it is the only sensible option when the design includes application-like features. The cost is that editing is limited to what the developer planned. That is a feature on a site where the brand must stay consistent, and a frustration if the marketing team expects to move sections around freely. Agree on that before the build starts.
Route 4: Figma to WordPress plugin converters and AI tools
A Figma to WordPress plugin promises to skip the build. The best known is UiChemy (opens in a new tab), which pairs a Figma plugin with a WordPress plugin and exports frames as Elementor widgets, Gutenberg blocks or Bricks elements. AI coding tools can also read a Figma file through Figma's MCP server and draft block markup or theme code.
They are useful for a fast first draft. In my experience their limits are predictable:
- Garbage in, garbage out. Frames without clean Auto Layout export as fixed widths and absolute positions that break on mobile.
- Styles get duplicated as inline values on each element instead of global presets, so a brand color change means editing every page.
- Semantics suffer. Headings chosen for size rather than order, buttons that are styled divs, missing alt text, menus without keyboard support.
- Responsive behavior is guessed. You still tune tablet and mobile by hand.
- Builder lock-in remains if the output is Elementor or Bricks.
Use a converter to speed up a simple landing page or a prototype, then have someone review and clean the output. For a site you will run for years, plan on a proper build.
How to convert Figma to WordPress, step by step
Whichever route you choose, the process I follow is the same:
- Audit the Figma file against the hand-off checklist above and list the gaps.
- Choose the route based on editing needs, complexity and performance targets.
- Set up staging with the current WordPress version (7.1 at the time of writing) and PHP 8.3 or newer, matching the live host.
- Build the tokens first:
theme.jsonpresets or builder global styles. Nothing else starts until colors, type and spacing match the design. - Build templates and template parts: header, footer, page, single post, archive, 404.
- Build sections as patterns, components or blocks, then assemble pages from them.
- Add real content and check every page against the Figma frames at each breakpoint.
- Test accessibility, speed and forms, then fix before launch, not after.
- Hand over with documentation: which patterns exist, how to add a page, what not to touch.
- Launch with SEO checks: redirects from any old URLs, sitemap, analytics and Search Console. My website launch SEO checklist covers that step.
Accessibility: what the Figma file usually misses
Designs often look accessible and are not. During the build I check:
- Color contrast: at least 4.5:1 for body text and 3:1 for large text and interface elements, per WCAG 2.2 (opens in a new tab). Light gray text on white is the most common failure in Figma files.
- Focus states: every link, button and form field needs a visible focus style. If Figma has no focus variant, I design one that fits the brand (the
:focus-visiblerule in thetheme.jsonabove is a start). - Heading order: one H1 per page, then H2 and H3 in order, chosen by structure, not by size. Font size comes from presets, so a visually small heading can still be the right level.
- Alt text and labels: meaningful alt text for informative images, empty alt for decorative ones, and visible labels for form fields (placeholders are not labels).
- Motion: respect
prefers-reduced-motionfor animations the designer added. - Touch targets: buttons and links large enough to tap on the mobile frames.
Keeping the site editable for the client
A pixel-perfect build that the client cannot edit without breaking is a failed project. What I set up so editors stay on the design system:
- Restricted pickers in
theme.json(no custom colors or font sizes), so every choice is an approved preset. - Patterns for every section type, named in plain language, so building a new page means inserting sections rather than designing from scratch.
- Content-only locking on complex patterns (
"templateLock":"contentOnly"on the outer group), which lets editors change text and images without moving or deleting the structure. - Block style variations for approved alternatives, such as an outline button or a dark section, instead of free styling.
- A short handover video or document showing how to add a page, swap an image and update the menu.
Performance and SEO, built in from the start
A Figma build is the cheapest moment to get speed and SEO right. Self-host fonts with only the weights you use, export images at the sizes the layout needs in WebP or AVIF, keep the hero image out of lazy loading, and avoid sliders and background videos unless they earn their weight. Use one H1 per page, real text instead of text inside images, descriptive link text, and clean URLs. If a site still ends up slow after launch, the causes and fixes are in why is my WordPress site slow.
Which route should you choose?
The honest answer to how to convert Figma to WordPress depends mostly on who will edit the site and how often.
- Your team already lives in Elementor and edits pages weekly: Figma to Elementor, built on global styles and containers.
- A business site or blog that should be fast and easy to edit for years: a block theme. This is what I recommend most often.
- Custom data, complex layouts or strict brand control: a custom classic or hybrid theme.
- A quick prototype or single campaign page on a deadline: a converter plugin, followed by a cleanup pass.
When I take on a Figma to WordPress project, I usually review the file and recommend a route before quoting, because the file itself decides much of the effort.
Frequently asked questions
Can Figma export directly to WordPress?
Not natively. Figma has no built-in WordPress export. Converter plugins such as UiChemy and AI tools that read Figma files can generate a starting point, but the output still needs responsive tuning, accessibility fixes and cleanup before it is production ready.
Is Elementor or Gutenberg better for Figma designs?
Gutenberg (the block editor) with a block theme produces lighter, faster pages and avoids builder lock-in, and Figma variables map cleanly to theme.json. Elementor is better when your team already knows it and wants free visual layout control. Both can match a Figma design closely.
How long does it take to convert Figma to WordPress?
It depends on the number of unique templates and sections, the quality of the Figma file, and any custom functionality such as forms, filters or WooCommerce. A clean file with a design system can move quickly; a file with no components or mobile frames takes longer because decisions are made during the build. A fixed quote follows once the file has been reviewed.
Do I need to know code to convert Figma to WordPress?
For a simple site, a page builder lets you rebuild a design without code. For a block theme, a custom theme, or anything that must be fast, accessible and easy for others to edit, you need someone who writes PHP, CSS and block markup comfortably.
If you have a Figma file ready and want it built properly, I can take it from review to launch as part of my WordPress development work.