How to Convert Figma Designs Into a WordPress Theme

Figma to WordPress conversion means taking a static design and turning it into a working WordPress theme built from hand-coded PHP templates, semantic HTML, and custom CSS. This differs fundamentally from exporting HTML snippets or wiring up a page builder to mimic the design’s appearance. It’s a deliberate technical path that holds up through years of edits, redesigns, and traffic growth.
I’ve built this pipeline repeatedly, including a motion-heavy design system that had to translate Figma’s auto-layout into responsive CSS without losing its visual character. That project appears in full in a Figma to WordPress case study. This guide shows the exact process I use: how to take a Figma file from static design to a live, editable WordPress site.
What Figma to WordPress Conversion Actually Involves
Searching "figma to wordpress" surfaces a jumble of options: plugins that sync layers automatically, page builders that let you arrange layouts visually, and hosting tutorials suggesting you export HTML and embed it on a page. None of these represent what professional teams mean by converting Figma to WordPress. They mean building a custom theme from scratch, in code.
A hand-coded theme means the developer reads the Figma file, understands its structure, and writes original PHP template files, functions.php logic, and CSS that match the design pixel-for-pixel while following WordPress’s template hierarchy. Nothing is auto-generated. Nothing becomes a black box you cannot edit later.
Hand-Coded Themes vs. Sync Plugins vs. Page Builders
Here’s how these three approaches actually compare:
| Criteria | Hand-coded theme | Sync plugin | Page builder |
|---|---|---|---|
| Design fidelity | Pixel-accurate, matches Figma exactly | Depends on sync engine, often approximate | Depends on builder’s available widgets |
| Performance | Fastest, minimal extra code | Adds plugin overhead and sync scripts | Heaviest, loads builder framework on every page |
| Long-term editability | Fully editable by any WordPress developer | Locked to the plugin’s ecosystem | Locked to the specific builder |
| Client content editing | Enabled via ACF and Gutenberg blocks | Varies, often re-syncs and overwrites edits | Easy for non-technical clients |
| Best for | Agencies, freelancers, brands needing a theme to last years | Quick prototypes, low-stakes sites | Small sites, non-developers, fast launches |
| Learning curve | Requires PHP, CSS, and WordPress knowledge | Low, mostly configuration | Low to moderate |
Why Your Conversion Path Matters for Performance and Maintenance
A plugin-synced or builder-constructed site functions well on day one. Problems emerge eighteen months later when your client wants a new page type, a faster homepage, or a content editor who isn’t bound to one tool’s ecosystem. Page builders carry extra CSS and JavaScript on every page load, which depresses Core Web Vitals scores. A hand-coded theme ships only the markup and styles each page actually needs, which is why agencies planning to maintain a site for years default to custom builds.
For a deeper explanation of what separates a true custom theme from a "customized" template, see what is a custom WordPress theme.
Preparing Your Figma File for Development
You cannot code from a messy file. Before development starts, the Figma file itself must be development-ready, not just visually finished.
Organizing Frames and Using Clear Naming
Rename every frame to match its eventual template. "Homepage Hero," "Blog Single Post," "Contact Form" tells a developer exactly which PHP template file to expect. Group Figma pages by site section (Marketing, Blog, Account, Legal) so nothing disappears when the file has 40+ frames.
Using Auto-Layout and Component Structure
Every button, card, and navigation bar should exist as a proper Figma component with auto-layout applied, not a manually positioned group of shapes. Auto-layout lets a developer read padding, gap, and alignment values directly and translate them into flexbox or CSS grid rules. A frame built without auto-layout requires reverse-engineering by eye, which slows the build and invites inconsistency.
Figma File Readiness Checklist
- All frames renamed to match intended WordPress templates (home, single post, archive, contact, etc.)
- Components built with auto-layout, not manually placed elements
- A defined type scale (H1 through body text) with consistent font sizes
- A color palette limited to a documented set of swatches, not scattered hex values
- Spacing values that follow a consistent scale (4px, 8px, 16px, 24px, etc.)
- Responsive frames provided for at least mobile and desktop, ideally tablet too
- Icons and images exported at 2x resolution or provided as SVG
- Figma Dev Mode enabled and shared with the developer
Step 1: Audit the Figma File and Map the Component Library
Before writing any PHP, go through the entire file and create an inventory of every reusable piece: buttons, cards, form fields, navigation states, footers, testimonial blocks. This becomes the component library the whole theme gets built from.
Identifying Reusable Elements
Look for repetition. If a card layout appears on the homepage, the blog archive, and the services page, it becomes one PHP template part instead of three separate blocks. This follows atomic design principles: build the smallest reusable pieces first, then compose pages from them.
Mapping Components to WordPress Template Parts
Tag each component with its future WordPress role: template part, ACF field group, or Gutenberg block. A "Pricing Card" component in Figma might become a template-parts/pricing-card.php file, populated by an ACF repeater field. Doing this mapping upfront makes Step 4 an exercise in following the plan rather than improvising.
Step 2: Set Up Local WordPress Development
Never build a custom theme directly on a live server. A local environment lets you break things safely and test freely before anything touches production.
Choosing a Local Development Tool
Local by WP Engine and DevKinsta are the two most common choices, and both are free. Local works across platforms and integrates with any host you’ll eventually deploy to. DevKinsta is the natural choice if the site will ultimately live on Kinsta’s hosting, since it mirrors that server environment closely. Either tool spins up PHP, MySQL, and WordPress on your machine in minutes without manual server configuration.
Installing WordPress and Starting Version Control
Once WordPress is running locally, install a blank starter theme or begin from _s (underscores) as a skeleton and initialize a Git repository immediately. Every theme file, template part, and function should be tracked from commit one. Git isn’t optional polish. It lets you roll back a broken change, collaborate safely, and prove exactly what changed between versions when a client asks. Host the repository on GitHub or GitLab and commit in small, logical chunks rather than one giant "finished theme" commit.
Step 3: Translate Design Tokens Into CSS
Design tokens are the named values that define a design system: specific colors, font sizes, spacing units, and border radii, each given a consistent label so they can be reused everywhere instead of hard-coded repeatedly. Turning Figma’s visual choices into these named values is what makes a hand-coded theme consistent and easy to update later.
Extracting Values via Figma Dev Mode
Figma Dev Mode exposes exact CSS values (hex codes, font weights, pixel spacing, border radii) for any selected layer, without requiring design file access or guesswork. Switch into Dev Mode, click through each component, and record the values it surfaces: color hex codes, font family and weight, line height, and spacing measurements between elements.
Structuring theme.json and CSS Custom Properties
Modern WordPress themes define their design tokens in theme.json, the file that controls global styles, color palettes, and typography settings that show up directly in the block editor. Populate it with the exact values pulled from Dev Mode:
{
"settings": {
"color": {
"palette": [
{ "slug": "primary", "color": "#1a1a2e", "name": "Primary" },
{ "slug": "accent", "color": "#e94560", "name": "Accent" }
]
},
"typography": {
"fontSizes": [
{ "slug": "small", "size": "14px", "name": "Small" },
{ "slug": "large", "size": "32px", "name": "Large" }
]
}
}
}
For anything theme.json doesn’t cover, mirror the same values as CSS custom properties (--color-primary, --space-md) in your stylesheet so every component references one source of truth instead of scattered hex codes.
Step 4: Build Templates and Markup From Figma Frames
This is where the theme gets written. Each Figma frame becomes a PHP template file, and each component becomes a template part included inside it.
Mapping Frames to the Template Hierarchy
WordPress decides which template file to load based on a documented lookup order, the template hierarchy in the official WordPress Theme Handbook. A homepage frame maps to front-page.php, a blog post frame maps to single.php, an archive frame maps to archive.php or a custom archive-{posttype}.php. Understanding this hierarchy before building prevents forcing every page type through one giant template.
Writing Semantic HTML and PHP
Use proper semantic HTML5 elements (<nav>, <main>, <article>, <section>, <footer>) rather than nested <div> soup. This matters because assistive technology depends on it, and it makes CSS easier to write and debug later. Translate Figma’s auto-layout properties directly: a frame with "auto-layout, horizontal, gap 16" becomes display: flex; gap: 1rem; almost verbatim.
Step 5: Wire Up WordPress Functionality
A theme that only looks right with placeholder text isn’t finished. This step makes it a real content management system.
Using Advanced Custom Fields (ACF)
Advanced Custom Fields is the standard way to give clients editable fields that match the exact layout the design called for: a hero heading, a repeater of testimonials, an image with alt text, a set of pricing tiers. Instead of a client editing raw HTML in a text box, ACF gives them a clean form that maps directly to the PHP template you built in Step 4.
Integrating the Block Editor for Client Edits
Not every piece of content should be a rigid ACF field. Blog posts, long-form pages, and anything the client will edit freely belong in the WordPress block editor, Gutenberg. A well-built hand-coded theme registers custom block styles and block patterns that match the Figma design system, so when a client drops in a "Quote" block or a "Columns" block, it automatically inherits the right fonts, colors, and spacing from theme.json. For more on what "customizable" actually means for WordPress themes, see customizable WordPress themes.
Building Menus and Custom Loops
Register navigation menu locations in functions.php, then build the actual wp_nav_menu() output to match the Figma navigation component exactly, including mobile menu states. For anything beyond a simple blog, build custom loops using WP_Query to pull custom post types (like "Case Studies" or "Team Members") into the layouts the design specified, rather than forcing every content type through the default post loop.
Step 6: Test Responsiveness, Accessibility, and Cross-Browser Rendering
A theme that looks perfect on your monitor and breaks on a phone or fails a screen reader test isn’t done. This step is not optional polish; it’s part of the build.
Responsive Breakpoint Testing
Test against the same breakpoints your Figma file defined, commonly around 480px, 768px, 1024px, and 1440px, though the exact numbers should match whatever the design frames specified. Resize the browser manually rather than relying solely on device presets in dev tools, since real-world browser chrome and scrollbars behave differently than simulated device frames.
Accessibility Checks Against WCAG
Run the theme through accessibility checks against the Web Content Accessibility Guidelines (WCAG) published by the W3C. At minimum, check color contrast ratios, keyboard navigation through every interactive element, proper heading order, and alt text on every image. Treat this as best-practice testing that meaningfully improves usability for more people, not a guarantee of formal compliance, since true compliance involves legal and audit considerations beyond a single developer’s checklist.
Cross-Browser Testing
Check rendering in Chrome, Safari, Firefox, and Edge at minimum. Safari in particular handles flexbox gaps, date inputs, and some CSS custom property fallbacks differently than Chromium-based browsers, so it deserves its own dedicated pass rather than an afterthought.
See this workflow demonstrated end to end in this real-time walkthrough:
Step 7: QA, Handoff, and Launch
Final QA Pass
Before calling the theme finished, click through every page, every form, and every interactive state (hover, focus, error, empty) one more time, ideally with fresh eyes or a second developer.
Creating Handoff Documentation
Write a short handoff document: which fields map to which page sections, how to add a new blog post or case study, and who to contact for future development. This single document prevents the most common post-launch support request: "how do I edit this part?"
Pre-Launch QA Checklist
- All ACF fields populated with real client content, no placeholder text remaining
- Forms tested end-to-end, including confirmation emails and spam protection
- 404 page, search results page, and empty-state archive page all styled
- Favicon, meta titles, and meta descriptions set for every page
- SSL certificate active and site forced to HTTPS
- Broken link check completed across the full site
- Google Search Console and analytics installed
- Backups configured and a rollback plan documented
- Final responsive and cross-browser pass completed on production, not just staging
Choosing Your Conversion Path
The right approach depends on three questions: how long will this site need to last, who will maintain it after launch, and how much design precision actually matters to the brand.
| Your situation | Recommended path |
|---|---|
| Brand-heavy site, needs to last 3+ years, precise design fidelity matters | Hand-coded custom theme |
| Non-technical client who will edit the site heavily themselves | Page builder like Elementor |
| Quick internal prototype or low-stakes landing page | Sync plugin or page builder |
| Agency managing multiple client sites long-term | Hand-coded custom theme |
| Solo founder testing an idea before investing in a full build | Page builder, upgrade to custom theme later |
If your project fits that first row, dive deeper into custom WordPress themes vs. templates, which explains when a small business should commit to a fully custom build versus starting from a pre-built template.
Avoiding Common Conversion Mistakes
The same pitfalls appear repeatedly across builds. Watch for these:
- Unflattened auto-layout groups – A designer nests auto-layout frames five levels deep without flattening intent, and the developer has to guess which spacing values actually matter.
- Missing tablet breakpoints – A design that only shows desktop and mobile leaves the entire tablet range (600px to 1024px) to guesswork, which usually produces awkward layout breaks.
- Web font licensing issues – A gorgeous display font in Figma sometimes isn’t licensed for
@font-faceembedding, forcing a late substitution that changes the site’s feel. - Undocumented color variations – Fifteen near-identical shades of blue scattered across a file means fifteen near-identical shades in the final CSS, unless someone consolidates them first.
- Building directly on a live server – Building on production risks a broken homepage being visible to real visitors mid-development.
- Treating accessibility as final polish – Retrofitting proper heading order and contrast ratios after the whole theme is built takes far longer than building them in from Step 4 onward.
Frequently Asked Questions
What does "Figma to WordPress" actually mean?
Converting a static Figma design into a functioning WordPress theme, typically by hand-coding PHP templates and CSS that match the design, rather than relying on a plugin sync tool or a page builder to approximate the layout.
Can I turn my Figma design into a website without a plugin?
Yes. A developer can read the Figma file directly, especially using Figma Dev Mode, and write original PHP templates, CSS, and JavaScript by hand, with no syncing plugin involved at any point.
What’s the difference between hand-coding a theme and using Elementor?
Hand-coding produces lighter, faster-loading pages built from custom code that any WordPress developer can maintain, while Elementor relies on its own visual editor and underlying framework, which adds overhead and ties future edits to that specific tool.
What should I prepare in my Figma file before starting a WordPress conversion?
Organize frames with clear names matching future templates, build components with auto-layout applied, define a consistent type scale and color palette, provide responsive frames for at least mobile and desktop, and enable Figma Dev Mode access for the developer.
What is Figma Dev Mode and how does it help with WordPress?
Figma Dev Mode is a built-in feature that exposes exact CSS-ready values (colors, spacing, typography, border radii) for any selected layer, letting a developer read precise measurements directly instead of guessing them by eye.
What are design tokens and why do they matter?
Design tokens are named, reusable values like color-primary or space-md that represent a design system’s core decisions. They matter because they let a whole theme stay consistent and get updated in one place instead of scattered throughout dozens of files.
How do I set up a local WordPress development environment?
Install a tool like Local or DevKinsta, use it to spin up a fresh WordPress install with PHP and MySQL running on your own machine, then build and test the theme there before deploying anything to a live server.
Should I use Local or DevKinsta?
Use Local if the eventual host is undecided or varies by project, since it works with any hosting provider. Use DevKinsta if the site will be hosted on Kinsta, since it mirrors that server environment closely.
How do I translate Figma colors and typography into CSS?
Open Figma Dev Mode, select each element, copy the exact hex codes, font sizes, weights, and spacing values it displays, and enter them into your theme’s theme.json file and CSS custom properties as named design tokens.
What is the WordPress template hierarchy?
The template hierarchy is the documented order WordPress uses to decide which PHP file renders a given page. Each Figma frame type (homepage, single post, archive) maps to a specific template file in that hierarchy, like front-page.php or single.php.
How do I turn a Figma frame into a PHP template?
Write semantic HTML markup that mirrors the frame’s structure, translate its auto-layout properties into CSS flexbox or grid rules, break repeated components into separate template part files, and wire in dynamic content through ACF fields or the WordPress loop.
What is Advanced Custom Fields (ACF) used for?
ACF lets developers create custom, structured editing fields (text, images, repeaters, galleries) that map exactly to a design’s layout, giving clients a clean way to edit content without touching code.
How does Gutenberg fit into a hand-coded theme?
Gutenberg handles flexible, free-form content like blog posts and long pages, while custom block styles and patterns registered in the theme keep that content visually consistent with the rest of the design system.
How do I build menus and dynamic loops from a Figma design?
Register menu locations in functions.php, output them with wp_nav_menu() styled to match the Figma navigation component, and use WP_Query or custom post types to pull structured content into layouts the design specified.
How do I test responsiveness after converting Figma to WordPress?
Resize the browser manually across the same breakpoints defined in the Figma file (commonly around 480px, 768px, 1024px, and 1440px), rather than relying solely on simulated device presets in browser dev tools.
What accessibility checks should I run before launch?
Check color contrast ratios, full keyboard navigation, logical heading order, and descriptive alt text on every image, using the W3C’s Web Content Accessibility Guidelines as the reference standard for best practice.
How do I handle cross-browser testing?
Test the finished theme in Chrome, Safari, Firefox, and Edge at minimum, paying particular attention to Safari’s handling of flexbox gaps and form inputs, which often differ from Chromium-based browsers.
Why should I use Git during a Figma-to-WordPress build?
Git tracks every change to the theme’s code, making it possible to roll back a mistake, collaborate with another developer safely, and prove exactly what changed between any two versions of the site.
What are the most common pitfalls?
Unflattened auto-layout groups, missing tablet breakpoint frames, unlicensed web fonts, undocumented color duplicates, building directly on a live server, and treating accessibility as a final step instead of building it in from the start.
How long does a hand-coded conversion typically take?
A straightforward marketing site with five to eight unique templates typically takes several weeks from file audit to launch, while larger sites with custom post types, complex ACF structures, and heavier QA can take longer. Timelines depend heavily on how development-ready the Figma file is at the start.
Should I hire a freelancer or do it myself?
If you’re comfortable with PHP, CSS, and the WordPress template hierarchy, a DIY build is realistic. If not, hiring a specialist saves time and avoids common pitfalls. For guidance on this decision, see how to hire a freelance WordPress developer.
Can AI tools help automate parts of the process?
AI tools can speed up repetitive tasks like generating boilerplate CSS from Dev Mode values or drafting first-pass markup, but they still require a developer to review the output against the template hierarchy, accessibility standards, and the design’s actual intent.
What happens after handoff, how do I maintain a hand-coded custom theme?
Ongoing maintenance means keeping WordPress core, PHP, and any dependencies updated, monitoring for plugin conflicts, and using the Git history and handoff documentation to safely make future edits without breaking the original build.
Moving Forward
WordPress currently powers well over 40% of all websites, according to W3Techs’ web technology survey. Investing in a properly hand-coded theme, rather than a shortcut that only holds up for a few months, tends to pay off over the life of a site.
If you’re deciding between building this yourself or bringing in help, start by reading the full Figma to WordPress case study to see this entire process applied to a real, motion-based design system. From there, Ivory Miracle offers hands-on custom WordPress theme development for teams that want the hand-coded path without doing the PHP and CSS work themselves.
Sources
- Template Hierarchy, WordPress Theme Handbook
- Figma Dev Mode, Figma
- Advanced Custom Fields, official site
- Web Content Accessibility Guidelines (WCAG), W3C
- Usage statistics of WordPress, W3Techs
- Local, WP Engine
- DevKinsta, Kinsta
- Elementor, official site
My right hand does not know how much my left hand has given, and vice versa. Over the years, I have given to orphanages, street children and their families, the elderly, women seeking livelihood opportunities, widows, and people who are on the fringes of society. My logic is simple: I never want anyone to feel as though they have been forgotten by society. Sometimes it does not take much. People on the streets have actually smiled at me simply because I gave them a cookie. That smile can stay with you much longer than you expect. No one should feel forgotten. I’m a little like the city that raised me. My favorite food is beef pares, tenderly cooked beef simmered for several hours until the meat practically melts in your mouth. Its taste cannot easily be contained by a poverty of vocabulary when it is cooked just right, and the stew is simply the icing on the cake. In a strange way, it reminds me of the beautiful ways God has arranged my heart through my unique experiences in life. Manila itself feels like a melting pot, no pun intended, of food, beverages, languages, art, people, contradictions, and real life. I think I have become a little like the city that raised me. Read About Me.



5 comments
Good work gets better when people bring thoughtful questions, ideas, and perspective.