Craft CMS replaces ACF with approximately 20 native field types – including Matrix for repeater and flexible content layouts – replaces Yoast SEO with the SEOmatic plugin ($99), and replaces functions.php with a custom Yii2 module stored in your project’s modules/ directory. The key shift: things WordPress needs plugins for, Craft either ships natively or handles through an architectural pattern that lives in version control with your project. But the differences go deeper than swapping names. Craft’s equivalents change how you think about content modeling, SEO automation, and where custom code belongs.
Every WordPress developer migrating to a new CMS starts by mapping their existing toolkit. ACF, Yoast, and functions.php are the three pillars of a working WordPress site – custom content, SEO, and custom code. Until you know where those live in Craft, you cannot start building.
I have trained over 1,000 developers at CraftQuest, and this is consistently the first question. Not “how does Twig work?” or “what is a section?” – it is “where do my tools go?” The existing answers online are not great. The Craft CMS official knowledge base maps 15+ concepts but reads as a lookup table with no code examples and no mental model translation. Agency comparison pages say “Craft has native fields” but never show what that actually looks like in practice.
The scale of this question is enormous. WordPress powers approximately 43.4% of all websites (W3Techs, 2026), and ACF alone is active on over 2 million WordPress sites, making it one of the most-installed plugins in the ecosystem. Craft ships approximately 20 native field types versus WordPress’s single post content editor. That gap is where this whole conversation starts.
Craft CMS does not need an ACF equivalent because custom fields are built into the core. You define fields in the control panel under Settings > Fields and assign them to entry types, categories, users, or globals. No plugin required.
“Craft is purpose-built to be an advanced custom field CMS. It is not purpose-built to be some generic blogging tool that is trying to jam in advanced custom content management. So first of all, you can get rid of ACF. You do not need it. You have all of the content modeling via custom fields built right into Craft.”
– Ryan Irelan, CraftQuest
Craft ships with field types covering everything ACF provides: Plain Text, Rich Text (via CKEditor), Assets (for files and images), Entries (relational linking), Matrix (repeatable block structures), Categories, Tags, Dropdown, Checkboxes, Date/Time, Number, Table, Color, and more. If there is something you need that is not built in as a native Craft field, you can use a third-party plugin and add an additional field type for specific situations – maybe something that handles maps, or something that handles links in a way that you want, or something that handles SEO. But the core content modeling? That is all there out of the box.
Here is how the specific ACF field types map to Craft CMS:
| ACF Field Type | Craft CMS Equivalent |
|---|---|
| Text / Textarea | Plain Text field |
| Image / File | Assets field |
| Repeater | Matrix field (single block type) |
| Flexible Content | Matrix field (multiple block types) |
| Relationship / Post Object | Entries field |
| Gallery | Assets field (multi-select) |
| WYSIWYG | CKEditor field |
The Matrix-to-Flexible Content mapping is the one most sources get wrong. They compare Matrix to ACF Repeater, which is technically accurate but misses the more important comparison. Matrix with multiple block types is the real equivalent of Flexible Content – the feature WordPress developers pay for ACF Pro to get.
In templates, the code gets cleaner. Where WordPress gives you <?php the_field('hero_image'); ?> or the longer <?php echo get_field('hero_image')['url']; ?>, Craft gives you {{ entry.heroImage.one().url }}. Dot-notation access, no function calls. For repeaters and flexible content, WordPress’s have_rows() / the_sub_field() loop becomes:
{% for block in entry.contentBlocks.all() %}
{% if block.type.handle == 'textBlock' %}
{{ block.body }}
{% elseif block.type.handle == 'imageBlock' %}
{{ block.image.one().url }}
{% endif %}
{% endfor %}If you are migrating an existing site, Craft 5.5+ includes the wp-import tool, which supports over 30 ACF field types and maps them to native Craft fields automatically (GitHub). Most configurations transfer cleanly. Developer Jeff Bridgforth documented his migration and completed the content import in under an hour. One honest gap to know about: ACF’s conditional field logic – showing or hiding fields based on other field values – has no native Craft equivalent. This trips up every migrating developer I have talked to. Community plugins like Craft Conditional Fields exist, but the implementation is not as seamless as what ACF provides out of the box. Plan for this if your WordPress content model relies heavily on conditional field visibility.
The best SEO plugin out there for Craft is SEOmatic by nystudio107. It is a commercial plugin – $99 up front and then around $39 a year to renew to get all of the updates (Craft Plugin Store). Completely worth it considering the level of flexibility and customization that you get. It is one of the best-selling plugins in the Craft ecosystem, and it is what I tell people to go for.
SEOmatic auto-generates structured data and JSON-LD, XML sitemaps, social sharing meta tags, and canonical URLs. For credibility context: Moz.com – the SEO tool company – runs on Craft with SEOmatic, not WordPress with Yoast.
SEOmatic takes a different approach than Yoast. Where Yoast asks you to fill in meta fields on every post, SEOmatic pulls field data into meta tags automatically through its Content SEO settings. You configure the patterns once, and it generates correct metadata across your site without per-entry manual work. For developers, this is a better system. For content editors used to Yoast’s point-and-click workflow, it is a real adjustment.
Here is the honest UX gap: Yoast has a traffic-light system – green, yellow, red – that content editors understand immediately. SEOmatic has no equivalent. The configuration depth benefits developers but can overwhelm editors who are used to Yoast telling them exactly what to fix. There is no readability score, no “your focus keyphrase” prompt, no colored indicator saying your SEO is good or bad. For simpler needs, you do not necessarily need SEOmatic at all. You can handle basic meta titles and descriptions with native Craft fields and Twig templates – no plugin required. SEOmatic is for when you want automated structured data, comprehensive sitemap generation, and centralized SEO control across a large site.
Any customization that you would need to make in Craft falls into two buckets. First, a lot of what you would configure through code in WordPress gets stored in settings in Craft – and that gets saved out as project config files that live in version control with your project. Second, if you need to do custom things like what you would do in a functions.php, you would typically do that in a custom module in Craft CMS.
A custom module is a PHP class stored in your project’s modules/ directory and registered in config/app.php. Andrew Welch of nystudio107 describes modules as “plugins that can’t be uninstalled” – permanent, always-loaded project customization that is version-controlled with your codebase. You can have a single module in your project that houses all of your one-off customization code that you need.
This is architecturally cleaner than functions.php. Your custom code gets a proper namespace, autoloading, and a defined initialization lifecycle. No more dropping functions into a single file and hoping the load order works out.
Here is the mental model translation:
| WordPress | Craft CMS |
|---|---|
add_action() / add_filter() | Event::on() |
| functions.php runs on every page load | Module init() method runs on every request |
add_shortcode() | Twig extensions or custom variables via module |
| Template functions in functions.php | Twig variables/functions registered in a module |
The barrier to entry is real: creating a Craft module requires scaffolding a PHP class, setting up a namespace, and registering it in your config file. That is more setup than dropping code into functions.php. The official Craft module documentation walks through the process, and the nystudio107 module tutorial is the best community resource – though neither draws the WordPress parallel explicitly.
If you want to go deeper on this, I have an Extending Craft CMS course on CraftQuest that talks about how to create custom modules. It walks you through building a module from scratch so you have a place for all of that one-off customization code that would have gone in functions.php.
Here is the thing that ties all of this together. The mental shift you are going to need when coming from WordPress is knowing that Craft is purpose-built to handle complex content. You do not need to load it up with a bunch of plugins to get a content site up and running.
In WordPress, you install ACF to get custom fields. You install Yoast to get SEO. You pile functions into functions.php because there is nowhere else for them to go. That is the WordPress way, and it works – but it means your site’s core capabilities depend on a stack of third-party code.
Craft flips that. Custom fields are native. SEO can be handled in templates with no plugin at all, or with SEOmatic when you need the full toolset. Custom code goes in a properly structured module. The plugin count on a typical Craft site is a fraction of what you would see on a comparable WordPress build.
Start with The Craft Mindset on CraftQuest to rewire those WordPress mental models. Then move into the free Craft CMS Quick-Start Guide to start building. When you are ready to add custom code, the Extending Craft CMS course covers modules, plugins, and everything that replaces functions.php.
If you are evaluating: Install Craft CMS with the free Solo edition and create a few custom fields. You will see the ACF equivalent within five minutes of opening the control panel.
If you are migrating: Read our companion guide on migrating WordPress to Craft CMS for the step-by-step process, including using the wp-import tool.
If you want to go deep: CraftQuest’s Getting Started Quest covers content modeling, Twig templating, and building your first real Craft site. Start with The Craft Mindset, then move into the free Craft CMS Quick-Start Guide and Real-World Craft CMS for hands-on building.
Related: How long does it take to learn Craft CMS from WordPress?
Yes. Craft CMS ships with approximately 20 native field types including Matrix (equivalent to ACF Repeater and Flexible Content), relational Entries fields, Asset fields, and more. No plugin is needed for custom content modeling. As Ryan puts it, Craft is purpose-built to be an advanced custom field CMS – it is not a blogging tool trying to bolt on content management after the fact.
SEOmatic is more powerful but has a steeper learning curve. It automates structured data and meta tag generation from your content fields, which reduces per-post manual work. However, it lacks Yoast’s traffic-light scoring system, so content editors accustomed to Yoast’s editorial guidance will need training on the different workflow. At $99 with $39 annual renewals (Craft Plugin Store), it is worth the investment for the flexibility and customization you get.
Custom PHP code goes in a Yii2 module stored in your project’s modules/ directory and registered in config/app.php. This replaces WordPress’s functions.php with a properly namespaced, autoloaded PHP class. You can house all of your one-off customization code in a single module. Craft’s event system (Event::on()) replaces WordPress hooks and filters.
Yes. Craft 5.5+ includes the wp-import tool, which supports over 30 ACF field types and maps them to native Craft fields automatically (GitHub). Most ACF configurations transfer cleanly, though complex conditional logic setups may need manual adjustment since Craft has no native conditional field visibility feature.
Most core WordPress plugin categories have Craft equivalents: SEOmatic for Yoast, Formie for Gravity Forms, Craft Commerce for WooCommerce. The notable gaps are in niche plugins and ACF’s conditional field logic, which has no native Craft equivalent. Check the Craft plugin store before assuming a feature is missing. But remember – the mental shift with Craft is that you do not need to load it up with a bunch of plugins to get a content site up and running.