PluginProbe
WDesignKit – AI Templates, Widget Builder & MCP Workflow / trunk
WDesignKit – AI Templates, Widget Builder & MCP Workflow vtrunk
2.6.6 2.6.5 2.6.4 2.6.3 2.6.2 2.6.1 2.6.0 2.5.5 2.5.4 2.5.3 2.5.2 2.5.1 2.5.0 2.4.0 2.3.3 2.3.2 2.3.1 1.0.10 1.0.11 1.0.12 1.0.13 1.0.14 1.0.15 1.0.16 1.0.17 All 128 releases
wdesignkit / includes / abilities / settings / wdesignkit-settings.php

wdesignkit-settings.php in WDesignKit – AI Templates, Widget Builder & MCP Workflow trunk, at includes/abilities/settings/wdesignkit-settings.php

342 lines 13.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Abilities: Get and update WDesignKit plugin settings.
4 */
5
6 declare(strict_types=1);
7
8 if (!defined('ABSPATH')) {
9 exit();
10 }
11
12 wp_register_ability('wdesignkit/get-settings', [
13 'label' => __('Get WDesignKit Settings', 'wdesignkit'),
14 'description' => __(
15 'Gets all WDesignKit plugin settings including builder toggles (Elementor, Gutenberg, Bricks), template visibility, code snippet toggle, and debug mode.',
16 'wdesignkit',
17 ),
18 'category' => 'wdesignkit',
19 'input_schema' => [
20 'type' => 'object',
21 ],
22 'output_schema' => [
23 'type' => 'object',
24 'properties' => [
25 'success' => ['type' => 'boolean'],
26 'settings' => ['type' => 'object'],
27 'available_builders' => ['type' => 'array', 'items' => ['type' => 'string']],
28 'available_templates' => ['type' => 'array', 'items' => ['type' => 'string']],
29 'plugin_version' => ['type' => 'string'],
30 ],
31 ],
32 'execute_callback' => 'wdesignkit_mcp_get_settings',
33 'permission_callback' => 'wdesignkit_mcp_permission_callback',
34 'meta' => [
35 'public' => true,
36 'show_in_rest' => true,
37 'mcp' => ['public' => true],
38 'annotations' => [
39 'instructions' => implode("\n", [
40 'Gets all WDesignKit plugin settings.',
41 'Settings include:',
42 '- builder: Master toggle for widget builder feature',
43 '- template: Master toggle for template library',
44 '- elementor_builder: Enable Elementor widget builder',
45 '- gutenberg_builder: Enable Gutenberg block builder',
46 '- gutenberg_core_builder: Enable native WordPress block builder',
47 '- bricks_builder: Enable Bricks widget builder',
48 '- elementor_template: Show Elementor templates in library',
49 '- gutenberg_template: Show Gutenberg templates in library',
50 '- code_snippet: Enable code snippet feature',
51 '- debugger_mode: Enable debug mode',
52 'available_builders: derived array of builder slugs whose builder toggle is enabled.',
53 'available_templates: derived array of builder slugs whose template toggle is enabled (mirrors available_builders pattern).',
54 ]),
55 'readonly' => true,
56 'destructive' => false,
57 'idempotent' => true,
58 ],
59 ],
60 ]);
61
62 wp_register_ability('wdesignkit/update-settings', [
63 'label' => __('Update WDesignKit Settings', 'wdesignkit'),
64 'description' => __(
65 'Updates WDesignKit plugin settings. You can toggle individual features like Elementor builder, Gutenberg builder, template library, code snippets, and debug mode.',
66 'wdesignkit',
67 ),
68 'category' => 'wdesignkit',
69 'input_schema' => [
70 'type' => 'object',
71 'properties' => [
72 'builder' => [
73 'type' => 'boolean',
74 'description' => 'Master toggle for widget builder feature.',
75 ],
76 'template' => [
77 'type' => 'boolean',
78 'description' => 'Master toggle for template library.',
79 ],
80 'elementor_builder' => [
81 'type' => 'boolean',
82 'description' => 'Enable/disable Elementor widget builder.',
83 ],
84 'gutenberg_builder' => [
85 'type' => 'boolean',
86 'description' => 'Enable/disable Gutenberg block builder.',
87 ],
88 'gutenberg_core_builder' => [
89 'type' => 'boolean',
90 'description' => 'Enable/disable native WordPress core block builder.',
91 ],
92 'bricks_builder' => [
93 'type' => 'boolean',
94 'description' => 'Enable/disable Bricks widget builder.',
95 ],
96 'elementor_template' => [
97 'type' => 'boolean',
98 'description' => 'Show/hide Elementor templates in library.',
99 ],
100 'gutenberg_template' => [
101 'type' => 'boolean',
102 'description' => 'Show/hide Gutenberg templates in library.',
103 ],
104 'code_snippet' => [
105 'type' => 'boolean',
106 'description' => 'Enable/disable code snippet feature.',
107 ],
108 'debugger_mode' => [
109 'type' => 'boolean',
110 'description' => 'Enable/disable debug mode.',
111 ],
112 ],
113 'additionalProperties' => false,
114 ],
115 'output_schema' => [
116 'type' => 'object',
117 'properties' => [
118 'success' => ['type' => 'boolean'],
119 'message' => ['type' => 'string'],
120 'settings_changed' => ['type' => 'array', 'items' => ['type' => 'string']],
121 'settings' => ['type' => 'object'],
122 'available_builders' => ['type' => 'array', 'items' => ['type' => 'string']],
123 'available_templates' => ['type' => 'array', 'items' => ['type' => 'string']],
124 'plugin_version' => ['type' => 'string'],
125 ],
126 ],
127 'execute_callback' => 'wdesignkit_mcp_update_settings',
128 'permission_callback' => 'wdesignkit_mcp_permission_callback',
129 'meta' => [
130 'public' => true,
131 'show_in_rest' => true,
132 'mcp' => ['public' => true],
133 'annotations' => [
134 'instructions' => implode("\n", [
135 'Updates WDesignKit plugin settings.',
136 'Only provide the settings you want to change — unrecognised keys are ignored.',
137 'Returns the same shape as get-settings (settings, available_builders, available_templates, plugin_version) so no follow-up call is needed.',
138 'settings_changed lists only the keys whose value actually differed from the stored value.',
139 'If all submitted values equal existing values, message is "No changes detected" and the DB is not written.',
140 'To enable Elementor widget building: set elementor_builder to true.',
141 'To enable Gutenberg blocks: set gutenberg_builder to true.',
142 ]),
143 'readonly' => false,
144 'destructive' => false,
145 'idempotent' => true,
146 ],
147 ],
148 ]);
149
150 function wdesignkit_mcp_get_settings(array $input): array {
151 $settings = get_option('wkit_settings_panel', []);
152
153 $defaults = [
154 'builder' => true,
155 'template' => true,
156 'gutenberg_builder' => true,
157 'gutenberg_core_builder' => false,
158 'elementor_builder' => true,
159 'bricks_builder' => true,
160 'gutenberg_template' => true,
161 'elementor_template' => true,
162 'code_snippet' => true,
163 ];
164
165 $result = [];
166 foreach ($defaults as $key => $default) {
167 $result[$key] = isset($settings[$key]) ? (bool) $settings[$key] : $default;
168 }
169
170 // Include optional settings if present
171 if (isset($settings['remove_db'])) {
172 $result['remove_db'] = (bool) $settings['remove_db'];
173 }
174 if (isset($settings['debugger_mode'])) {
175 $result['debugger_mode'] = (bool) $settings['debugger_mode'];
176 }
177
178 // Derive available_builders from enabled settings flags so the two are never contradictory.
179 // When the master 'builder' toggle is OFF the whole builder feature is disabled, so no
180 // individual builder should appear as available regardless of its own toggle state.
181 $builder_setting_map = [
182 'elementor' => 'elementor_builder',
183 'gutenberg' => 'gutenberg_builder',
184 'gutenberg_core' => 'gutenberg_core_builder',
185 'bricks' => 'bricks_builder',
186 ];
187 $available_builders = [];
188 if (!empty($result['builder'])) {
189 foreach ($builder_setting_map as $builder => $setting_key) {
190 if (!empty($result[$setting_key])) {
191 $available_builders[] = $builder;
192 }
193 }
194 }
195
196 // Derive available_templates from enabled template settings — mirrors available_builders pattern.
197 // When the master 'template' toggle is OFF no template builder should appear as available.
198 $template_setting_map = [
199 'elementor' => 'elementor_template',
200 'gutenberg' => 'gutenberg_template',
201 ];
202 $available_templates = [];
203 if (!empty($result['template'])) {
204 foreach ($template_setting_map as $builder => $setting_key) {
205 if (!empty($result[$setting_key])) {
206 $available_templates[] = $builder;
207 }
208 }
209 }
210
211 return [
212 'success' => true,
213 'settings' => $result,
214 'available_builders' => $available_builders,
215 'available_templates' => $available_templates,
216 'plugin_version' => defined('WDKIT_VERSION') ? WDKIT_VERSION : 'unknown',
217 ];
218 }
219
220 function wdesignkit_mcp_update_settings(array $input): array {
221 $current = get_option('wkit_settings_panel', []);
222 if (!is_array($current)) {
223 $current = [];
224 }
225
226 $allowed_keys = [
227 'builder', 'template',
228 'elementor_builder', 'gutenberg_builder', 'gutenberg_core_builder', 'bricks_builder',
229 'elementor_template', 'gutenberg_template',
230 'code_snippet', 'debugger_mode',
231 ];
232
233 // Defaults mirror get-settings so per-field comparisons use the same effective baseline.
234 $defaults = [
235 'builder' => true,
236 'template' => true,
237 'gutenberg_builder' => true,
238 'gutenberg_core_builder' => false,
239 'elementor_builder' => true,
240 'bricks_builder' => true,
241 'gutenberg_template' => true,
242 'elementor_template' => true,
243 'code_snippet' => true,
244 'debugger_mode' => false,
245 ];
246
247 $submitted = []; // Recognised keys present in input
248 $actually_changed = []; // Keys whose effective value actually differed
249
250 foreach ($allowed_keys as $key) {
251 if (!isset($input[$key])) {
252 continue;
253 }
254 $submitted[] = $key;
255 $new_value = (bool) $input[$key];
256 $existing_value = isset($current[$key]) ? (bool) $current[$key] : ($defaults[$key] ?? false);
257 if ($new_value !== $existing_value) {
258 $current[$key] = $new_value;
259 $actually_changed[] = $key;
260 }
261 }
262
263 // Only write to the DB when something actually changed.
264 if (!empty($actually_changed)) {
265 update_option('wkit_settings_panel', $current);
266 }
267
268 if (empty($submitted)) {
269 $message = 'No settings provided to update.';
270 } elseif (empty($actually_changed)) {
271 $message = 'No changes detected. All submitted values are identical to the existing settings.';
272 } else {
273 $message = 'Settings updated: ' . implode(', ', $actually_changed);
274 }
275
276 // --- Build normalised response — identical shape to get-settings ---
277 // Always cast to bool so raw DB values (e.g. nested objects like {remove_entries:"on"})
278 // never bleed through into the response.
279 $response_defaults = [
280 'builder' => true,
281 'template' => true,
282 'gutenberg_builder' => true,
283 'gutenberg_core_builder' => false,
284 'elementor_builder' => true,
285 'bricks_builder' => true,
286 'gutenberg_template' => true,
287 'elementor_template' => true,
288 'code_snippet' => true,
289 ];
290 $normalized = [];
291 foreach ($response_defaults as $key => $default) {
292 $normalized[$key] = isset($current[$key]) ? (bool) $current[$key] : $default;
293 }
294 // Optional settings — normalised to bool regardless of raw DB representation
295 if (isset($current['remove_db'])) {
296 $normalized['remove_db'] = (bool) $current['remove_db'];
297 }
298 if (isset($current['debugger_mode'])) {
299 $normalized['debugger_mode'] = (bool) $current['debugger_mode'];
300 }
301
302 // Derive available_builders — gate on master 'builder' toggle (mirrors get-settings logic).
303 $builder_setting_map = [
304 'elementor' => 'elementor_builder',
305 'gutenberg' => 'gutenberg_builder',
306 'gutenberg_core' => 'gutenberg_core_builder',
307 'bricks' => 'bricks_builder',
308 ];
309 $available_builders = [];
310 if (!empty($normalized['builder'])) {
311 foreach ($builder_setting_map as $builder => $setting_key) {
312 if (!empty($normalized[$setting_key])) {
313 $available_builders[] = $builder;
314 }
315 }
316 }
317
318 // Derive available_templates — gate on master 'template' toggle (mirrors get-settings logic).
319 $template_setting_map = [
320 'elementor' => 'elementor_template',
321 'gutenberg' => 'gutenberg_template',
322 ];
323 $available_templates = [];
324 if (!empty($normalized['template'])) {
325 foreach ($template_setting_map as $builder => $setting_key) {
326 if (!empty($normalized[$setting_key])) {
327 $available_templates[] = $builder;
328 }
329 }
330 }
331
332 return [
333 'success' => true,
334 'message' => $message,
335 'settings_changed' => $actually_changed,
336 'settings' => $normalized,
337 'available_builders' => $available_builders,
338 'available_templates' => $available_templates,
339 'plugin_version' => defined('WDKIT_VERSION') ? WDKIT_VERSION : 'unknown',
340 ];
341 }
342