__( 'Choose provider', 'devsyed-media-offloader' ), 2 => __( 'Credentials', 'devsyed-media-offloader' ), 3 => __( 'Delivery', 'devsyed-media-offloader' ), 4 => __( 'Offloading', 'devsyed-media-offloader' ), 5 => __( 'Image formats', 'devsyed-media-offloader' ), 6 => __( 'Cache purge', 'devsyed-media-offloader' ), 7 => __( 'Advanced', 'devsyed-media-offloader' ), 8 => __( 'Verify and finish', 'devsyed-media-offloader' ), ); $error = get_transient( 'r2clouder_onboarding_error_' . get_current_user_id() ); delete_transient( 'r2clouder_onboarding_error_' . get_current_user_id() ); ?>
array( 'Cloudflare R2', __( 'Cloudflare storage with custom-domain delivery.', 'devsyed-media-offloader' ) ), 's3' => array( 'AWS S3', __( 'Amazon storage with bucket or CloudFront delivery.', 'devsyed-media-offloader' ) ), 'spaces' => array( 'DigitalOcean Spaces', __( 'S3-compatible storage with Spaces CDN delivery.', 'devsyed-media-offloader' ) ), 'gcs' => array( 'Google Cloud Storage', __( 'Connect using Cloud Storage HMAC keys.', 'devsyed-media-offloader' ) ), ); ?> connect_storage( $bucket, $enable_public ); if ( is_wp_error( $connection ) ) { set_transient( 'r2clouder_onboarding_error_' . get_current_user_id(), $connection->get_error_message(), 300 ); wp_safe_redirect( self::url( 2 ) ); exit; } if ( $same_bucket && '' !== $stored['public_url'] ) { $connection['public_url'] = $stored['public_url']; } elseif ( ! isset( $connection['public_url'] ) ) { $connection['public_url'] = ''; } $credentials = array_merge( $credentials, $connection ); } $settings = Admin::sanitize_settings( $settings ); if ( 2 === $step && 's3' === Options::get_credential( 'provider' ) ) { $credentials = Admin::sanitize_credentials( $credentials ); $effective = array_merge( Options::get_credentials(), $credentials ); foreach ( Options::credential_constants() as $key => $constant ) { if ( 'constant' === Options::credential_source( $key ) ) { $effective[ $key ] = Options::get_credential( $key ); } } $action = isset( $_POST['aws_bucket_action'] ) && is_string( $_POST['aws_bucket_action'] ) ? sanitize_key( wp_unslash( $_POST['aws_bucket_action'] ) ) : 'connect'; $client = Storage::create( $effective ); if ( ! in_array( $action, array( 'connect', 'create' ), true ) ) { $connection = new \WP_Error( 'r2clouder_invalid_bucket_action', __( 'Choose Create new or Connect existing bucket.', 'devsyed-media-offloader' ) ); } elseif ( is_wp_error( $client ) ) { $connection = $client; } else { $connection = 'create' === $action ? $client->create_aws_bucket() : $client->head( '' ); if ( ! is_wp_error( $connection ) && isset( $_POST['aws_public_read'] ) && '1' === $_POST['aws_public_read'] ) { $connection = $client->enable_aws_public_delivery(); if ( ! is_wp_error( $connection ) ) { $settings['delivery_mode'] = 'public'; if ( '' === $effective['public_url'] ) { $credentials['public_url'] = $client->get_base_url(); } } } } if ( is_wp_error( $connection ) ) { set_transient( 'r2clouder_onboarding_error_' . get_current_user_id(), $connection->get_error_message(), 300 ); wp_safe_redirect( self::url( 2 ) ); exit; } } if ( 2 === $step && 'spaces' === Options::get_credential( 'provider' ) ) { $credentials = Admin::sanitize_credentials( $credentials ); $effective = array_merge( Options::get_credentials(), $credentials ); foreach ( Options::credential_constants() as $key => $constant ) { if ( 'constant' === Options::credential_source( $key ) ) { $effective[ $key ] = Options::get_credential( $key ); } } $action = isset( $_POST['spaces_bucket_action'] ) && is_string( $_POST['spaces_bucket_action'] ) ? sanitize_key( wp_unslash( $_POST['spaces_bucket_action'] ) ) : 'connect'; $client = Storage::create( $effective ); if ( ! in_array( $action, array( 'connect', 'create' ), true ) ) { $connection = new \WP_Error( 'r2clouder_invalid_bucket_action', __( 'Choose Create new or Connect existing bucket.', 'devsyed-media-offloader' ) ); } elseif ( is_wp_error( $client ) ) { $connection = $client; } else { $connection = 'create' === $action ? $client->create_spaces_bucket( isset( $_POST['spaces_public_read'] ) && '1' === $_POST['spaces_public_read'] ) : $client->head( '' ); if ( 'connect' === $action && ! is_wp_error( $connection ) && isset( $_POST['spaces_public_read'] ) && '1' === $_POST['spaces_public_read'] ) { $connection = $client->enable_spaces_public_delivery(); } } if ( is_wp_error( $connection ) ) { set_transient( 'r2clouder_onboarding_error_' . get_current_user_id(), $connection->get_error_message(), 300 ); wp_safe_redirect( self::url( 2 ) ); exit; } if ( 'create' === $action ) { $credentials['public_url'] = 'https://' . $effective['bucket'] . '.' . $effective['region'] . '.digitaloceanspaces.com'; } } // Activation belongs to the verified final step. $settings['enabled'] = false; Options::update_credentials( Admin::sanitize_credentials( $credentials ) ); Options::update_settings( $settings ); $stored = Options::get_credentials(); $location = 'r2' === $stored['provider'] ? 'account_id' : 'region'; if ( 2 === $step && ( '' === $stored['bucket'] || '' === $stored['access_key'] || '' === $stored['secret_key'] || ( 'gcs' !== $stored['provider'] && '' === $stored[ $location ] ) ) ) { $error = __( 'Enter your bucket and storage credentials before continuing.', 'devsyed-media-offloader' ); } elseif ( 3 === $step && ( ! Options::has_credentials() || ( 'private' !== Options::get( 'delivery_mode' ) && 'https' !== wp_parse_url( $stored['public_url'], PHP_URL_SCHEME ) ) ) ) { $error = __( 'Enter an HTTPS delivery URL or choose private delivery before continuing.', 'devsyed-media-offloader' ); } } else { $client = Storage::create( Options::get_credentials() ); $result = is_wp_error( $client ) ? $client : $client->test_connection( Options::get_credential( 'public_url' ) ); if ( is_wp_error( $result ) ) { $error = $result->get_error_message(); } elseif ( empty( $result['ok'] ) ) { $messages = array(); foreach ( $result['steps'] as $check ) { if ( ! $check['ok'] ) { $messages[] = $check['message']; } } $error = empty( $messages ) ? __( 'Connection verification failed. Check storage and delivery and try again.', 'devsyed-media-offloader' ) : implode( ' ', $messages ); } else { Options::update_settings( array( 'enabled' => true ) ); update_option( self::COMPLETE, true, false ); wp_safe_redirect( admin_url( 'options-general.php?page=r2clouder&tab=overview' ) ); exit; } } if ( '' !== $error ) { set_transient( 'r2clouder_onboarding_error_' . get_current_user_id(), $error, 300 ); } else { ++$step; update_option( self::PROGRESS, $step, false ); } wp_safe_redirect( self::url( $step ) ); exit; } }