'POST', 'callback' => [__CLASS__, 'create_backup'], 'permission_callback' => function () { return current_user_can('manage_options'); } ]); register_rest_route('plac/v1', '/restore-backup', [ 'methods' => 'POST', 'callback' => [__CLASS__, 'restore_backup'], 'permission_callback' => function () { return current_user_can('manage_options'); } ]); register_rest_route('plac/v1', '/backup/last-time', array( 'methods' => 'GET', 'callback' => [__CLASS__, 'get_last_backup_time'], 'permission_callback' => function () { return current_user_can('manage_options'); } )); } public static function create_backup(WP_REST_Request $request) { global $wp_roles; // Check nonce for security $nonce = $request->get_param('_wpnonce'); if (!$nonce || !wp_verify_nonce($nonce, 'plac_wp_rest')) { return new WP_REST_Response([ 'message' => 'Invalid nonce' ], 403); } if (!isset($wp_roles)) { $wp_roles = new WP_Roles(); } $roles = $wp_roles->roles; // Create backup update_option('plac_role_manager_backup', $roles, false); // Save backup timestamp $current_time = current_time('mysql'); update_option('plac_roles_last_backup_time', $current_time); // Format timestamp for display $formatted_time = date_i18n(get_option('date_format') . ' ' . get_option('time_format'), strtotime($current_time)); return new WP_REST_Response(array( 'success' => true, 'data' => array( 'lastBackupTime' => $formatted_time ) ), 200); } public static function restore_backup(WP_REST_Request $request) { // Check nonce for security $nonce = $request->get_param('_wpnonce'); if (!$nonce || !wp_verify_nonce($nonce, 'plac_wp_rest')) { return new WP_REST_Response([ 'message' => 'Invalid nonce' ], 403); } // Get backup $backup = get_option('plac_role_manager_backup'); if (!$backup || !is_array($backup)) { return new WP_REST_Response(array( 'success' => false, 'message' => 'No valid backup found.', ), 400); } // Initialize WP_Roles global $wp_roles; if (!isset($wp_roles)) { $wp_roles = new WP_Roles(); } // Remove all existing roles before restoring foreach ($wp_roles->roles as $role_key => $role_data) { $wp_roles->remove_role($role_key); } // Restore roles from backup foreach ($backup as $role_key => $role_data) { $wp_roles->add_role($role_key, $role_data['name'], $role_data['capabilities']); } return new WP_REST_Response(array( 'success' => true, ), 200); } public static function get_last_backup_time(WP_REST_Request $request) { $last_backup_time = get_option('plac_roles_last_backup_time', ''); if (!empty($last_backup_time)) { $formatted_time = date_i18n(get_option('date_format') . ' ' . get_option('time_format'), strtotime($last_backup_time)); } else { $formatted_time = __('Never', 'access-control'); } return new WP_REST_Response(array( 'success' => true, 'data' => array( 'lastBackupTime' => $formatted_time ) ), 200); } }