Changelog
Content
SafeFonts Free
= 1.1.9 =
- NEW: CSS variables output for all fonts – enables manual font selection in custom CSS and builders supporting CSS custom properties
- NEW: CSS Reference page – comprehensive documentation for CSS variables, Gutenberg classes, and implementation details
- FIX: Auto-regeneration now works correctly for both single plugin updates and bulk updates
- FIX: CSS regeneration hook now properly detects updates from all update methods
= 1.1.8 =
- NEW: Manual CSS regeneration button in Settings page for refreshing fonts.css when needed
- NEW: Automatic CSS regeneration after plugin updates to prevent font display issues
- IMPROVEMENT: fonts.css automatically regenerates when plugin is updated via WordPress auto-update or manual update
= 1.1.7 =
- FIX: WordPress Font Collection registration now uses correct data structure with font_family_settings wrapper, resolving Site Editor JavaScript errors
- FIX: Font families now include proper fallback categories (serif, sans-serif, monospace, cursive, fantasy) in Font Library
- IMPROVEMENT: Enhanced compatibility with FSE themes and Site Editor font management
= 1.1.6 =
- MAJOR: Full prefix refactoring – all PHP elements now use chrmrtns_safefonts_ prefix for better namespace isolation
- NEW: Per-weight font preloading – select specific font weights instead of entire families
- NEW: File format display in preload UI – shows WOFF2, WOFF, TTF, OTF for each weight option
- FIX: WordPress Plugin Check 1.7.0 compliance – all variables properly prefixed
- FIX: Database query security – table names now properly escaped using %i placeholder
- FIX: Form field prefix mismatch – preload settings now save correctly
- IMPROVEMENT: Automatic migration from old safefonts_ prefix to new chrmrtns_safefonts_ prefix
- IMPROVEMENT: Collapsible font family sections in preload settings for better organization
- IMPROVEMENT: Enhanced uninstall.php with proper variable prefixing
- Technical: Constants renamed (SAFEFONTS_* → CHRMRTNS_SAFEFONTS_*)
- Technical: Function renamed (safefonts() → chrmrtns_safefonts())
- Technical: Options migrated (safefonts_version → chrmrtns_safefonts_version, etc.)
- Technical: New FontPreloader class extracted from Core for better code organization
- Technical: CSS class names remain safefonts- for backwards compatibility
- Security: All SQL queries now use WordPress 6.2+ $wpdb->prepare() with %i for table identifiers
- Security: WordPress minimum requirement bumped to 6.2 (required for %i placeholder support)
= 1.1.5 =
- CRITICAL FIX: Migration now runs automatically on plugin update (no longer requires deactivate/reactivate)
- NEW: Bulk delete functionality – select multiple fonts and delete them at once with “Select All” option
- NEW: Font format display – shows WOFF2, WOFF, TTF, or OTF badge in fonts list for better visibility
- Fix: Font previews now display correctly in admin area (fonts.css properly enqueued)
- Fix: Folder structure migration triggers on version change, not just activation
- Fix: CSS file regeneration after migration ensures fonts display immediately
- Fix: Browser cache issues with admin CSS/JS files using file modification timestamps
- Improvement: Version check system ensures migrations run once per version upgrade
- Improvement: Enhanced fonts list UI with checkboxes for individual selection
- Improvement: Cleaned up font list layout for better readability (removed grid conflicts)
- Technical: Added check_version_and_migrate() method that runs on plugins_loaded hook
- Technical: Added handle_bulk_font_deletion() AJAX handler for bulk operations
- Technical: CSS cache-busting using filemtime() for instant updates
= 1.1.4 =
- Fix: Fonts now display correctly in Gutenberg editor iframe preview
- Improved: Added add_editor_style() support for block editor content area
- Enhancement: Fonts now visible when editing posts/pages in Gutenberg
= 1.1.3 =
- Fix: Font previews now display correctly in admin area
- Improved: Enqueue fonts.css in admin for proper font preview rendering
- Enhancement: Fonts now visible in SafeFonts > Fonts admin dopage preview
= 1.1.2 =
- Fix: Fonts now display correctly in Gutenberg block editor
- NEW: Generate .has-{slug}-font-family CSS classes for Gutenberg typography controls
- NEW: Intelligent font fallback detection (serif, sans-serif, monospace, cursive)
- Fix: Database migration now properly adds family_slug column for users upgrading from v1.0.x
- Improved: Enhanced error handling for font uploads with detailed error messages
- Improved: Better directory writability checks before file operations
- Technical: Added PHPCS ignore comments for legitimate direct filesystem operations
= 1.1.1 =
- Fix: Use wp_upload_dir() instead of hardcoded WP_CONTENT_DIR for better compatibility
- Fix: Ensures proper upload directory detection across all WordPress configurations
- Compatibility: Addresses WordPress.org plugin review guidelines
= 1.1.0 =
- NEW: Font family folder organization – fonts now stored in dedicated family folders (e.g., /roboto/, /open-sans/)
- NEW: Added family_slug column to database for faster family-based queries
- NEW: Automatic migration on plugin update – existing fonts moved to family folders seamlessly
- NEW: Automatic cleanup of empty family folders when last font is deleted
- IMPROVED: Admin UI – Font weight badge now uses yellow color instead of red to avoid confusion with delete button
- IMPROVED: File path handling – relative paths now include family folder structure
- Technical: Database schema version bump for migration support
= 1.0.9 =
- Fixed: Removed manual load_plugin_textdomain() – WordPress.org handles translations automatically
- Improved: Help & Documentation page now uses CSS tabs for better organization and navigation
- Improved: Cleaner tabbed interface without long scrolling page
- Added: Translation support with POT file (translatable strings ready)
- Added: Full internationalization (i18n) support for translators
= 1.0.8 =
- Added: Gutenberg block editor integration – uploaded fonts now appear in font picker dropdown
- Added: register_fonts_with_editor() method to inject fonts into editor settings
- Improved: Fonts automatically available in typography controls for all blocks
- Technical: Uses block_editor_settings_all filter to register custom font families
= 1.0.7 =
- Improved: Keyboard accessibility – Upload button now fully accessible via Tab navigation
- Added: ARIA labels for better screen reader support on upload and delete buttons
- Added: Explicit tabindex on upload submit button for consistent keyboard navigation
- Added: Enter key handler for upload button to ensure keyboard submission works
- Improved: Delete buttons now have descriptive ARIA labels including font family name
= 1.0.6 =
- Fixed: Critical – File extension detection now uses original filename instead of temporary upload path
- Fixed: Font uploads were failing because temp files (like /tmp/phpXXXXXX) have no extension
- Improved: validate_font_file() now accepts original filename parameter for accurate validation
- Improved: import_single_font() method signature updated to handle original filenames
= 1.0.5 =
- Fixed: MIME type validation now accepts all common font MIME type variations
- Fixed: Corrupted or empty allowed_types settings are now automatically repaired
- Improved: Better error messages that specify exact validation failure (extension or MIME type)
- Improved: MIME type arrays now include application/octet-stream for broader compatibility
- Added: Automatic detection and repair of misconfigured settings
= 1.0.4 =
- Fixed: Critical – Font upload directory (assets/fonts/) was not being created during refactoring
- Fixed: Incorrect CSS file paths pointing to assets/fonts/css/ instead of assets/css/
- Fixed: Font uploads now work correctly after plugin activation
- Added: Security files (.htaccess, index.php) to fonts directory
- Improved: Directory creation logic in activation hook
= 1.0.3 =
- Fixed: Database table name now includes vendor prefix (chrmrtns_safefonts) to prevent conflicts
- Fixed: Database table not being created on plugin activation
- Improved: Better namespace consistency throughout codebase
- Updated: Developer documentation with correct table name
= 1.0.2 =
- Fixed: WordPress 6.5+ Font Library validation error when no fonts installed
- Added: Extra safety check before registering empty font collection
- Improved: Better error handling for edge cases
= 1.0.1 =
- Added: Top-level admin menu (moved from Settings submenu)
- Added: Link to SafeFonts.com in upgrade notice
- Added: MIME type filter for font uploads
- Fixed: Font upload validation issues
- Improved: Better admin menu organization for future expansion
= 1.0.0 =
- Initial release
- Individual font file uploads (woff2, woff, ttf, otf)
- Security-focused validation (magic bytes, MIME types, file hashing)
- Custom database storage for performance
- Automatic Gutenberg integration
- WordPress 6.5+ Font Library support
- Font preview in admin interface
- Configurable file size limits
- Multiple font weight and style support
SafeFonts Pro
= 1.1.14 =
- NEW: Etch builder integration – fonts render in builder preview via CSS injection
- NEW: Help page now explains the two integration methods (dropdown vs CSS injection)
- IMPROVEMENT: SafeFonts Pro now supports 15 integrations
= 1.1.13 =
- NEW: Kadence theme integration – SafeFonts available in all Customizer typography controls (works with free Kadence and Kadence Pro)
- NEW: Kadence Blocks plugin integration – SafeFonts available in all typography controls throughout the block editor
- NEW: Spectra (Ultimate Addons for Gutenberg) integration – SafeFonts available in all Spectra block typography controls
- NEW: Blocksy theme integration – SafeFonts available in all Customizer typography controls (works with free and Pro)
- NEW: Builderius builder integration – SafeFonts available via CSS variables (use var(–safefonts-font-slug) in typography fields)
- NEW: CSS variables output for all fonts – enables manual font selection in any theme/builder supporting CSS custom properties
- IMPROVEMENT: SafeFonts Pro now supports 14 integrations (added Kadence theme, Kadence Blocks, Spectra, Blocksy, and Builderius)
= 1.1.12 =
- FIX: Auto-regeneration now works correctly for both single plugin updates (licensing) and bulk updates
- FIX: CSS regeneration hook now properly detects updates from all update methods
= 1.1.11 =
- NEW: Manual CSS regeneration button in Settings page for refreshing fonts.css when needed
- NEW: Automatic CSS regeneration after plugin updates to prevent font display issues
- IMPROVEMENT: fonts.css automatically regenerates when plugin is updated via WordPress auto-update or manual update
= 1.1.10 =
- FIX: WordPress Font Collection registration now uses correct data structure with font_family_settings wrapper, resolving Site Editor JavaScript errors
- FIX: Font families now include proper fallback categories (serif, sans-serif, monospace, cursive, fantasy) in Font Library
- IMPROVEMENT: Enhanced compatibility with FSE themes and Site Editor font management
= 1.1.9 =
- NEW: Astra theme integration – SafeFonts available in all Customizer typography controls (works with free and Pro)
- NEW: SafeFonts appear in dedicated “SafeFonts Pro” section in Astra Customizer, matching native font grouping structure
- IMPROVEMENT: Astra integration prevents Google Fonts API loading for SafeFonts, ensuring true GDPR compliance
- IMPROVEMENT: Intelligent font categorization (serif, sans-serif, monospace, cursive, display) for proper fallback handling
= 1.1.8 =
- NEW: Brizy Builder integration – automatically replaces Google Fonts (bunny.net CDN) with local SafeFonts for true GDPR compliance (Pro exclusive)
- NEW: Seamless font override – SafeFonts replaces existing Brizy fonts while preserving content compatibility
- NEW: Automatic sync on font upload – fonts instantly available in Brizy editor (works with Brizy Free and Pro)
- NEW: Custom font upload for Brizy Free users – SafeFonts Pro enables custom fonts in Brizy without requiring Brizy Pro
- NEW: GeneratePress theme integration – SafeFonts available in all typography controls (works with free GeneratePress and GP Premium)
- NEW: GenerateBlocks plugin integration – SafeFonts available in Typography panel for all blocks with font controls (legacy and modern blocks)
- FIX: “Check for Updates Now” button now properly clears all transient caches (2-day plugin info cache + version cache)
- FIX: Font family names from package imports now properly strip style suffixes (Normal, Regular, Italic, Bold) for cleaner font names and better page builder compatibility
- IMPROVEMENT: Database schema updated with Brizy font tracking for better integration management
- IMPROVEMENT: Brizy integration generates UIDs in Brizy’s native format for optimal compatibility
- IMPROVEMENT: GeneratePress integration intelligently categorizes fonts (serif, sans-serif, monospace, display, handwriting)
= 1.1.7 =
- MAJOR: Full prefix refactoring – all PHP elements now use chrmrtns_safefonts_pro_ prefix for better namespace isolation
- NEW: Delete entire font family with one click – removes all weights/styles in a family at once (Pro exclusive feature)
- NEW: Per-weight font preloading – select specific font weights instead of entire families
- NEW: File format display in preload UI – shows WOFF2, WOFF, TTF, OTF for each weight option
- FIX: WordPress Plugin Check 1.7.0 compliance – all variables properly prefixed
- FIX: Database query security – table names now properly escaped using %i placeholder
- FIX: Form field prefix mismatch – preload settings and license activation now save correctly
- FIX: wp_redirect() replaced with wp_safe_redirect() for better security
- FIX: ECF_Plugin compatibility – added phpcs:ignore for required Oxygen Builder 4.x API names
- IMPROVEMENT: Automatic migration from old safefonts_ prefix to new chrmrtns_safefonts_ prefix
- IMPROVEMENT: Collapsible font family sections in preload settings for better organization
- IMPROVEMENT: Enhanced family header UI with delete button on fonts page
- IMPROVEMENT: Enhanced uninstall.php with proper variable prefixing
- Technical: Constants renamed (SAFEFONTS_PRO_* → CHRMRTNS_SAFEFONTS_PRO_*)
- Technical: Function renamed (safefonts_pro() → chrmrtns_safefonts_pro())
- Technical: Options migrated (safefonts_version → chrmrtns_safefonts_version, etc.)
- Technical: New FontPreloader class extracted from Core for better code organization
- Technical: CSS class names remain safefonts- for backwards compatibility
- Security: All SQL queries now use WordPress 6.2+ $wpdb->prepare() with %i for table identifiers
- Security: WordPress minimum requirement bumped to 6.2 (required for %i placeholder support)
= 1.1.6 =
- CRITICAL FIX: Package import (ZIP upload) now correctly creates family folders and sets family_slug
- Fix: Migration now also runs for users upgrading from v1.1.0-1.1.5 to catch fonts with empty family_slug
- Fix: Fonts uploaded via package import between v1.1.0-1.1.5 will be automatically migrated to proper folder structure
- Technical: Added v1.1.6 migration check to handle edge case of broken package imports
= 1.1.5 =
- CRITICAL FIX: Migration now runs automatically on plugin update (no longer requires deactivate/reactivate)
- NEW: Bulk delete functionality – select multiple fonts and delete them at once with “Select All” option
- NEW: Font format display – shows WOFF2, WOFF, TTF, or OTF badge in fonts list for better visibility
- Fix: Font previews now display correctly in admin area (fonts.css properly enqueued)
- Fix: Folder structure migration triggers on version change, not just activation
- Fix: CSS file regeneration after migration ensures fonts display immediately
- Fix: Browser cache issues with admin CSS/JS files using file modification timestamps
- Improvement: Version check system ensures migrations run once per version upgrade
- Improvement: Enhanced fonts list UI with checkboxes for individual selection
- Improvement: Cleaned up font list layout for better readability (removed grid conflicts)
- Technical: Added check_version_and_migrate() method that runs on plugins_loaded hook
- Technical: Added handle_bulk_font_deletion() AJAX handler for bulk operations
- Technical: CSS cache-busting using filemtime() for instant updates
= 1.1.4 =
- Fix: Fonts now display correctly in Gutenberg editor iframe preview
- Improved: Added add_editor_style() support for block editor content area
- Enhancement: Fonts now visible when editing posts/pages in Gutenberg
= 1.1.3 =
- Fix: Font previews now display correctly in admin area
- Improved: Enqueue fonts.css in admin for proper font preview rendering
- Enhancement: Fonts now visible in SafeFonts > Fonts admin dopage preview
= 1.1.2 =
- Fix: Fonts now display correctly in Gutenberg block editor
- NEW: Generate .has-{slug}-font-family CSS classes for Gutenberg typography controls
- NEW: Intelligent font fallback detection (serif, sans-serif, monospace, cursive)
- Fix: Database migration now properly adds family_slug column for users upgrading from v1.0.x
- Improved: Enhanced error handling for font uploads with detailed error messages
- Improved: Better directory writability checks before file operations
- Technical: Added PHPCS ignore comments for legitimate direct filesystem operations
= 1.1.1 =
- Fix: Use wp_upload_dir() instead of hardcoded WP_CONTENT_DIR for better compatibility
- Fix: Ensures proper upload directory detection across all WordPress configurations
- Compatibility: Addresses WordPress.org plugin review guidelines
= 1.1.0 =
- Initial Pro release
- Page builder integration: Elementor, Bricks, Beaver Builder, Divi, Oxygen
- Automatic free version deactivation on Pro activation
- Shared database and uploads folder with free version
- All free version features included
- Professional admin interface
- WordPress 6.5+ Font Library support
- Gutenberg block editor integration
- Security-focused validation (magic bytes, MIME types, file hashing)
- Custom database storage for performance
- GDPR-compliant local hosting
= 1.0.9 =
- Fixed: Oxygen Builder 6.0 integration – fonts now properly load in Oxygen font selector
- Fixed: Corrected CSS URL generation for Oxygen font registration
- Fixed: Beaver Builder integration – fonts now appear in System fonts (works with Google Fonts disabled)
- Fixed: Removed manual load_plugin_textdomain() – WordPress.org handles translations automatically
- Fixed: Removed ini_set() calls per WordPress.org plugin guidelines
- Updated: Page Builders integration now shows “Oxygen 6” supporting versions 4.x through 6.x
- Improved: Help & Documentation page now uses CSS tabs for better organization and navigation
- Improved: Cleaner tabbed interface without long scrolling page
- Added: Translation support with POT file (363 translatable strings)
- Added: Full internationalization (i18n) support for translators
= 1.0.0 =
- Initial Pro release
- Page builder integration: Elementor, Bricks, Beaver Builder, Divi, Oxygen
- Automatic free version deactivation on Pro activation
- Shared database and uploads folder with free version
- All free version features included
- Professional admin interface
- WordPress 6.5+ Font Library support
- Gutenberg block editor integration
- Security-focused validation (magic bytes, MIME types, file hashing)
- Custom database storage for performance
- GDPR-compliant local hosting
Font Downloader
= 1.1.0 =
NEW FEATURES:
- ITALIC FONT SUPPORT: Download italic variants alongside normal weights
- Improved UI: Weight and style selection now grouped visually
- Smart deduplication: Eliminates “regular”/”400” duplicates automatically
= 1.0.1 =
FIXED:
- Fixed “regular” and “400” creating duplicate downloads (normalized to “400”)
- Fixed italic variants being excluded from download options
- Fixed woff format not downloading when requested alongside woff2
- GoogleFonts.php now makes multiple requests with different User-Agents to retrieve all requested formats
- Enhanced parseFontCSS() to capture all font format variations using preg_match_all()
- Chrome 120 User-Agent for woff2 format, IE 11 User-Agent for woff format
CHANGED:
- Rate limits increased: 30 requests/minute (from 10), 500 requests/hour (from 100)
- UI redesigned: Font weights now show “Normal” and “Italic” checkboxes side-by-side
- Title changed from “Font Weights” to “Font Weights & Styles”
TECHNICAL:
- Added normalizeVariants() method to handle variant deduplication
- Added groupVariantsByWeight() method for organized variant display
- Added makeRequestWithUserAgent() helper method for format-specific requests
- Updated getFontCSS() to support multiple format requests via User-Agent strategy
- Improved CSS parsing regex to handle multiple url()/format() pairs per @font-face
- New CSS classes: .weight-group, .weight-label, .style-options