Releases: SilverAssist/contact-form-to-api
Releases · SilverAssist/contact-form-to-api
Release list
v2.5.0
Immutable
release. Only release title and notes can be modified.
What's Changed
- chore(deps): bump actions/setup-node from 4.4.0 to 6.3.0 by @dependabot[bot] in #81
- chore(deps): bump softprops/action-gh-release from 2.5.0 to 2.6.1 in the github-actions-updates group by @dependabot[bot] in #82
- chore(deps): bump picomatch by @dependabot[bot] in #83
- chore(deps-dev): bump cssnano from 7.1.3 to 7.1.4 in the npm-dev-dependencies group by @dependabot[bot] in #85
- chore(deps): bump dependabot/fetch-metadata from 2.5.0 to 3.0.0 by @dependabot[bot] in #84
- chore(deps): bump actions/upload-artifact from 7.0.0 to 7.0.1 in the github-actions-updates group by @dependabot[bot] in #86
- chore(deps): bump softprops/action-gh-release from 2.6.1 to 3.0.0 by @dependabot[bot] in #88
- chore(deps): bump actions/github-script from 8.0.0 to 9.0.0 by @dependabot[bot] in #87
- chore(deps-dev): bump the npm-dev-dependencies group with 2 updates by @dependabot[bot] in #89
- chore(deps): bump the github-actions-updates group with 2 updates by @dependabot[bot] in #90
- chore(deps-dev): bump the npm-dev-dependencies group with 2 updates by @dependabot[bot] in #91
- chore(deps-dev): bump the npm-dev-dependencies group with 2 updates by @dependabot[bot] in #92
- chore(deps-dev): bump the npm-dev-dependencies group with 2 updates by @dependabot[bot] in #93
- chore(deps-dev): bump cssnano from 7.1.9 to 8.0.1 by @dependabot[bot] in #94
- chore(deps-dev): bump postcss from 8.5.14 to 8.5.15 in the npm-dev-dependencies group by @dependabot[bot] in #96
- chore(deps-dev): update php-stubs/wordpress-tests-stubs requirement from ^6.6 to ^7.0 by @dependabot[bot] in #95
- chore(deps-dev): bump cssnano from 8.0.1 to 8.0.2 in the npm-dev-dependencies group by @dependabot[bot] in #97
- chore(deps): bump softprops/action-gh-release from 3.0.0 to 3.0.1 in the github-actions-updates group by @dependabot[bot] in #98
- chore(deps-dev): bump postcss from 8.5.15 to 8.5.16 in the npm-dev-dependencies group by @dependabot[bot] in #99
- chore(deps): bump softprops/action-gh-release from 3.0.1 to 3.0.2 in the github-actions-updates group by @dependabot[bot] in #100
- chore(deps-dev): bump postcss from 8.5.16 to 8.5.19 in the npm-dev-dependencies group by @dependabot[bot] in #101
- chore(deps-dev): bump postcss from 8.5.19 to 8.5.20 in the npm-dev-dependencies group by @dependabot[bot] in #103
- chore(deps-dev): bump svgo from 4.0.1 to 4.0.2 by @dependabot[bot] in #104
- chore(deps-dev): bump postcss from 8.5.20 to 8.5.23 in the npm-dev-dependencies group by @dependabot[bot] in #105
- chore(deps-dev): bump the npm-dev-dependencies group with 2 updates by @dependabot[bot] in #106
- chore(deps-dev): bump brace-expansion from 1.1.12 to 1.1.18 by @dependabot[bot] in #107
- Adopt silverassist/coding-standards + silverassist/wp-coding-standards by @miguelcolmenares in #109
- chore(deps): bump actions/setup-node from 6.4.0 to 7.0.0 by @dependabot[bot] in #102
- Adopt silverassist/wp-plugin-kernel for plugin bootstrap by @miguelcolmenares in #110
- Adopt shared CI workflow and quality-check scripts by @miguelcolmenares in #111
- chore(ci): bump Node.js from 20 to 22 in workflows by @miguelcolmenares in #112
- chore(deps-dev): bump the npm-dev-dependencies group across 1 directory with 2 updates by @dependabot[bot] in #108
- fix: Resolve lodash and yaml security alerts by @miguelcolmenares in #113
- Release v2.5.0 by @miguelcolmenares in #114
Full Changelog: v2.4.0...v2.5.0
v2.4.0
Immutable
release. Only release title and notes can be modified.
Full Changelog: v2.3.1...v2.4.0
v2.3.1
Immutable
release. Only release title and notes can be modified.
Full Changelog: v2.3.0...v2.3.1
v2.3.0
Immutable
release. Only release title and notes can be modified.
Full Changelog: v2.2.1...v2.3.0
CF7 to API v2.2.1
Immutable
release. Only release title and notes can be modified.
Fixed
- Release Build: Fixed missing assets from Composer packages in release ZIP
- Settings Hub CSS (
settings-hub.css) now included in build - GitHub Updater JS (
check-updates.js) now included in build - Updated build script to preserve
assets/directories in SilverAssist packages
- Settings Hub CSS (
CF7 to API v2.2.0
Immutable
release. Only release title and notes can be modified.
Changed
- Admin Dashboard UI Redesign: Aligned settings page with card-based design system
- Expanded CSS with full card design system and CSS variables
- Added version badge, status-indicator, and feature-status styles
- Simplified Plugin Information section
- Removed obsolete update check script for cleaner admin experience
Maintenance
- GitHub Actions Dependencies: Updated CI/CD workflow dependencies
- Bumped
actions/upload-artifactfrom v6.0.0 to v7.0.0 - Bumped
actions/download-artifactfrom v7.0.0 to v8.0.0
- Bumped
- Code Cleanup: Removed redundant CSS properties from resolved status indicator
CF7 to API v2.1.0
Immutable
release. Only release title and notes can be modified.
Added
-
Granular Alert Preferences: Per-submission failure alerts with granular control
- New
alert_typessetting structure withthresholdandindividualoptions maybe_send_individual_alert()triggers when a submission permanently fails after all retries- Individual alerts are event-driven (no cooldown) vs rate-limited threshold alerts
- Privacy-first design: alert emails contain only error metadata (form name, endpoint, timestamp, response code, error message) - never user-submitted form data
- Spam prevention: transient flag per log_id prevents duplicate alerts on retry
- UI: "Alert Types" section with nested checkboxes for threshold and individual alerts
- Threshold settings reorganized under clear subheading
- Backward compatible: threshold alerts enabled by default, individual disabled
- Integrated in
LogsController::handle_retry_action()for retry exhaustion and max limit scenarios
- New
-
Response Action Hook (
cf7_api_after_response): New filter hook for extending plugin functionality- Fires after each API response is received (success or failure)
- Provides complete response data (status code, headers, body, parsed JSON, duration)
- Includes submission context (log ID, form ID, form title, form data, endpoint, retry info)
- Enables developers to:
- Store CRM lead IDs returned by APIs
- Trigger notifications based on response content
- Log to external monitoring services (Sentry, Bugsnag, etc.)
- Send data to secondary endpoints (multi-endpoint support)
- Hook only fires for HTTP responses (not WP_Error cases)
- Minimal overhead when no callbacks are registered
- See
docs/API_REFERENCE.mdfor complete documentation and examples
-
Form Filter Dropdown: Visible dropdown selector to filter logs by Contact Form 7 form
- Dropdown appears in filter controls between Status and Date filters
- Lists all forms that have at least one log entry
- Shows "All Forms" default option to display logs from all forms
- Gracefully handles deleted forms (displays as "Form #123")
- Auto-submits on selection for immediate filtering (no button click needed)
- Active filter tag shows selected form with individual remove capability
- Filter persists across pagination and combines with status/date filters
- Alphabetically ordered by form title for easy navigation
- New
LogReader::get_forms_with_logs()method retrieves distinct forms with logs - Comprehensive unit test coverage (6 tests for all scenarios)
CF7 to API v2.0.0
Immutable
release. Only release title and notes can be modified.
Added
- MVC Architecture: Complete restructuring following Model-View-Controller principles
- Model Layer: Type-safe domain models (
LogEntry,FormSettings,ApiResponse,Statistics) - Repository Layer: Data access interfaces (
LogRepositoryInterface,SettingsRepositoryInterface) - Controller Layer: Request routing and hook management
Controller/Admin/LogsController: Admin logs page routingController/ContactForm/SubmissionController: Form submission handling
- Service Layer: Business logic separated from controllers
Service/Logging/: LogWriter, LogReader, LogStatistics, RetryManagerService/Security/: EncryptionService, SensitiveDataPatternsService/ContactForm/SubmissionProcessor: API communication logic
- View Layer: Reusable partials for maintainability
View/Admin/Logs/Partials/: StatisticsPartial, DateFilterPartial, ExportButtonsPartialView/Admin/Settings/Partials/GlobalSettingsPartial
- Config Layer: Centralized configuration (
Config/Settings)
- Model Layer: Type-safe domain models (
- Unresolved Errors Filter: New filter to show only errors that haven't been successfully retried
- "Unresolved" tab in logs table shows errors pending resolution
- "All Errors" renamed to distinguish from unresolved filter
- Error resolution counts displayed in filter badges
- Search by Sender Name/Lastname: Extended search functionality to filter logs by sender name
- Search now includes name and lastname fields from form submissions
- Respects anonymization rules: fields marked as sensitive via settings are excluded from search
- Maintains existing SQL-based search for endpoint and error_message (full dataset)
- PHP-based filtering for name/lastname applied to the first 5,000 logs in the current sort order; on sites with more than 5,000 logs, name/lastname searches may not include older matches
Changed
- Visual Resolved Indicator: Errors with successful retries now show a "Resolved" badge
- Green badge appears next to error status when retry was successful
- Tooltip explains the error was resolved via manual retry
- Makes it easy to identify resolved errors at a glance
Developer
- New Service Classes: Specialized services following Single Responsibility Principle
Service\Logging\LogWriter: Log creation, updates, deletion with encryptionService\Logging\LogReader: Log retrieval with decryptionService\Logging\LogStatistics: Statistics and metrics calculationsService\Logging\RetryManager: Retry management and error resolution trackingService\ContactForm\SubmissionProcessor: Form submission business logic
- New Model Classes: Type-safe domain models with full PHPStan Level 8 compliance
Model\LogEntry: API request log representationModel\FormSettings: Form configurationModel\ApiResponse: API response dataModel\Statistics: Aggregated statistics
- Exception Classes: Custom exceptions for better error handling
Exception\ApiException: API-related errorsException\ValidationException: Validation errors with detailed tracking
- PSR-4 Namespace Organization: Proper directory structure
Service\Security\*: Security-related servicesConfig\Settings: Configuration management
- Architecture Documentation: See
docs/ARCHITECTURE.mdfor complete structure - Migration Guide: See
docs/UPGRADE.mdfor 2.0.0 migration instructions
Notes
- Quality Gates: PHPCS WordPress-Extra (0 errors) and PHPStan Level 8 (0 errors) compliance
- All logging functionality migrated to dedicated services in
Service\Logging\ - See
docs/UPGRADE.mdfor migration guidance
CF7 to API v1.3.13
Immutable
release. Only release title and notes can be modified.
Added
- New "From" Column in Logs Table (#54): Quick sender identification without opening log details
- Displays sender name and masked email (e.g.,
John Doe <jo***@example.com>) - Extracts data from common form fields (name, firstname, your-name, email, your-email, etc.)
- Email masking preserves privacy while allowing identification
- Shows "Unknown" when sender info cannot be extracted
- Displays sender name and masked email (e.g.,
Changed
- Renamed "Form" Column to "Channel" (#54): Better reflects the source/channel of submission
- Improved Endpoint Column (#54): Fixed width with CSS text-overflow ellipsis
- Full URL visible on hover via title attribute
- Cleaner table layout without PHP-based truncation
Fixed
- Empty Status Filter Bug (#54): Fixed table showing no results when URL has empty status parameter
- Added
! empty()check to prevent filtering with empty string - URLs like
?status&date_filternow work correctly
- Added
- Status Filter Auto-Submit (#54): Status dropdown now submits form automatically on change
- "All Time" Date Filter Auto-Submit (#54): Previously only non-empty filter values triggered auto-submit
CF7 to API v1.3.11
Immutable
release. Only release title and notes can be modified.