PluginProbe
aBlocks – Gutenberg Blocks, User Dashboard Builder, Popup Builder, Form Builder & Animation Builder / 2.11.0
aBlocks – Gutenberg Blocks, User Dashboard Builder, Popup Builder, Form Builder & Animation Builder v2.11.0
2.13.0 2.13.1 2.12.0 2.11.1 2.11.0 2.10.0 2.9.0 2.7.4 2.7.5 2.7.6 2.7.7 2.8.0 2.8.1 2.9.1 trunk 1.0 1.0-beta1 1.0-beta2 1.0-beta3 1.0.1 1.0.2 1.0.3 1.1.0 1.1.1 1.1.2 All 80 releases
ablocks / includes / ajax / settings.php

settings.php in aBlocks – Gutenberg Blocks, User Dashboard Builder, Popup Builder, Form Builder & Animation Builder 2.11.0, at includes/ajax/settings.php

803 lines 31.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace ABlocks\Ajax;
4
5 if ( ! defined( 'ABSPATH' ) ) {
6 exit;
7 }
8
9 use ABlocks\Classes\AbstractAjaxHandler;
10 use ABlocks\Classes\Sanitizer;
11 use ABlocks\Helper;
12 use ABlocks\Admin\Settings\Base as BaseSettings;
13
14 class Settings extends AbstractAjaxHandler {
15 public function __construct() {
16 $this->actions = array(
17 'get_blocks_visibility' => array(
18 'callback' => array( $this, 'get_blocks_visibility' ),
19 'capability' => 'manage_options'
20 ),
21 'save_block_visibility' => array(
22 'callback' => array( $this, 'save_block_visibility' ),
23 'capability' => 'manage_options',
24 'fields' => array(
25 'block_name' => 'string',
26 'status' => 'boolean',
27 )
28 ),
29 'save_bulk_block_visibility' => array(
30 'callback' => array( $this, 'save_bulk_block_visibility' ),
31 'capability' => 'manage_options',
32 'fields' => array(
33 'blocks' => 'json',
34 )
35 ),
36 'get_settings' => array(
37 'callback' => array( $this, 'get_settings' ),
38 'capability' => 'manage_options',
39 ),
40 'save_settings' => array(
41 'callback' => array( $this, 'save_settings' ),
42 'capability' => 'manage_options',
43 'fields' => array(
44 'default_container_width' => 'integer',
45 'container_padding' => 'integer',
46 'container_element_gap' => 'integer',
47 'enabled_assets_file_generation' => 'boolean',
48 'enabled_block_copy_paste_style' => 'boolean',
49 'lock_global_typography' => 'boolean',
50 'lock_global_typography_strict' => 'boolean',
51 'lock_global_colors' => 'boolean',
52 'enabled_load_google_font_locally' => 'boolean',
53 'enabled_only_selected_fonts' => 'boolean',
54 'font_metric_fallback' => 'boolean',
55 'enabled_coming_soon_page' => 'boolean',
56 'coming_soon_page' => 'integer',
57 'enabled_maintenance_page' => 'boolean',
58 'maintenance_page' => 'integer',
59 'login_page' => 'integer',
60 'registration_page' => 'integer',
61 'forget_password_page' => 'integer',
62 'frontend_dashboard_page' => 'string',
63 'mailchimp_api_key' => 'string',
64 'drip_api_key' => 'string',
65 'getresponse_api_key' => 'string',
66 'convertkit_api_key' => 'string',
67 'mailerlite_api_key' => 'string',
68 // Performance Suite
69 'perf_lazy_images' => 'boolean',
70 'perf_lcp_eager_count' => 'integer',
71 'perf_image_dimensions' => 'boolean',
72 'perf_responsive_images' => 'boolean',
73 'perf_preload_lcp' => 'boolean',
74 'perf_touch_targets' => 'boolean',
75 'perf_inline_css' => 'boolean',
76 'perf_async_css' => 'boolean',
77 'perf_critical_css' => 'boolean',
78 'perf_defer_js' => 'boolean',
79 'perf_delay_js' => 'boolean',
80 'perf_delay_js_timeout' => 'integer',
81 'perf_disable_emojis' => 'boolean',
82 'perf_disable_embeds' => 'boolean',
83 'perf_disable_dashicons' => 'boolean',
84 'perf_disable_jquery_migrate' => 'boolean',
85 'perf_control_heartbeat' => 'boolean',
86 'perf_heartbeat_frequency' => 'integer',
87 // Performance Suite — full-page cache.
88 'perf_page_cache' => 'boolean',
89 'perf_page_cache_scope' => 'string',
90 'perf_page_cache_ttl' => 'integer',
91 'perf_page_cache_gzip' => 'boolean',
92 'perf_page_cache_prewarm' => 'boolean',
93 'perf_page_cache_mobile_variant' => 'boolean',
94 'perf_page_cache_crawler' => 'boolean',
95 'perf_page_cache_crawl_batch' => 'integer',
96 'perf_consolidate_css' => 'boolean',
97 'perf_consolidate_css_min' => 'integer',
98 'perf_fragment_cache' => 'boolean',
99 'perf_fragment_cache_ttl' => 'integer',
100 'perf_template_cache' => 'boolean',
101 'perf_template_cache_ttl' => 'integer',
102 'perf_image_optimize_on_upload' => 'boolean',
103 'perf_image_level' => 'string',
104 'perf_image_webp' => 'boolean',
105 'perf_image_quarantine_autodelete' => 'boolean',
106 'perf_image_quarantine_days' => 'integer',
107 'perf_image_require_filename' => 'boolean',
108 'perf_image_require_alt' => 'boolean',
109 // Marketing — query param passthrough
110 'param_passthrough_enabled' => 'boolean',
111 'param_passthrough_keys' => 'string',
112 'param_passthrough_match' => 'string',
113 'param_passthrough_class' => 'string',
114 'param_passthrough_keyword' => 'string',
115 'param_passthrough_persist' => 'boolean',
116 'param_passthrough_cookie_days' => 'integer',
117 // global color & typography
118 'global_color' => 'json',
119 'global_typography' => 'json',
120 'global_font_family_fallback' => 'string',
121 'global_body_text_color' => 'string',
122 'global_body_typography' => 'json',
123 'global_body_paragraph_space' => 'json',
124 'global_link_color' => 'string',
125 'global_link_hover_color' => 'string',
126 'global_link_typography' => 'json',
127 'global_link_hover_typography' => 'json',
128 'global_h1_color' => 'string',
129 'global_h1_typography' => 'json',
130 'global_h2_color' => 'string',
131 'global_h2_typography' => 'json',
132 'global_h3_color' => 'string',
133 'global_h3_typography' => 'json',
134 'global_h4_color' => 'string',
135 'global_h4_typography' => 'json',
136 'global_h5_color' => 'string',
137 'global_h5_typography' => 'json',
138 'global_h6_color' => 'string',
139 'global_h6_typography' => 'json',
140 )
141 ),
142 'fetch_posts' => array(
143 'callback' => array( $this, 'fetch_posts' ),
144 'capability' => 'manage_options',
145 'fields' => array(
146 'postId' => 'integer',
147 'postType' => 'string',
148 'keyword' => 'string',
149 )
150 ),
151 'get_fronted_dashboard_pages' => array(
152 'callback' => array( $this, 'get_fronted_dashboard_pages' ),
153 'capability' => 'manage_options',
154 ),
155 'create_fronted_dashboard_page' => array(
156 'callback' => array( $this, 'create_fronted_dashboard_page' ),
157 'capability' => 'manage_options',
158 'fields' => [
159 'label' => 'string',
160 'slug' => 'string',
161 'icon' => 'string',
162 'class_name' => 'string',
163 'priority' => 'integer',
164 'parent_id' => 'integer',
165 ]
166 ),
167 'create_fronted_dashboard_link' => array(
168 'callback' => array( $this, 'create_fronted_dashboard_link' ),
169 'capability' => 'manage_options',
170 'fields' => [
171 'label' => 'string',
172 'link' => 'string',
173 'icon' => 'string',
174 'class_name' => 'string',
175 'priority' => 'integer',
176 'parent_id' => 'string',
177 ]
178 ),
179 'edit_fronted_dashboard_link' => array(
180 'callback' => array( $this, 'edit_fronted_dashboard_link' ),
181 'capability' => 'manage_options',
182 'fields' => [
183 'label' => 'string',
184 'link' => 'string',
185 'icon' => 'string',
186 'class_name' => 'string',
187 'priority' => 'integer',
188 'page_id' => 'string',
189 ]
190 ),
191 'delete_fronted_dashboard_link' => array(
192 'callback' => array( $this, 'delete_fronted_dashboard_link' ),
193 'capability' => 'manage_options',
194 'fields' => array(
195 'page_id' => 'string',
196 )
197 ),
198 'edit_fronted_dashboard_page' => array(
199 'callback' => array( $this, 'edit_fronted_dashboard_page' ),
200 'capability' => 'manage_options',
201 'fields' => [
202 'label' => 'string',
203 'slug' => 'string',
204 'icon' => 'string',
205 'class_name' => 'string',
206 'priority' => 'integer',
207 'parent_id' => 'integer',
208 'page_id' => 'integer',
209 ]
210 ),
211 'move_fronted_dashboard_page' => array(
212 'callback' => array( $this, 'move_fronted_dashboard_page' ),
213 'capability' => 'manage_options',
214 'fields' => [
215 'reordered_items' => 'string',
216 ]
217 ),
218 'delete_fronted_dashboard_page' => array(
219 'callback' => array( $this, 'delete_fronted_dashboard_page' ),
220 'capability' => 'manage_options',
221 'fields' => array(
222 'slug' => 'string',
223 'page_id' => 'integer',
224 )
225 ),
226 );
227 }
228
229 public function get_blocks_visibility() {
230 global $ablocks_blocks;
231 wp_send_json_success( $ablocks_blocks );
232 }
233
234 public function save_block_visibility( $payload ) {
235 $block_name = $payload['block_name'];
236 $status = $payload['status'];
237
238 $json_payload = Sanitizer::sanitize_payload([
239 'required_plugin' => 'json',
240 ], $payload);
241
242 $required_plugin = $json_payload['required_plugin'];
243
244 if ( empty( $block_name ) ) {
245 wp_send_json_error( __( 'Block Name missing', 'ablocks' ) );
246 }
247
248 if ( $status && $required_plugin ) {
249 if ( $required_plugin && is_array( $required_plugin ) ) {
250 foreach ( $required_plugin as $plugin ) {
251 if ( ! Helper::is_plugin_active( sanitize_text_field( $plugin['plugin_dir_path'] ) ) ) {
252 $error_message = sprintf( '%s Plugin is required to activate %s block.', $plugin['plugin_name'], $block_name );
253 wp_send_json_error( $error_message );
254 }
255 }
256 }
257 }
258
259 // Saved Data
260 $saved_blocks = (array) json_decode( get_option( ABLOCKS_BLOCKS_VISIBILITY_SETTINGS_NAME ), true );
261 $saved_blocks[ $block_name ] = $status;
262 update_option( ABLOCKS_BLOCKS_VISIBILITY_SETTINGS_NAME, wp_json_encode( $saved_blocks ) );
263 // Fire Addon Action
264 if ( $status ) {
265 do_action( "ablocks/block/activated_{$block_name}", $status );
266 } else {
267 do_action( "ablocks/block/deactivated_{$block_name}", $status );
268 }
269 wp_send_json_success( $saved_blocks );
270 }
271 public function save_bulk_block_visibility( $payload ) {
272 $blocks = wp_list_pluck( \json_decode( $payload['blocks'], true ), 'status', 'block_name' );
273 $saved_blocks = (array) json_decode( get_option( ABLOCKS_BLOCKS_VISIBILITY_SETTINGS_NAME ), true );
274 $updated_settings = wp_parse_args( $blocks, $saved_blocks );
275 update_option( ABLOCKS_BLOCKS_VISIBILITY_SETTINGS_NAME, wp_json_encode( $updated_settings ) );
276 wp_send_json_success( $updated_settings );
277 }
278 public function get_settings() {
279 $settings = BaseSettings::get_saved_data();
280 wp_send_json_success( $settings );
281 }
282
283 public function save_settings( $payload ) {
284 // phpcs:ignore WordPress.Security.NonceVerification.Missing
285 do_action( 'ablocks/before_save_settings', $payload, 'base' );
286 $json_payload = Sanitizer::sanitize_payload([
287 'selected_fonts' => 'json',
288 'perf_page_cache_query_args' => 'json',
289 'perf_page_cache_exclusions' => 'json',
290 'global_color' => 'json',
291 'global_typography' => 'json',
292 'global_body_typography' => 'json',
293 'global_body_paragraph_space' => 'json',
294 'global_link_typography' => 'json',
295 'global_link_hover_typography' => 'json',
296 'global_h1_typography' => 'json',
297 'global_h2_typography' => 'json',
298 'global_h3_typography' => 'json',
299 'global_h4_typography' => 'json',
300 'global_h5_typography' => 'json',
301 'global_h6_typography' => 'json',
302 ], $_POST ); // phpcs:ignore WordPress.Security.NonceVerification.Missing
303
304 $default = BaseSettings::get_default_data();
305 $is_update = BaseSettings::save_settings( [
306 'default_container_width' => $payload['default_container_width'] ?? $default['default_container_width'],
307 'container_padding' => $payload['container_padding'] ?? $default['container_padding'],
308 'container_element_gap' => $payload['container_element_gap'] ?? $default['container_element_gap'],
309 'enabled_assets_file_generation' => $payload['enabled_assets_file_generation'] ?? $default['enabled_assets_file_generation'],
310 'enabled_block_copy_paste_style' => $payload['enabled_block_copy_paste_style'] ?? $default['enabled_block_copy_paste_style'],
311 'lock_global_typography' => $payload['lock_global_typography'] ?? $default['lock_global_typography'],
312 'lock_global_typography_strict' => $payload['lock_global_typography_strict'] ?? $default['lock_global_typography_strict'],
313 'lock_global_colors' => $payload['lock_global_colors'] ?? $default['lock_global_colors'],
314 'enabled_load_google_font_locally' => $payload['enabled_load_google_font_locally'] ?? $default['enabled_load_google_font_locally'],
315 'enabled_only_selected_fonts' => $payload['enabled_only_selected_fonts'] ?? $default['enabled_only_selected_fonts'],
316 'selected_fonts' => $json_payload['selected_fonts'] ?? $default['selected_fonts'],
317 'font_metric_fallback' => $payload['font_metric_fallback'] ?? $default['font_metric_fallback'],
318 // Performance Suite — platform optimizations.
319 'perf_disable_emojis' => $payload['perf_disable_emojis'] ?? $default['perf_disable_emojis'],
320 'perf_disable_embeds' => $payload['perf_disable_embeds'] ?? $default['perf_disable_embeds'],
321 'perf_disable_dashicons' => $payload['perf_disable_dashicons'] ?? $default['perf_disable_dashicons'],
322 'perf_disable_jquery_migrate' => $payload['perf_disable_jquery_migrate'] ?? $default['perf_disable_jquery_migrate'],
323 'perf_control_heartbeat' => $payload['perf_control_heartbeat'] ?? $default['perf_control_heartbeat'],
324 'perf_heartbeat_frequency' => $payload['perf_heartbeat_frequency'] ?? $default['perf_heartbeat_frequency'],
325 'perf_delay_js' => $payload['perf_delay_js'] ?? $default['perf_delay_js'],
326 'perf_delay_js_timeout' => $payload['perf_delay_js_timeout'] ?? $default['perf_delay_js_timeout'],
327 'perf_lazy_images' => $payload['perf_lazy_images'] ?? $default['perf_lazy_images'],
328 'perf_lcp_eager_count' => $payload['perf_lcp_eager_count'] ?? $default['perf_lcp_eager_count'],
329 'perf_image_dimensions' => $payload['perf_image_dimensions'] ?? $default['perf_image_dimensions'],
330 'perf_responsive_images' => $payload['perf_responsive_images'] ?? $default['perf_responsive_images'],
331 'perf_preload_lcp' => $payload['perf_preload_lcp'] ?? $default['perf_preload_lcp'],
332 'perf_touch_targets' => $payload['perf_touch_targets'] ?? $default['perf_touch_targets'],
333 'perf_inline_css' => $payload['perf_inline_css'] ?? $default['perf_inline_css'],
334 'perf_async_css' => $payload['perf_async_css'] ?? $default['perf_async_css'],
335 'perf_critical_css' => $payload['perf_critical_css'] ?? $default['perf_critical_css'],
336 'perf_defer_js' => $payload['perf_defer_js'] ?? $default['perf_defer_js'],
337 // Performance Suite — full-page cache.
338 'perf_page_cache' => $payload['perf_page_cache'] ?? $default['perf_page_cache'],
339 'perf_page_cache_scope' => $payload['perf_page_cache_scope'] ?? $default['perf_page_cache_scope'],
340 'perf_page_cache_ttl' => $payload['perf_page_cache_ttl'] ?? $default['perf_page_cache_ttl'],
341 'perf_page_cache_gzip' => $payload['perf_page_cache_gzip'] ?? $default['perf_page_cache_gzip'],
342 'perf_page_cache_prewarm' => $payload['perf_page_cache_prewarm'] ?? $default['perf_page_cache_prewarm'],
343 'perf_page_cache_mobile_variant' => $payload['perf_page_cache_mobile_variant'] ?? $default['perf_page_cache_mobile_variant'],
344 'perf_page_cache_crawler' => $payload['perf_page_cache_crawler'] ?? $default['perf_page_cache_crawler'],
345 'perf_page_cache_crawl_batch' => $payload['perf_page_cache_crawl_batch'] ?? $default['perf_page_cache_crawl_batch'],
346 'perf_page_cache_query_args' => $json_payload['perf_page_cache_query_args'] ?? $default['perf_page_cache_query_args'],
347 'perf_page_cache_exclusions' => $json_payload['perf_page_cache_exclusions'] ?? $default['perf_page_cache_exclusions'],
348 'perf_consolidate_css' => $payload['perf_consolidate_css'] ?? $default['perf_consolidate_css'],
349 'perf_consolidate_css_min' => $payload['perf_consolidate_css_min'] ?? $default['perf_consolidate_css_min'],
350 'perf_fragment_cache' => $payload['perf_fragment_cache'] ?? $default['perf_fragment_cache'],
351 'perf_fragment_cache_ttl' => $payload['perf_fragment_cache_ttl'] ?? $default['perf_fragment_cache_ttl'],
352 'perf_template_cache' => $payload['perf_template_cache'] ?? $default['perf_template_cache'],
353 'perf_template_cache_ttl' => $payload['perf_template_cache_ttl'] ?? $default['perf_template_cache_ttl'],
354 'perf_image_optimize_on_upload' => $payload['perf_image_optimize_on_upload'] ?? $default['perf_image_optimize_on_upload'],
355 'perf_image_level' => $payload['perf_image_level'] ?? $default['perf_image_level'],
356 'perf_image_webp' => $payload['perf_image_webp'] ?? $default['perf_image_webp'],
357 'perf_image_quarantine_autodelete' => $payload['perf_image_quarantine_autodelete'] ?? $default['perf_image_quarantine_autodelete'],
358 'perf_image_quarantine_days' => $payload['perf_image_quarantine_days'] ?? $default['perf_image_quarantine_days'],
359 'perf_image_require_filename' => $payload['perf_image_require_filename'] ?? $default['perf_image_require_filename'],
360 'perf_image_require_alt' => $payload['perf_image_require_alt'] ?? $default['perf_image_require_alt'],
361 // Marketing — query param passthrough
362 'param_passthrough_enabled' => $payload['param_passthrough_enabled'] ?? $default['param_passthrough_enabled'],
363 'param_passthrough_keys' => $payload['param_passthrough_keys'] ?? $default['param_passthrough_keys'],
364 'param_passthrough_match' => $payload['param_passthrough_match'] ?? $default['param_passthrough_match'],
365 'param_passthrough_class' => $payload['param_passthrough_class'] ?? $default['param_passthrough_class'],
366 'param_passthrough_keyword' => $payload['param_passthrough_keyword'] ?? $default['param_passthrough_keyword'],
367 'param_passthrough_persist' => $payload['param_passthrough_persist'] ?? $default['param_passthrough_persist'],
368 'param_passthrough_cookie_days' => $payload['param_passthrough_cookie_days'] ?? $default['param_passthrough_cookie_days'],
369 'enabled_coming_soon_page' => $payload['enabled_coming_soon_page'] ?? $default['enabled_coming_soon_page'],
370 'coming_soon_page' => $payload['coming_soon_page'] ?? $default['coming_soon_page'],
371 'enabled_maintenance_page' => $payload['enabled_maintenance_page'] ?? $default['enabled_maintenance_page'],
372 'maintenance_page' => $payload['maintenance_page'] ?? $default['maintenance_page'],
373 'frontend_dashboard_page' => $payload['frontend_dashboard_page'] ?? $default['frontend_dashboard_page'],
374 'login_page' => $payload['login_page'] ?? $default['login_page'],
375 'registration_page' => $payload['registration_page'] ?? $default['registration_page'],
376 'forget_password_page' => $payload['forget_password_page'] ?? $default['forget_password_page'],
377
378 'mailchimp_api_key' => $payload['mailchimp_api_key'] ?? '',
379 'drip_api_key' => $payload['drip_api_key'] ?? '',
380 'getresponse_api_key' => $payload['getresponse_api_key'] ?? '',
381 'convertkit_api_key' => $payload['convertkit_api_key'] ?? '',
382 'mailerlite_api_key' => $payload['mailerlite_api_key'] ?? '',
383 // Global Color & Typography
384 'global_color' => $json_payload['global_color'] ?? [],
385 'global_typography' => $json_payload['global_typography'] ?? [],
386 'global_font_family_fallback' => $payload['global_font_family_fallback'] ?? '',
387 'global_body_typography' => $json_payload['global_body_typography'] ?? [],
388 'global_body_paragraph_space' => $json_payload['global_body_paragraph_space'] ?? [],
389 'global_link_typography' => $json_payload['global_link_typography'] ?? [],
390 'global_link_hover_typography' => $json_payload['global_link_hover_typography'] ?? [],
391 'global_h1_typography' => $json_payload['global_h1_typography'] ?? [],
392 'global_h2_typography' => $json_payload['global_h2_typography'] ?? [],
393 'global_h3_typography' => $json_payload['global_h3_typography'] ?? [],
394 'global_h4_typography' => $json_payload['global_h4_typography'] ?? [],
395 'global_h5_typography' => $json_payload['global_h5_typography'] ?? [],
396 'global_h6_typography' => $json_payload['global_h6_typography'] ?? [],
397 'global_body_text_color' => $payload['global_body_text_color'] ?? '',
398 'global_link_color' => $payload['global_link_color'] ?? '',
399 'global_link_hover_color' => $payload['global_link_hover_color'] ?? '',
400 'global_h1_color' => $payload['global_h1_color'] ?? '',
401 'global_h2_color' => $payload['global_h2_color'] ?? '',
402 'global_h3_color' => $payload['global_h3_color'] ?? '',
403 'global_h4_color' => $payload['global_h4_color'] ?? '',
404 'global_h5_color' => $payload['global_h5_color'] ?? '',
405 'global_h6_color' => $payload['global_h6_color'] ?? '',
406 ]);
407 // phpcs:ignore WordPress.Security.NonceVerification.Missing
408 do_action( 'ablocks/after_save_settings', $is_update, 'base', $payload );
409 wp_send_json_success( $is_update );
410 }
411
412 public function fetch_posts( $payload ) {
413 $post_type = ( isset( $payload['postType'] ) ? $payload['postType'] : 'page' );
414 $postId = ( isset( $payload['postId'] ) ? $payload['postId'] : 0 );
415 $keyword = ( isset( $payload['keyword'] ) ? $payload['keyword'] : '' );
416
417 if ( $postId ) {
418 $args = array(
419 'post_type' => $post_type,
420 'p' => $postId,
421 );
422 } else {
423 $args = array(
424 'post_type' => $post_type,
425 'posts_per_page' => 10,
426 );
427 if ( ! empty( $keyword ) ) {
428 $args['s'] = $keyword;
429 }
430 if ( ! current_user_can( 'manage_options' ) ) {
431 $args['author'] = get_current_user_id();
432 }
433 }
434 $results = array();
435 $posts = get_posts( $args );
436 if ( is_array( $posts ) ) {
437 foreach ( $posts as $post ) {
438 $results[] = array(
439 'label' => $post->post_title,
440 'value' => $post->ID,
441 );
442 }
443 }
444 wp_send_json_success( $results );
445 }
446
447 public function get_fronted_dashboard_pages() {
448 $settings = json_decode( get_option( ABLOCKS_FRONTEND_DASHBOARD_SUB_PAGES_SETTINGS_NAME, '{}' ), true );
449 foreach ( $settings as &$item ) {
450 if ( isset( $item['parent_id'] ) ) {
451 $item['parent_id'] = 'null' === $item['parent_id'] ? null : $item['parent_id'];
452 }
453
454 $item['edit_link'] = (
455 'link' !== ( $item['type'] ?? '' ) &&
456 is_numeric( $item['page_id'] )
457 )
458 ? str_replace( '&amp;', '&', get_edit_post_link( $item['page_id'] ) )
459 : null;
460
461 if ( is_array( $item['children'] ?? null ) ) {
462 foreach ( $item['children'] as &$child_item ) {
463 if ( isset( $child_item['parent_id'] ) ) {
464 $child_item['parent_id'] = 'null' === $child_item['parent_id'] ? null : $child_item['parent_id'];
465
466 }
467
468 $child_item['edit_link'] = (
469 'link' !== ( $child_item['type'] ?? '' ) &&
470 is_numeric( $child_item['page_id'] )
471 )
472 ? str_replace( '&amp;', '&', get_edit_post_link( $child_item['page_id'] ) )
473 : null;
474 }
475 }
476 }//end foreach
477 wp_send_json_success( $settings );
478 }
479 public function create_fronted_dashboard_page( $payload ) {
480 global $wpdb;
481 // Step 1: Get Frontend Dashboard Page ID
482 $frontend_dashboard_id = (int) Helper::get_settings( 'frontend_dashboard_page' );
483 $settings = json_decode( get_option( ABLOCKS_FRONTEND_DASHBOARD_SUB_PAGES_SETTINGS_NAME, '{}' ), true );
484 $root_page_id = 0;
485 // Step 2: Check if "root" page exists under frontend dashboard
486 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
487 $root_page = $wpdb->get_row( $wpdb->prepare(
488 "SELECT ID, post_parent FROM $wpdb->posts WHERE post_parent=%d AND post_name = %s AND post_type = 'page'",
489 $frontend_dashboard_id,
490 'root'
491 ) );
492
493 $post_parent = ! empty( $payload['parent_id'] ) ? $payload['parent_id'] : $frontend_dashboard_id;
494
495 if ( ! $root_page || (int) $root_page->post_parent !== $frontend_dashboard_id ) {
496 // Step 3: Create "root" page as child of frontend dashboard page
497 $root_page_id = wp_insert_post( [
498 'post_title' => 'Root',
499 'post_name' => 'root',
500 'post_status' => 'publish',
501 'post_type' => 'page',
502 'post_content' => '',
503 'post_parent' => $frontend_dashboard_id,
504 ] );
505
506 $settings[] = [
507 'page_id' => $root_page_id,
508 'label' => 'Root',
509 'slug' => 'root',
510 'icon' => '',
511 'class_name' => '',
512 'priority' => 0,
513 ];
514 }
515
516 $insert_page_id = wp_insert_post( [
517 'post_title' => $payload['label'],
518 'post_name' => $payload['slug'],
519 'post_content' => '',
520 'post_status' => 'publish',
521 'post_type' => 'page',
522 'post_parent' => $post_parent,
523 ] );
524
525 if ( $insert_page_id ) {
526 $payload['page_id'] = $insert_page_id;
527
528 if ( ! empty( $payload['parent_id'] ) ) {
529 foreach ( $settings as &$setting ) {
530 if ( $setting['page_id'] === $post_parent ) {
531 if ( ! isset( $setting['children'] ) ) {
532 $setting['children'] = [];
533 }
534 $setting['children'][] = $payload;
535 }
536 }
537 unset( $setting ); // important to break reference
538 } else {
539 $settings[] = $payload;
540 }
541
542 update_option( ABLOCKS_FRONTEND_DASHBOARD_SUB_PAGES_SETTINGS_NAME, wp_json_encode( $settings ) );
543 flush_rewrite_rules();
544 }
545
546 wp_send_json_success( get_post( $insert_page_id ) );
547 }
548
549 public function create_fronted_dashboard_link( array $payload ) : void {
550 global $wpdb;
551
552 if ( empty( $payload['link'] ) || empty( $payload['label'] ) ) {
553 wp_send_json_error( __( 'Link/Label is required.', 'ablocks' ) );
554 }
555
556 $settings = json_decode(
557 get_option( ABLOCKS_FRONTEND_DASHBOARD_SUB_PAGES_SETTINGS_NAME, '{}' ),
558 true
559 );
560
561 $payload['type'] = 'link';
562 $parent_id = $payload['parent_id'] = $payload['parent_id'] ?? 0;
563 $payload['page_id'] = 'link_' . time();
564 // print_r($payload);
565 // var_dump(( $parent_id ));
566 if ( empty( $parent_id ) || 'null' === $parent_id ) {
567 $settings[] = $payload;
568 } elseif ( ! is_null(
569 $index = array_search(
570 $parent_id,
571 array_column( $settings, 'page_id' )
572 )
573 )
574 ) {
575 $settings[ $index ]['children'][] = $payload;
576 } else {
577 wp_send_json_error( __( 'Invalid parent id.', 'ablocks' ) );
578 }
579
580 update_option(
581 ABLOCKS_FRONTEND_DASHBOARD_SUB_PAGES_SETTINGS_NAME,
582 wp_json_encode( array_values( $settings ) )
583 );
584
585 wp_send_json_success( $payload );
586 }
587
588 public function edit_fronted_dashboard_link( array $payload ) : void {
589 global $wpdb;
590
591 if ( empty( $payload['page_id'] ) ||
592 empty( $payload['link'] ) ||
593 empty( $payload['label'] )
594 ) {
595 wp_send_json_error( __( 'Link/Label/ID is required.', 'ablocks' ) );
596 }
597
598 $settings = json_decode(
599 get_option( ABLOCKS_FRONTEND_DASHBOARD_SUB_PAGES_SETTINGS_NAME, '{}' ),
600 true
601 );
602
603 $page_id = $payload['page_id'] = $payload['page_id'] ?? 0;
604
605 foreach ( $settings as &$items ) {
606 // echo $items['page_id'],"\n";
607 // var_dump($page_id , $items['page_id']);
608 if ( $page_id === $items['page_id'] ) {
609 $items['label'] = $payload['label'] ?: $items['label'];
610 $items['link'] = $payload['link'] ?: $items['link'];
611 $items['class_name'] = $payload['class_name'] ?: $items['class_name'];
612 $items['icon'] = $payload['icon'] ?: $items['icon'];
613 break;
614 } elseif ( ! empty( $items['children'] ) ) {
615 foreach ( $items['children'] as &$c_items ) {
616 if ( $page_id === $c_items['page_id'] ) {
617 $c_items['label'] = $payload['label'] ?: $c_items['label'];
618 $c_items['link'] = $payload['link'] ?: $c_items['link'];
619 $c_items['class_name'] = $payload['class_name'] ?: $c_items['class_name'];
620 $c_items['icon'] = $payload['icon'] ?: $c_items['icon'];
621 break 2;
622 }
623 }
624 }
625 }//end foreach
626
627 update_option(
628 ABLOCKS_FRONTEND_DASHBOARD_SUB_PAGES_SETTINGS_NAME,
629 wp_json_encode( array_values( $settings ) )
630 );
631
632 wp_send_json_success( $payload );
633 }
634
635 public function delete_fronted_dashboard_link( array $payload ) : void {
636 global $wpdb;
637 // print_r($payload);
638 if ( empty( $payload['page_id'] )
639 ) {
640 wp_send_json_error( __( 'ID is required.', 'ablocks' ) );
641 }
642
643 $settings = json_decode(
644 get_option( ABLOCKS_FRONTEND_DASHBOARD_SUB_PAGES_SETTINGS_NAME, '{}' ),
645 true
646 );
647
648 $page_id = $payload['page_id'] = $payload['page_id'] ?? 0;
649
650 foreach ( $settings as &$items ) {
651 // echo $items['page_id'],"\n";
652 // var_dump($page_id , $items['page_id']);
653 if ( $page_id === $items['page_id'] ) {
654 $items = null;
655 break;
656 } elseif ( ! empty( $items['children'] ) ) {
657 foreach ( $items['children'] as &$c_items ) {
658 if ( $page_id === $c_items['page_id'] ) {
659 $c_items = null;
660 $items['children'] = array_filter( $items['children'] );
661 break 2;
662 }
663 }
664 }
665 }
666
667 update_option(
668 ABLOCKS_FRONTEND_DASHBOARD_SUB_PAGES_SETTINGS_NAME,
669 wp_json_encode( array_filter( $settings ) )
670 );
671
672 wp_send_json_success( $payload );
673 }
674
675 public function edit_fronted_dashboard_page( $payload ) {
676 if ( empty( $payload['page_id'] ) ) {
677 wp_send_json_error( 'Page ID is required for updating.' );
678 }
679
680 wp_update_post( [
681 'ID' => $payload['page_id'],
682 'post_title' => $payload['label'],
683 'post_slug' => $payload['slug'],
684 'priority' => $payload['priority'],
685 'post_parent' => ! empty( $payload['parent_id'] ) ? (int) $payload['parent_id'] : 0,
686 ], true );
687
688 $settings = json_decode( get_option( ABLOCKS_FRONTEND_DASHBOARD_SUB_PAGES_SETTINGS_NAME, '{}' ), true );
689
690 $update_settings_recursive = null; // initialize first
691 $update_settings_recursive = function ( &$settings ) use ( &$update_settings_recursive, $payload ) {
692 foreach ( $settings as &$setting ) {
693 if ( $setting['page_id'] === $payload['page_id'] ) {
694 $setting['label'] = $payload['label'] ?? $setting['label'];
695 $setting['slug'] = $payload['slug'] ?? $setting['slug'];
696 $setting['icon'] = $payload['icon'] ?? $setting['icon'];
697 $setting['class_name'] = $payload['class_name'] ?? $setting['class_name'];
698 $setting['priority'] = $payload['priority'] ?? ( $setting['priority'] ?? 0 );
699 if ( isset( $payload['slug'] ) ||
700 isset( $payload['label'] )
701 ) {
702 wp_update_post( [
703 'ID' => $payload['page_id'],
704 'post_title' => $payload['label'] ?? $setting['label'],
705 'post_name' => $payload['slug'] ?? $setting['slug'],
706 ] );
707 }
708 if ( isset( $payload['children'] ) ) {
709 $setting['children'] = $payload['children'];
710 }
711 return true;
712 }//end if
713
714 if ( ! empty( $setting['children'] ) ) {
715 if ( $update_settings_recursive( $setting['children'] ) ) {
716 return true;
717 }
718 }
719 }//end foreach
720 return false;
721 };
722
723 $update_settings_recursive( $settings );
724 update_option( ABLOCKS_FRONTEND_DASHBOARD_SUB_PAGES_SETTINGS_NAME, wp_json_encode( $settings ) );
725
726 flush_rewrite_rules();
727 // Step 4: Return updated page
728 wp_send_json_success( get_post( $payload['page_id'] ) );
729 }
730
731 public function delete_fronted_dashboard_page( $payload ) {
732 // Load existing frontend dashboard sub-pages settings
733 $settings = json_decode( get_option( ABLOCKS_FRONTEND_DASHBOARD_SUB_PAGES_SETTINGS_NAME, '{}' ), true );
734 if ( ! is_array( $settings ) ) {
735 $settings = [];
736 }
737
738 $remove_id = $payload['page_id'] ?? null;
739 $remove_slug = $payload['slug'] ?? null;
740
741 if ( ! $remove_id && ! $remove_slug ) {
742 wp_send_json_error( 'Page ID or slug is required to delete.' );
743 }
744
745 // Step 1: Delete the post if ID is provided
746 if ( $remove_id ) {
747 wp_delete_post( (int) $remove_id, true );
748 } elseif ( $remove_slug ) {
749 // If only slug is provided, try to find the page
750 $page = get_page_by_path( $remove_slug, OBJECT, 'page' );
751 if ( $page ) {
752 $remove_id = $page->ID;
753 wp_delete_post( $remove_id, true );
754 }
755 }
756
757 // Step 2: Recursively remove from settings
758 $remove_from_settings = function ( &$settings ) use ( &$remove_from_settings, $remove_id, $remove_slug ) {
759 $settings = array_values(array_filter($settings, function ( $item ) use ( $remove_id, $remove_slug ) {
760 $match_id = isset( $item['page_id'] ) && $remove_id && $item['page_id'] == $remove_id;
761 $match_slug = isset( $item['slug'] ) && $remove_slug && $item['slug'] == $remove_slug;
762 return ! $match_id && ! $match_slug;
763 }));
764
765 // Recurse into children
766 foreach ( $settings as &$item ) {
767 if ( ! empty( $item['children'] ) ) {
768 $remove_from_settings( $item['children'] );
769 }
770 }
771 unset( $item );
772 };
773
774 $remove_from_settings( $settings );
775
776 // Step 3: Save updated settings
777 update_option( ABLOCKS_FRONTEND_DASHBOARD_SUB_PAGES_SETTINGS_NAME, wp_json_encode( $settings ) );
778
779 wp_send_json_success( $remove_id ?? $remove_slug );
780 }
781
782 public function move_fronted_dashboard_page( array $payload ) : void {
783 $reordered_settings = json_decode( $payload['reordered_items'] ?? '{}', true );
784 $settings = json_decode(
785 get_option(
786 ABLOCKS_FRONTEND_DASHBOARD_SUB_PAGES_SETTINGS_NAME, '{}'
787 ),
788 true
789 );
790
791 if ( is_array( $reordered_settings ) &&
792 count( $reordered_settings ) === count( $settings )
793 ) {
794 update_option(
795 ABLOCKS_FRONTEND_DASHBOARD_SUB_PAGES_SETTINGS_NAME,
796 $payload['reordered_items'] ?? '{}'
797 );
798 wp_send_json_success( __( 'Success!', 'ablocks' ) );
799 }
800 wp_send_json_error( __( 'Invalid data', 'ablocks' ), 400 );
801 }
802 }
803