elementor-dynamic-tag-register
Elementor: register a Dynamic Tag
For developers shipping a companion plugin that adds Dynamic Tags — "show this product's shipping class", "this user's last order total", "this course's progress %". The dynamic-tags infrastructure (base classes, the registration manager, the hooks, the category/group system) ships in free Elementor under Elementor\Core\DynamicTags\*; this skill is the stable extension contract for registering your own tags against it. It does not cover building the tag's controls/fallback (see elementor-dynamic-tag-fields) or AJAX pickers (see elementor-dynamic-tag-ajax-select).
The Pro-feature reality (read this first)
The user's instinct that "dynamic tags are a Pro feature" is half-right, and the distinction matters:
- The API is in free Elementor —
\Elementor\Core\DynamicTags\Tag,Data_Tag,Base_Tag, theManager, theelementor/dynamic_tags/registerhook, and the category constants all live in the free plugin. Your tag classes compile and register without Pro. - Free Elementor registers zero tags of its own —
Module::get_tag_classes_names()returns[](modules/dynamic-tags/module.php:116-118) and only one group, "Base Tags" (module.php:130-136). - Pro ships ~34 tags plus 8 groups, every one gated behind a license check —
API::is_licence_has_feature( 'dynamic-tags', … )(elementor-pro/modules/dynamic-tags/module.php:97). - The AJAX query control (
QueryControlModule::QUERY_CONTROL_ID) used to pick from large datasets is Pro-only. Without Pro you fall back to a manual field — seeelementor-dynamic-tag-ajax-select.
Practical rule: build for "Elementor active, Pro likely present", feature-detect Pro-only pieces, and degrade gracefully. The reference plugin does exactly this with a has_query_control_support() check before using the Pro autocomplete control.
Misconception this skill corrects
"I'll register my tag with
add_action( 'elementor/dynamic_tags/register_tags', … )and$manager->register_tag( MyTag::class )like the old tutorials show."