Courses 1 and 2 built real abilities around wp_insert_post(), wp_update_post(), and
plain post meta, and that’s genuinely the right foundation for most WordPress content.
But a large share of real-world WordPress sites don’t store their pages that way at all.
Elementor, Divi, WPBakery, and Beaver Builder each layer a proprietary visual layout
format on top of standard WordPress storage, and none of the core Abilities API’s
built-in knowledge extends into that layer. This lesson is the honest framing for the
rest of the course: what an ability can already see, what it can’t, and why nobody has
shipped an official plugin that closes this gap for you.
Courses 1 and 2 completed, with a working MCP server and at least one registered ability. A local WordPress install with one of the four page builders active is useful for the “test it” section, but not required to follow the lesson.
Step 1: What a core ability can see on a page-builder page
Open any post edited with Elementor, Divi, WPBakery, or Beaver Builder and look at it
through core WordPress’s eyes: get_post( $id )->post_content and get_post_meta( $id )
still return something. The problem is what that something actually is.
On an Elementor page, post_content is often close to empty or holds a rendered cache
fragment, the real content lives in a JSON blob in post meta (Lesson 2 covers the exact
structure). On a classic Divi or WPBakery page, post_content is full of text, but it’s
shortcode markup like [et_pb_section][et_pb_row]... or [vc_row][vc_column]..., not
the human-readable sentence a “change this heading” request refers to. On a Beaver
Builder page, the layout is a serialized PHP array in a meta key, unreadable as text at
all without unserializing it first.
An ability built to update post_content with a plain string will technically succeed
on any of these pages, WordPress will happily save whatever string you pass it. It just
won’t do what the user asked, because the actual heading the user means lives somewhere
that ability never looked.
Step 2: Why WordPress core doesn’t (and shouldn’t) know this
WordPress core has no concept of “Elementor’s widget settings” or “Divi’s module attributes” because those formats belong to third-party plugins, not core. Each builder is free to change its own internal structure between major versions, and several have: Elementor’s older section/column/widget tree and its newer flexbox container structure coexist depending on when a page was built, and Divi 5 is moving away from shortcodes entirely toward a JSON format (Lesson 3 covers both in detail). Baking any one builder’s format into WordPress core or the Abilities API would tie core to a moving target it doesn’t control and can’t guarantee stays stable.
There is no WordPress.org plugin, no Elementor add-on, and no part of the MCP Adapter that exposes “edit this Elementor widget” or “edit this Divi module” as a ready-made ability. Every ability in this course is a custom pattern built by hand, against each builder’s real, current stored data. If you find a plugin claiming to do this generically across builders, treat that claim with real skepticism, and verify its actual behavior against your own site’s stored data before trusting it with a live page.
Step 3: The shape of the pattern this course builds
The rest of this course follows one consistent shape, repeated for each builder:
That last two points aren’t optional extras bolted onto the end of the course, they’re the actual point. A structure-aware ability that edits Elementor JSON correctly is only half the job, the other half is making sure it’s structurally impossible for that ability to corrupt a live, published page without a human looking at the result first.
Test it: confirm the gap on your own site
If you have a page builder active locally, look at what a core ability would actually see versus what the builder stores:
# File: terminal
# What core WordPress thinks the content is
wp post get <post_id> --field=post_content
# What Elementor actually stores (if active)
wp post meta get <post_id> _elementor_data
# What Beaver Builder actually stores (if active)
wp post meta get <post_id> _fl_builder_data
Compare the two. On an Elementor or Beaver Builder page, post_content will usually
look thin or empty next to the real layout sitting in post meta. On a classic Divi or
WPBakery page, post_content will be full of shortcode text that no ability from
Courses 1 or 2 was ever written to parse.
An Elementor or Beaver Builder page with little or nothing in post_content is not
broken and is not missing content, the content just lives elsewhere. Don’t write an
ability that treats a thin post_content field as a signal to overwrite it, that’s the
single fastest way to accidentally wipe a page builder’s real layout while leaving its
JSON or serialized data (now orphaned and possibly still rendering from cache) behind.
Recap
Core abilities operate on post_content, post meta, and taxonomy data, the same shape
covered in Courses 1 and 2. That’s exactly what a standard WordPress post needs and
exactly what a page builder page doesn’t provide in a directly usable form, since the
builder’s real layout lives in a proprietary JSON tree, shortcode markup, or serialized
array instead. No official plugin bridges that gap, so the rest of this course builds
the bridge by hand, one builder at a time, wrapped in a duplicate-and-approve workflow
and an environment guardrail that keeps any of it away from a live production page
without explicit human review.
Resources & further reading
- Abilities API reference, developer.wordpress.org
- MCP Adapter repository, GitHub
- Elementor Developers: Data Structure, developers.elementor.com