elementor
Skill4 starsChanged 5 months agoMITView on GitHub
Build and edit Elementor (Flexbox Container) pages on ANY self-hosted WordPress from the CLI — generate the page's _elementor_data JSON and inject it with WP-CLI instead of clicking through the visual editor. Host-agnostic core plus access adapters for generic SSH+WP-CLI, managed WordPress (Kinsta / WP Engine / Flywheel), and local dev (DDEV / LocalWP / wp-env). Covers calibration, global-kit binding, the popup/esc_url gotcha, Rank Math meta, and a safe staging-first workflow. Use for any WordPress + Elementor page-build task — build or edit a page, generate pages at scale, set up CLI access, or work with _elementor_data. Trigger words: Elementor, WordPress page build, _elementor_data, Elementor JSON, WP-CLI Elementor, generate Elementor pages.
We split this skill into the rules it gives an agent
5 rules. About 0 are common, 1 is distinctive, and 4 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈1
Distinctive · estimate
This author's own choices. Worth a look.
4
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 28
Not listed (e.g. Cloudways) — the core below still applies.
- Very specific: line 54
No shell access? Export from the Elementor editor (Save as Template → Templates → Export) and hand Claude the .json.
- Very specific: line 78
If Rank Math is active, set rank_math_title / rank_math_description / rank_math_focus_keyword / rank_math_robots (= array('noindex') on …
- Very specific: line 97
Check the frontend for: container count, kit CSS + page CSS loaded, images present, elementor-action count (popups), and 0 errors.
- Very specific: line 107
Unique element ids: every Elementor element needs a unique string id.
≈ “Common” is an estimate: at least 1 in 5 of the 308,232 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Elementor page builder — any host
Build and edit Elementor pages on self-hosted WordPress from the CLI by
generating the page's _elementor_data JSON and injecting it with WP-CLI —
instead of clicking through the visual editor. The build technique is identical on
every host; only how you get a shell + wp changes.
SETUP.md— first-time setup: how to export the site's design (calibration) so builds match it.reference.md— host-agnostic WP-CLI + verify cheat-sheet.inject.php— the injection template (wp eval-file).hosts/*.md— per-platform access adapters. Read the one that matches your host first.
0. Pick your host adapter
Everything below assumes you can run wp against the target site. Get there via the
matching adapter, then come back:
| Your setup | Adapter | How wp runs |
| VPS / DigitalOcean / self-managed Linux, you have SSH | hosts/generic-ssh.md | ssh host "cd WEBROOT && wp ..." |
| Kinsta, WP Engine, Flywheel (managed, SSH-gated) | hosts/managed-wp.md | SSH gateway → wp ... |
| Local: DDEV, LocalWP, wp-env, Studio | hosts/local.md | ddev wp ... / wp ... locally |
Not listed (e.g. Cloudways) — the core below still applies; you just need that platform's way to add an SSH key / open a shell and find the webroot.
The golden path (same on every host)
- Get CLI access — via your host adapter; confirm
wp core versionworks. - Calibrate — pull a real page's Elementor JSON to learn the site's exact structure, atoms, and global-kit IDs. Never invent Elementor setting keys.
- Build on STAGING as a draft/noindex page; clone real atoms and re-content them.
- Inject via
wp eval-file inject.php+wp elementor flush-css. - Verify server-side AND on the real frontend.
- Promote to live via export/import once approved.
1. Calibrate first (non-negotiable)
An Elementor page is a JSON tree stored in postmeta _elementor_data. Modern sites
use the Flexbox Container model (elType:"container" nesting); older sites use
section/column. Confirm which the target site uses before generating.
Get a real design sample — see SETUP.md for the full how-to (CLI and no-CLI
editor-export methods). The fast path if you have wp:
wp option get page_on_front # homepage post id (static front page)
wp option get elementor_active_kit # global kit post id
wp post list --post_type=page --fields=ID,post_title,post_status
wp post meta get <id> _elementor_data --format=json # pull a real page to cloneNo shell access? Export from the Elementor editor (Save as Template → Templates →
Export) and hand Claude the .json; the injectable array is under .content. (SETUP.md)
Extract real "atoms" (heading, button, image, icon-list, icon-box, carousel nodes)
plus the global-kit color/typography IDs. Build by CLONING these real nodes and
re-contenting them — this removes ~all setting-key guesswork. Bind colors/type to
the kit via settings.__globals__ (cloning atoms carries these for free); don't
hardcode hexes where the site uses globals.
2. Inject _elementor_data (see inject.php)
PID=$(wp post create --post_type=page --post_status=draft \
--post_title="T" --post_name="slug" --porcelain)
# push the JSON to a path wp can read, then:
wp eval-file inject.php $PID page.json \
"$(wp plugin get elementor --field=version)" elementor_header_footer
wp elementor flush-cssinject.php sets _elementor_data = wp_slash(wp_json_encode($data)), plus
_elementor_edit_mode=builder, _elementor_template_type=wp-page,
_elementor_version, and _wp_page_template:
elementor_header_footer— full width, keeps theme nav/footer (default)elementor_canvas— blank canvas If Rank Math is active, setrank_math_title/rank_math_description/rank_math_focus_keyword/rank_math_robots(=array('noindex')on staging). Yoast is the same idea with_yoast_wpseo_*keys.
Getting the JSON file to where wp can read it: the portable method that works
on every host (including SFTP-chrooted managed hosts) is to stream it over the shell:
ssh host "cat > ~/page.json" < local.json # no scp/SFTP dependencyLocally just write the file. See your host adapter for the writable path.
3. Verify before claiming done
# server-side render — expect 0 fatals (popup hrefs are stripped here; see gotchas)
wp eval "echo \Elementor\Plugin::\$instance->frontend->get_builder_content_for_display($PID);" \
| grep -ic "fatal error\|critical error"
# real frontend
curl -s URL | grep -c 'data-element_type="container"' # container countCheck the frontend for: container count, kit CSS + page CSS loaded, images present,
elementor-action count (popups), and 0 errors.
4. Gotchas learned the hard way (universal — apply on every host)
- Popup / "Book Now" buttons: a button URL of
#elementor-action:action=popup:open&settings=...is stripped byesc_urland renders no href. Use the site's real mechanism — often a Dynamic Content for Elementor popup tag insettings.__dynamic__.link. Inspect how the site's own buttons open popups and copy that verbatim. CLI render also strips popup hrefs, so verify popup buttons on the REAL frontend. - Unique element ids: every Elementor element needs a unique string
id; when generating many sections, prefix ids per-section. (Repeated numeric media/icon ids are fine — those are attachment ids, not element ids.) - Relative internal links (
/page/) so they work on staging and live. wpfatals onwp-salt.php? Some installsrequiresalts with a relative path, sowp --path=DIRfatals. Fix:cdinto the webroot first, then runwp.scp/SFTP to/tmpblocked? Common on chrooted managed hosts. Stream files over the shell instead (ssh host "cat > ~/file" < local).
5. Staging & safety
- Always build on staging as a draft/noindex page;
wp db exportfirst. Never edit live directly. Promote via export/import (or re-inject on live) once approved. - Each managed host has its own staging environment + push-to-live flow — see the host adapter.
- Scale builds by fanning out one agent per section (each clones atoms) → assemble → validate (jq: array of containers, unique element ids) → inject → verify.
Reference implementations
- lmoncany/elementor-claude-skill (WP-CLI injection technique)
- emersimeon/claude-elementor-kit (REST/MCP alternative; see docs/LESSONS.md)
- bvisible/elementor-mcp-api (REST+MCP plugin for interactive editing)
Other versions2 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 2
- Mumega-com/mcpwp-claude-plugin★ 4same name
- hungphamwp/claude-skills★ 1same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
Reviews can't be read right now.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

