false, 'attribution' => 'first', // first | last. 'remember_visitors' => false, // false = cookieless (Phase 33); true = the 365-day cookie. 'retention_days' => 90, // How long hits (and crawler rows) are kept (Phase 34). ); const RETENTION_MIN = 7; const RETENTION_MAX = 1095; public static function all(): array { $stored = get_option( self::OPTION, array() ); $all = array_merge( self::DEFAULTS, is_array( $stored ) ? $stored : array() ); return self::sanitize( $all ) + array( 'delete_data_on_uninstall' => (bool) get_option( 'saddle_analytics_delete_data_on_uninstall' ), ); } public static function get( string $key ) { return self::all()[ $key ] ?? null; } /** Accepts a partial update; unknown keys dropped, values coerced. */ public static function update( array $incoming ): array { $current = self::all(); $next = self::sanitize( array_merge( $current, $incoming ) ); update_option( self::OPTION, $next, true ); if ( array_key_exists( 'delete_data_on_uninstall', $incoming ) ) { update_option( 'saddle_analytics_delete_data_on_uninstall', (bool) $incoming['delete_data_on_uninstall'], false ); } return self::all(); } public static function valid_key( string $key ): bool { return 'delete_data_on_uninstall' === $key || array_key_exists( $key, self::DEFAULTS ); } /** @return array Only known keys, correctly typed. */ private static function sanitize( array $values ): array { return array( 'track_admins' => ! empty( $values['track_admins'] ), 'attribution' => in_array( $values['attribution'] ?? 'first', array( 'first', 'last' ), true ) ? $values['attribution'] : 'first', 'remember_visitors' => ! empty( $values['remember_visitors'] ), 'retention_days' => max( self::RETENTION_MIN, min( self::RETENTION_MAX, (int) ( $values['retention_days'] ?? 90 ) ) ), ); } }