You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: CHANGELOG.md
+42-51Lines changed: 42 additions & 51 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -7,6 +7,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
8
8
## [Unreleased]
9
9
10
+
### Added
11
+
12
+
### Changed
13
+
14
+
### Fixed
15
+
16
+
### Security
17
+
18
+
## [1.1.3] - 2026-07-21
19
+
10
20
### Added
11
21
-**JWT-authenticated REST API for campaign scheduling (#118)**
12
22
- New `mail-system/v1` REST namespace: `GET /lists`, `POST /campaigns`, `GET /campaigns/{id}`, and `POST /campaigns/{id}/cancel`
@@ -43,23 +53,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
43
53
- Records the first open timestamp and total pixel load count without storing IP addresses or user-agent data
44
54
- Shows unique opens, open rates, and per-recipient sent/open timestamps in the Queue overview and campaign detail screens
45
55
- Includes a database upgrade to schema version 1.7.0, unit coverage, and an in-product caveat explaining image blocking, privacy proxy, and prefetch limitations
46
-
47
-
### Fixed
48
-
-**Bulk actions Apply button not showing** — on the Subscribers page, if a browser restored the bulk actions dropdown's previous value on page load/refresh without firing a `change` event, the Apply button stayed hidden even though a bulk action was selected and subscribers were checked. The button's visibility is now synced on page load, not only on `change`.
49
-
-**Opt-in confirmation email wrappers** — confirmation emails now apply the configured email header and footer and replace wrapper template variables (`{first_name}`, `{last_name}`, `{email}`, `{unsubscribe_link}`, `{unsubscribe_url}`) before sending.
50
-
-**SMTP password encryption delimiter handling** — encrypted payloads now encode the IV separately before adding the delimiter and still support legacy raw-IV payloads, preventing rare decrypt failures when random IV bytes contained the delimiter sequence.
51
-
-**Database repair notice persisting infinitely** — when clicking "Repair Database Now", if the required database table or column did not exist (or `ALTER TABLE` silently failed), the repair notice was shown on every page load indefinitely. The handler now calls `MSKD_Activator::activate()` (which uses `dbDelta` to create missing tables and columns), verifies the schema afterwards, and — if still failing — shows an actionable error notice with the database error message. The schema check also now correctly detects a missing table (not just a missing column).
52
-
-**Scheduling/queue timezone mixing** — the scheduling and queue system wrote datetimes from three different bases (WP-local `current_time`, UTC `gmdate`, and the MySQL `CURRENT_TIMESTAMP` default), then compared and rendered them as if identical. On sites whose WordPress timezone differs from UTC, this produced a phantom offset between the Queue "Created" and "Scheduled for" columns and broke retry/stuck-recovery timing (retries landed in the past and fired immediately). Retry `scheduled_at` and the stuck-recovery threshold now use the new site-local `mskd_local_time_from_timestamp()` helper, and campaign/queue `created_at` is set explicitly via `mskd_current_time_normalized()` instead of the DB-server-timezone default, so all writes, comparisons, and display share one convention.
53
-
-**Email preview opening in a new tab** — email preview forms (campaign/queue detail and compose wizard) targeted a runtime-generated browsing-context name and then renamed the iframe to match, which is racy and often failed to bind, causing the preview to open in a new tab instead of inline. Preview iframes now render a stable server-side `name`, and the hidden preview form submits to that existing target.
54
-
55
-
### Changed
56
-
-**Renamed plugin slug** from `mail-system-by-katsarov-design` to `mail-system`. Updated main plugin file, all language files (`.pot`, `.po`, `.mo`), text domain references across all PHP source files, `package.json`, `bin/create-release.sh`, and documentation headers. DB table names, option keys, hooks, and constants are unchanged.
57
-
-**Delete Inactive Subscribers button** now also deletes subscribers with `unsubscribed` status, in addition to `inactive` (unconfirmed). Updated button description, confirmation dialog, and success messages accordingly. Translations updated for Bulgarian and German.
58
-
59
-
### Fixed
60
-
- Fixed undefined variable `$class` (should be `$class_name`) in test bootstrap autoloader, which caused PHP 8.1 test failures due to undefined variable warnings being converted to exceptions.
61
-
62
-
### Added
63
56
-**Bulk Subscriber Status Actions**
64
57
- New "Set active" and "Set inactive" options in the bulk actions dropdown on the Subscribers page
65
58
- Available whenever there are editable database subscribers to select, even if no lists exist yet
@@ -86,15 +79,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
86
79
- Proper database cleanup (subscribers, list associations, and queue items)
87
80
- Full translations in Bulgarian and German with pluralization support
88
81
82
+
### Changed
83
+
-**Renamed plugin slug** from `mail-system-by-katsarov-design` to `mail-system`. Updated main plugin file, all language files (`.pot`, `.po`, `.mo`), text domain references across all PHP source files, `package.json`, `bin/create-release.sh`, and documentation headers. DB table names, option keys, hooks, and constants are unchanged.
84
+
-**Delete Inactive Subscribers button** now also deletes subscribers with `unsubscribed` status, in addition to `inactive` (unconfirmed). Updated button description, confirmation dialog, and success messages accordingly. Translations updated for Bulgarian and German.
85
+
89
86
### Fixed
90
-
-**Compose Wizard Step 1 Validation**
91
-
- Fixed bug where "Please select at least one list" alert incorrectly appeared when clicking Continue in step 1
92
-
- List validation now only triggers in step 3 where list selection is available
87
+
-**Bulk actions Apply button not showing** — on the Subscribers page, if a browser restored the bulk actions dropdown's previous value on page load/refresh without firing a `change` event, the Apply button stayed hidden even though a bulk action was selected and subscribers were checked. The button's visibility is now synced on page load, not only on `change`.
88
+
-**Opt-in confirmation email wrappers** — confirmation emails now apply the configured email header and footer and replace wrapper template variables (`{first_name}`, `{last_name}`, `{email}`, `{unsubscribe_link}`, `{unsubscribe_url}`) before sending.
89
+
-**SMTP password encryption delimiter handling** — encrypted payloads now encode the IV separately before adding the delimiter and still support legacy raw-IV payloads, preventing rare decrypt failures when random IV bytes contained the delimiter sequence.
90
+
-**Database repair notice persisting infinitely** — when clicking "Repair Database Now", if the required database table or column did not exist (or `ALTER TABLE` silently failed), the repair notice was shown on every page load indefinitely. The handler now calls `MSKD_Activator::activate()` (which uses `dbDelta` to create missing tables and columns), verifies the schema afterwards, and — if still failing — shows an actionable error notice with the database error message. The schema check also now correctly detects a missing table (not just a missing column).
91
+
-**Scheduling/queue timezone mixing** — the scheduling and queue system wrote datetimes from three different bases (WP-local `current_time`, UTC `gmdate`, and the MySQL `CURRENT_TIMESTAMP` default), then compared and rendered them as if identical. On sites whose WordPress timezone differs from UTC, this produced a phantom offset between the Queue "Created" and "Scheduled for" columns and broke retry/stuck-recovery timing (retries landed in the past and fired immediately). Retry `scheduled_at` and the stuck-recovery threshold now use the new site-local `mskd_local_time_from_timestamp()` helper, and campaign/queue `created_at` is set explicitly via `mskd_current_time_normalized()` instead of the DB-server-timezone default, so all writes, comparisons, and display share one convention.
92
+
-**Email preview opening in a new tab** — email preview forms (campaign/queue detail and compose wizard) targeted a runtime-generated browsing-context name and then renamed the iframe to match, which is racy and often failed to bind, causing the preview to open in a new tab instead of inline. Preview iframes now render a stable server-side `name`, and the hidden preview form submits to that existing target.
93
+
- Fixed undefined variable `$class` (should be `$class_name`) in test bootstrap autoloader, which caused PHP 8.1 test failures due to undefined variable warnings being converted to exceptions.
94
+
-**Compose Wizard Step 1 Validation** — fixed bug where "Please select at least one list" alert incorrectly appeared when clicking Continue in step 1. List validation now only triggers in step 3 where list selection is available.
93
95
94
96
## [1.1.1] - 2025-12-19
95
97
96
98
### Added
97
-
98
99
-**Lists Column in Subscribers Page** (Issue #84)
99
100
- New "Lists" column displaying which list(s) each subscriber belongs to
100
101
- Multiple lists are stacked vertically for easy readability
@@ -150,11 +151,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
150
151
- Fixed variable naming to avoid overriding WordPress globals
151
152
- Fixed indentation (spaces to tabs) in admin partials
152
153
- Added proper Yoda condition checks
153
-
154
-
### Performance
155
-
- Improved performance when handling large email campaigns through batch processing
156
-
- Reduced database queries by batching operations
157
-
- Prevents memory issues when processing large subscriber lists
154
+
-**Performance improvements**
155
+
- Improved performance when handling large email campaigns through batch processing
156
+
- Reduced database queries by batching operations
157
+
- Prevents memory issues when processing large subscriber lists
158
158
159
159
### Fixed
160
160
-**Dedupe Subscribers in Campaign Queue**
@@ -187,6 +187,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
187
187
- Fixed duplicate message definitions in `bg_BG.po` and `de_DE.po` preventing compilation
188
188
- Corrected corrupted headers in German translation file
189
189
- Recompiled MO files for both languages
190
+
-**Missing Translation**
191
+
- Added missing translation for "Total Subscribers" in Bulgarian language
192
+
-**Corrupted Bulgarian Translations** (PR #90)
193
+
- Removed msgcat merge markers that were showing in the UI
194
+
- Cleaned 9 translation entries with embedded `#-#-#-#-#` markers
195
+
- Recompiled Bulgarian MO file
190
196
191
197
### Security
192
198
-**Critical XSS Vulnerability Fix**
@@ -201,21 +207,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
201
207
- Fixed unsanitized GET parameters in nonce verification
202
208
- Improved REMOTE_ADDR handling with proper validation
203
209
204
-
### Fixed
205
-
-**Missing Translation**
206
-
- Added missing translation for "Total Subscribers" in Bulgarian language
207
-
-**Corrupted Bulgarian Translations** (PR #90)
208
-
- Removed msgcat merge markers that were showing in the UI
209
-
- Cleaned 9 translation entries with embedded `#-#-#-#-#` markers
210
-
- Recompiled Bulgarian MO file
211
-
212
-
### Planned
213
-
- Open and click statistics
214
-
- A/B testing
215
-
- Integration with popular SMTP plugins
216
-
217
-
---
218
-
219
210
## [1.1.0] - 2025-11-28
220
211
221
212
### Added
@@ -319,15 +310,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
319
310
- Dashboard with general statistics
320
311
- WP-Cron warning (shown only within the plugin)
321
312
- System cron recommendation
322
-
323
-
### Technical Details
324
-
- Requires PHP 7.4+
325
-
- Requires WordPress 5.0+
326
-
- Uses SMTP for sending (configurable)
327
-
- 4 new database tables (mskd_subscribers, mskd_lists, mskd_subscriber_list, mskd_queue)
328
-
- Automatic table creation on activation
329
-
- Automatic cron job scheduling on activation
330
-
- Automatic cron job removal on deactivation
313
+
-**Technical requirements**
314
+
- Requires PHP 7.4+
315
+
- Requires WordPress 5.0+
316
+
- Uses SMTP for sending (configurable)
317
+
- 4 new database tables (mskd_subscribers, mskd_lists, mskd_subscriber_list, mskd_queue)
318
+
- Automatic table creation on activation
319
+
- Automatic cron job scheduling on activation
320
+
- Automatic cron job removal on deactivation
331
321
332
322
---
333
323
@@ -337,7 +327,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
337
327
-**Minor** (0.X.0) - New features, backward compatible
0 commit comments