toggle( [ '_wpnonce' => isset( $_POST['_wpnonce'] ) && is_string( $_POST['_wpnonce'] ) ? sanitize_text_field( wp_unslash( $_POST['_wpnonce'] ) ) : '' ] ); self::finish( $result, admin_url( 'admin.php?page=shiftora-settings' ) ); } /** Transfer-tuning fields on Settings. */ public static function transfer_settings(): void { check_admin_referer( TransferSettings::NONCE_ACTION ); self::require_manage_options(); $fields = [ '_wpnonce' => isset( $_POST['_wpnonce'] ) && is_string( $_POST['_wpnonce'] ) ? sanitize_text_field( wp_unslash( $_POST['_wpnonce'] ) ) : '' ]; foreach ( TransferSettings::field_names() as $name ) { if ( isset( $_POST[ $name ] ) && is_string( $_POST[ $name ] ) ) { $fields[ $name ] = sanitize_text_field( wp_unslash( $_POST[ $name ] ) ); } } self::finish( ( new TransferSettings() )->save( $fields ), admin_url( 'admin.php?page=shiftora-settings&transfer_settings_updated=1' ) ); } /** Backups-to-keep on Settings, its own form so it cannot reset the transfer fields. */ public static function backup_settings(): void { check_admin_referer( BackupSettings::NONCE_ACTION ); self::require_manage_options(); $fields = [ '_wpnonce' => isset( $_POST['_wpnonce'] ) && is_string( $_POST['_wpnonce'] ) ? sanitize_text_field( wp_unslash( $_POST['_wpnonce'] ) ) : '' ]; if ( isset( $_POST['shiftora_backup_retention'] ) && is_string( $_POST['shiftora_backup_retention'] ) ) { $fields['shiftora_backup_retention'] = sanitize_text_field( wp_unslash( $_POST['shiftora_backup_retention'] ) ); } self::finish( ( new BackupSettings() )->save( $fields ), admin_url( 'admin.php?page=shiftora-settings&transfer_settings_updated=1' ) ); } /** One-click restore from the recovery notice. */ public static function recovery_restore(): void { $migration_id = isset( $_GET['migration_id'] ) && is_string( $_GET['migration_id'] ) ? absint( wp_unslash( $_GET['migration_id'] ) ) : 0; check_admin_referer( 'shiftora_recovery_' . $migration_id ); self::require_manage_options(); if ( $migration_id > 0 ) { ServiceFactory::recovery_manager()->run_auto_recovery( $migration_id ); } wp_safe_redirect( admin_url( 'admin.php?page=shiftora-backups' ) ); exit; } /** Hides the recovery notice for a week; the next unfinished migration shows its own. */ public static function dismiss_recovery_notice(): void { $migration_id = isset( $_GET['migration_id'] ) && is_string( $_GET['migration_id'] ) ? absint( wp_unslash( $_GET['migration_id'] ) ) : 0; check_admin_referer( self::dismiss_action( $migration_id ) ); self::require_manage_options(); if ( $migration_id > 0 ) { set_transient( 'shiftora_recovery_' . $migration_id . '_dismissed', 1, WEEK_IN_SECONDS ); } wp_safe_redirect( wp_get_referer() ?: admin_url( 'admin.php?page=shiftora-backups' ) ); exit; } private static function require_manage_options(): void { if ( ! current_user_can( 'manage_options' ) ) { wp_die( esc_html__( 'You do not have permission to perform this action.', 'shiftora' ), 403 ); } } /** Redirects on success; a refusal from a service ends the request with its message. */ private static function finish( bool|\WP_Error $result, string $location ): void { if ( is_wp_error( $result ) ) { wp_die( esc_html( $result->get_error_message() ), 403 ); } wp_safe_redirect( $location ); exit; } }