wp_widget_controls
The REAL Elementor setting keys for a widget, read from Elementor's own registry ON THAT SITE — so it is correct for that Elementor version, that Pro licence, and any third-party addons installed. Call with NO widget_type to list every widget the site actually has. USE THIS for anything wp_widget_schema doesn't cover: the dynamic/Theme-Builder widgets (posts, archive-posts, loop-grid, theme-post-title, theme-post-featured-image, nav-menu, search-form…), Woo widgets, and addon widgets. wp_widget_schema is our curated shorthand for ~20 common static widgets; this is the ground truth for everything else. tab=content|style|advanced narrows a large widget. Requires connector 0.7.9+. CONTEXT: the default mode is a compact INDEX (names, types, section grouping) with responsive twins collapsed — a control marked responsive also accepts the same name with _tablet / _mobile appended. Ask for full definitions only for the keys you actually need, via names=. Responses carry total/count/truncated, so a short list is never a complete one by accident. If you just want the right key for one change, assist_widget_keys answers that directly and never puts the registry in your context at all. For Editor V4 atomic elements (e-tabs, e-heading, …) it returns the V4 props model instead, since atomic elements have no controls registry.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| tab | No | content | style | advanced — narrows a large widget | |
| mode | No | index (default: names/types/grouping, smallest) | full (every control, paged). Ignored when names= is set. | |
| limit | No | Page size for mode=full (default 300, max 1000). | |
| names | No | Comma-separated control names to expand fully (defaults, options, condition, selectors). The cheap way to get detail. | |
| offset | No | Paging offset for mode=full; follow next_step when truncated is true. | |
| node_id | No | With post_id: an element id from wp_get_page. Returns only THAT widget's controls. | |
| post_id | No | With node_id: the page the element is on. The element's widget type is resolved server-side (response.resolved_from), so you never dump the whole registry to learn one widget's keys. | |
| site_id | Yes | WordPress site id | |
| widget_type | No | e.g. 'posts', 'loop-grid', 'theme-post-title'. Omit to list all widgets on the site — or pass post_id + node_id instead and the type is resolved from the element. |