'high', 'default_format' => 'pdf', 'default_side' => 'both', 'cache_ttl_hours' => 24, 'log_enabled' => true, 'log_retention_days' => 30, 'preload_sdk_globally' => false, 'debug_mode' => false, 'filename_pattern' => '{template_name}_{date}', 'api_url_override' => '', ]; } /** * Get merged plugin settings. * * @return array */ function hundred_prints_get_settings() { $settings = get_option( '100p_settings', [] ); if ( ! is_array( $settings ) ) { $settings = []; } return array_merge( hundred_prints_default_settings(), $settings ); } /** * Sanitize settings submitted through the Settings API. * * @param array $input Raw settings input. * @return array */ function hundred_prints_sanitize_settings( $input ) { $input = is_array( $input ) ? $input : []; $defaults = hundred_prints_default_settings(); $sanitized = $defaults; $allowed_quality = [ 'draft', 'standard', 'high', 'ultra' ]; $quality = isset( $input['default_quality'] ) ? sanitize_key( $input['default_quality'] ) : $defaults['default_quality']; $sanitized['default_quality'] = in_array( $quality, $allowed_quality, true ) ? $quality : $defaults['default_quality']; $allowed_format = [ 'pdf', 'png' ]; $format = isset( $input['default_format'] ) ? sanitize_key( $input['default_format'] ) : $defaults['default_format']; $sanitized['default_format'] = in_array( $format, $allowed_format, true ) ? $format : $defaults['default_format']; $allowed_side = [ 'front', 'back', 'both' ]; $side = isset( $input['default_side'] ) ? sanitize_key( $input['default_side'] ) : $defaults['default_side']; $sanitized['default_side'] = in_array( $side, $allowed_side, true ) ? $side : $defaults['default_side']; $sanitized['cache_ttl_hours'] = isset( $input['cache_ttl_hours'] ) ? min( 168, max( 1, absint( $input['cache_ttl_hours'] ) ) ) : $defaults['cache_ttl_hours']; $sanitized['log_retention_days'] = isset( $input['log_retention_days'] ) ? min( 365, max( 1, absint( $input['log_retention_days'] ) ) ) : $defaults['log_retention_days']; $sanitized['log_enabled'] = ! empty( $input['log_enabled'] ); $sanitized['preload_sdk_globally'] = ! empty( $input['preload_sdk_globally'] ); $sanitized['debug_mode'] = ! empty( $input['debug_mode'] ); $filename_pattern = isset( $input['filename_pattern'] ) ? sanitize_text_field( wp_unslash( $input['filename_pattern'] ) ) : $defaults['filename_pattern']; $sanitized['filename_pattern'] = $filename_pattern !== '' ? $filename_pattern : $defaults['filename_pattern']; $api_url = isset( $input['api_url_override'] ) ? trim( sanitize_text_field( wp_unslash( $input['api_url_override'] ) ) ) : ''; $sanitized['api_url_override'] = $api_url !== '' ? esc_url_raw( $api_url ) : ''; return $sanitized; } /** * Format frontend-safe settings for JavaScript. * * @return array */ function hundred_prints_get_public_settings() { $settings = hundred_prints_get_settings(); return [ 'defaultQuality' => $settings['default_quality'], 'defaultFormat' => $settings['default_format'], 'defaultSide' => $settings['default_side'], 'filenamePattern' => $settings['filename_pattern'], 'preloadSdkGlobally' => (bool) $settings['preload_sdk_globally'], 'debugMode' => (bool) $settings['debug_mode'], 'logEnabled' => (bool) $settings['log_enabled'], ]; } /** * Replace filename tokens with available context values. * * @param string $pattern Filename pattern. * @param array $tokens Token values without braces. * @return string */ function hundred_prints_format_filename( $pattern, $tokens ) { $pattern = $pattern !== '' ? $pattern : hundred_prints_get_settings()['filename_pattern']; $tokens = is_array( $tokens ) ? $tokens : []; $tokens = array_merge( [ 'date' => wp_date( 'Y-m-d' ), 'time' => wp_date( 'His' ), 'site_name' => get_bloginfo( 'name' ), ], $tokens ); foreach ( $tokens as $key => $value ) { $pattern = str_replace( '{' . $key . '}', sanitize_text_field( (string) $value ), $pattern ); } $filename = preg_replace( '/[\\\\\/:*?"<>|]+/', '-', $pattern ); $filename = trim( preg_replace( '/\s+/', ' ', $filename ) ); return $filename !== '' ? $filename : 'document'; }