PluginProbe
aBlocks – Gutenberg Blocks, User Dashboard Builder, Popup Builder, Form Builder & Animation Builder / 2.10.0
aBlocks – Gutenberg Blocks, User Dashboard Builder, Popup Builder, Form Builder & Animation Builder v2.10.0
2.14.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 All 81 releases
ablocks / includes / ajax / settings.php

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

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