'POST', 'callback' => [__CLASS__, 'save_settings'], 'permission_callback' => function () { return current_user_can('manage_options'); } ]); register_rest_route('plac/v1', '/extra', [ 'methods' => 'GET', 'callback' => [__CLASS__, 'get_extra_settings'], 'permission_callback' => function () { return current_user_can('manage_options'); } ]); register_rest_route('plac/v1', '/extra', [ 'methods' => 'POST', 'callback' => [__CLASS__, 'save_extra_settings'], 'permission_callback' => function () { return current_user_can('manage_options'); } ]); } public static function save_settings(WP_REST_Request $request) { $settings = $request->get_params(); // Check nonce for security $nonce = $request->get_param('_wpnonce'); if (!$nonce || !wp_verify_nonce($nonce, 'pl_access_control_wp_rest')) { return new WP_REST_Response([ 'message' => 'Invalid nonce' ], 403); } // Remove nonce from settings to avoid saving it unset($settings['_wpnonce']); // Validate and sanitize the settings $sanitized_settings = [ 'enable_access_control' => !empty($settings['enable_access_control']), 'enable_frontend_bar' => !empty($settings['enable_frontend_bar']), ]; update_option('pl_access_control_settings', $sanitized_settings); $sanitized_permission = [ 'enable_shop_manager' => !empty($settings['enable_shop_manager']), ]; update_option('pl_access_control_permissions', $sanitized_permission); $sanitized_colors = [ 'barBackground' => sanitize_hex_color($settings['colors']['barBackground'] ?? ''), 'barText' => sanitize_hex_color($settings['colors']['barText'] ?? ''), 'button' => sanitize_hex_color($settings['colors']['button'] ?? ''), 'buttonText' => sanitize_hex_color($settings['colors']['buttonText'] ?? ''), ]; update_option('pl_access_control_colors', $sanitized_colors); $sanitized_clean_data_on_uninstall=[ 'enable_clean_data_on_uninstall'=> !empty($settings['enable_clean_data_on_uninstall']) ]; update_option('pl_access_control_extra_settings',$sanitized_clean_data_on_uninstall); // Reset WP roles self::reset_wp_roles(); return new WP_REST_Response([ 'message' => 'Settings saved successfully', 'settings' => [ 'general' => $sanitized_settings, 'permissions' => $sanitized_permission, 'colors' => $sanitized_colors ] ], 200); } public static function reset_wp_roles() { $backup = get_option('pl_access_control_role_backup'); if ($backup === false) { return array( 'success' => false, 'message' => 'No backup found to restore' ); } // Get WordPress roles $wp_roles = wp_roles(); // Restore each role's capabilities foreach ($backup as $role_name => $capabilities) { // Check if role exists if (!isset($wp_roles->roles[$role_name])) { $failed_roles[] = $role_name; continue; } // Get role object $role = get_role($role_name); // Get all existing capabilities for this role $existing_capabilities = array(); if (isset($wp_roles->roles[$role_name]['capabilities'])) { $existing_capabilities = array_keys($wp_roles->roles[$role_name]['capabilities']); } // Remove all existing capabilities first foreach ($existing_capabilities as $cap) { $role->remove_cap($cap); } // Add the backed up capabilities foreach ($capabilities as $cap => $granted) { if ($granted) { $role->add_cap($cap); } } } } public static function get_extra_settings(WP_REST_Request $request) { $extra_settings = get_option('pl_access_control_extra_settings', [ 'enable_clean_data_on_uninstall' => false ]); return new WP_REST_Response([ 'message' => 'Settings saved successfully', 'settings' => $extra_settings ], 200); } public static function save_extra_settings(WP_REST_Request $request) { $settings = $request->get_params(); $sanitized_settings = [ 'enable_clean_data_on_uninstall' => !empty($settings['enable_clean_data_on_uninstall']), ]; update_option('pl_access_control_extra_settings', $sanitized_settings); return new WP_REST_Response([ 'message' => 'Settings saved successfully', 'settings' => $sanitized_settings ], 200); } }