From 768bbfbdd287c8aaf7b5cdb588b8dceb0d43f525 Mon Sep 17 00:00:00 2001 From: Javier Casares Date: Wed, 18 Feb 2026 16:09:17 +0000 Subject: [PATCH] v2.2.8 --- admin/class-settings-page.php | 97 +++++++++++++++++++++++++++++++---- changelog.txt | 9 ++++ readme.txt | 21 ++++++-- robotstxt-smtp-newsletter.php | 4 +- update.json | 10 ++-- worker.php | 43 +++++++++++----- 6 files changed, 150 insertions(+), 34 deletions(-) diff --git a/admin/class-settings-page.php b/admin/class-settings-page.php index 66f35dc..f006900 100644 --- a/admin/class-settings-page.php +++ b/admin/class-settings-page.php @@ -339,12 +339,64 @@ class Settings_Page { */ public function render_batch_size_field() { $options = get_option( self::OPTION_NAME, array() ); - $batch_size = $options['batch_size'] ?? 10; + $batch_size = absint( $options['batch_size'] ?? 10 ); ?>

-
- + +

+ + + + + + + + + + + + + + + + + 0 ) : ?> + + + + + + + +
+ + + + + +
10 + + + ← + + + +
10 + + ← + + +
+

+
+

-

+

+ + +

+ + + + + + + + + + + + + + +
10
+ (10 × ) +

- +

- php 10 "w1" --url="" + php "w1" --url=""

- seq 1 10 | xargs -P10 -I{} php 10 "w{}" --url="" + seq 1 10 | xargs -P10 -I{} php "w{}" --url=""

@@ -525,12 +600,12 @@ class Settings_Page {

- php 10 "w1" + php "w1"

- seq 1 10 | xargs -P10 -I{} php 10 "w{}" + seq 1 10 | xargs -P10 -I{} php "w{}" diff --git a/changelog.txt b/changelog.txt index 8cecb95..7db1410 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,9 +1,18 @@ += 2.2.8 = + +* CHANGED: Batch Size is now read from the plugin settings database — workers no longer require it as a command-line argument +* CHANGED: Worker command simplified: php worker.php "w1" (batch_size argument removed) +* IMPROVED: Batch Size field now shows a throughput table (10 workers × N emails = simultaneous emails) +* IMPROVED: Worker section in settings shows the calculated simultaneous email count based on current settings +* TECHNICAL: Legacy command format (php worker.php 10 "w1") still accepted with a deprecation warning + = 2.2.7 = * IMPROVED: Worker now runs as a continuous loop, draining the queue completely before exiting * IMPROVED: Statistics are synced after each batch (not only at the end) * IMPROVED: Worker output includes worker ID on each line for clearer parallel logs * FIXED: Uneven work distribution between parallel workers +* INVESTIGATING: Possible incompatibility with the Redirection plugin in MultiSite environments - output buffering mitigates known symptoms while investigation is ongoing = 2.2.6 = diff --git a/readme.txt b/readme.txt index ce00668..c068872 100644 --- a/readme.txt +++ b/readme.txt @@ -4,7 +4,7 @@ Tags: newsletter, smtp, email, bulk, queue, worker, amazonses, statistics Requires at least: 4.7 Tested up to: 6.9 Requires PHP: 7.2 -Stable tag: 2.2.7 +Stable tag: 2.2.8 License: GPLv2 or later License URI: https://www.gnu.org/licenses/gpl-2.0.html @@ -70,15 +70,17 @@ SMTP (by ROBOTSTXT) Newsletter connects your Newsletter plugin with ROBOTSTXT SM Set up a cron job or process supervisor to run the worker: Single worker: -`* * * * * php /path/to/wp-content/plugins/robotstxt-smtp-newsletter/worker.php 10 "w1"` +`* * * * * php /path/to/wp-content/plugins/robotstxt-smtp-newsletter/worker.php "w1"` Parallel processing (10 workers): -`* * * * * seq 1 10 | xargs -P10 -I{} php /path/to/worker.php 10 "w{}"` +`* * * * * seq 1 10 | xargs -P10 -I{} php /path/to/worker.php "w{}"` + +Workers read the Batch Size directly from the plugin settings database. With 10 parallel workers each picking up N emails, the total simultaneous throughput is 10 × N emails. **For WordPress MultiSite:** Workers require the --url parameter to specify which site to process: -`* * * * * php /path/to/worker.php 10 "w1" --url="https://site.example.com"` +`* * * * * php /path/to/worker.php "w1" --url="https://site.example.com"` See Settings → SMTP → Queue Worker Configuration for detailed commands tailored to your installation. @@ -139,8 +141,19 @@ In typical scenarios, you'll see 20-30x performance improvement. For example: Yes. The plugin integrates with ROBOTSTXT SMTP rate limiting system to ensure you don't exceed your provider's limits. += Is the Redirection plugin compatible? = + +A possible incompatibility with the Redirection plugin is currently under investigation. When Redirection is active in a MultiSite environment, it may issue HTTP redirect headers during WordPress initialization, which can interfere with CLI worker processes. The worker uses output buffering to mitigate known symptoms. If you experience issues with the worker on a site running the Redirection plugin, please report them at the support link below. + == Changelog == += 2.2.8 = +* CHANGED: Batch Size is now read from plugin settings database — no longer passed as a command-line argument to the worker +* CHANGED: Worker command simplified to: php worker.php "w1" (no batch_size argument needed) +* IMPROVED: Batch Size field shows a throughput table: 10 workers × N emails = simultaneous emails +* IMPROVED: Worker section displays the current calculated simultaneous email count +* TECHNICAL: Legacy format (php worker.php 10 "w1") still supported with a deprecation warning + = 2.2.7 = * IMPROVED: Worker now runs as a continuous loop, draining the queue completely before exiting * IMPROVED: Statistics are synced after each batch diff --git a/robotstxt-smtp-newsletter.php b/robotstxt-smtp-newsletter.php index 1169fd8..2a0ea4b 100644 --- a/robotstxt-smtp-newsletter.php +++ b/robotstxt-smtp-newsletter.php @@ -3,7 +3,7 @@ * Plugin Name: Newsletter - SMTP (by ROBOTSTXT) * Plugin URI: https://git.robotstxt.es/ROBOTSTXT/robotstxt-smtp-newsletter * Description: Integrates ROBOTSTXT SMTP configuration with Newsletter plugin for efficient bulk email delivery with database-backed queue and external workers. - * Version: 2.2.7 + * Version: 2.2.8 * Requires at least: 4.7 * Requires PHP: 7.2 * Security: robotstxt@robotstxt.es @@ -25,7 +25,7 @@ if ( ! defined( 'ABSPATH' ) ) { } // Plugin constants. -define( 'ROBOTSTXT_SMTP_NEWSLETTER_VERSION', '2.2.7' ); +define( 'ROBOTSTXT_SMTP_NEWSLETTER_VERSION', '2.2.8' ); define( 'ROBOTSTXT_SMTP_NEWSLETTER_FILE', __FILE__ ); define( 'ROBOTSTXT_SMTP_NEWSLETTER_PATH', plugin_dir_path( __FILE__ ) ); define( 'ROBOTSTXT_SMTP_NEWSLETTER_URL', plugin_dir_url( __FILE__ ) ); diff --git a/update.json b/update.json index 1ef8fbc..7fc4501 100644 --- a/update.json +++ b/update.json @@ -1,19 +1,19 @@ { "name": "Newsletter - SMTP (by ROBOTSTXT)", "slug": "robotstxt-smtp-newsletter", - "version": "2.2.7", + "version": "2.2.8", "author": "ROBOTSTXT", "homepage": "https://git.robotstxt.es/ROBOTSTXT/robotstxt-smtp-newsletter", - "download_url": "https://git.robotstxt.es/ROBOTSTXT/robotstxt-smtp-newsletter/releases/download/2.2.7/robotstxt-smtp-newsletter-2.2.7.zip", + "download_url": "https://git.robotstxt.es/ROBOTSTXT/robotstxt-smtp-newsletter/releases/download/2.2.8/robotstxt-smtp-newsletter-2.2.8.zip", "requires": "4.7", "tested": "6.9", "requires_php": "7.2", "last_updated": "2026-02-18", - "description": "Integrates ROBOTSTXT SMTP configuration with Newsletter plugin for reliable bulk email delivery with database-backed queue and external workers. Workers now run as continuous loops draining the full queue, with balanced distribution across parallel workers.", - "changelog": "

2.2.7 - 2026-02-18

2.2.6 - 2026-02-16

2.2.5 - 2026-02-16

2.2.4 - 2026-02-16

2.2.3 - 2026-02-16

2.2.2 - 2026-02-16

2.2.1 - 2026-02-16

2.2.0 - 2026-02-16

2.1.0 - 2026-02-09

2.0.1 - 2026-01-29

2.0.0 - 2026-01-29

1.0.0 - 2026-01-29

", + "description": "Integrates ROBOTSTXT SMTP configuration with Newsletter plugin for reliable bulk email delivery with database-backed queue and external workers. Batch size is configured in settings and read automatically by workers — no command-line argument needed.", + "changelog": "

2.2.8 - 2026-02-18

2.2.7 - 2026-02-18

2.2.6 - 2026-02-16

2.2.5 - 2026-02-16

2.2.4 - 2026-02-16

2.2.3 - 2026-02-16

2.2.2 - 2026-02-16

2.2.1 - 2026-02-16

2.2.0 - 2026-02-16

2.1.0 - 2026-02-09

2.0.1 - 2026-01-29

2.0.0 - 2026-01-29

1.0.0 - 2026-01-29

", "sections": { "description": "Integrates ROBOTSTXT SMTP configuration with Newsletter plugin for reliable bulk email delivery with database-backed queue and external workers. Workers now run as continuous loops draining the full queue, with balanced distribution across parallel workers.", - "changelog": "

2.2.7 - 2026-02-18

2.2.6 - 2026-02-16

2.2.5 - 2026-02-16

2.2.4 - 2026-02-16

2.2.3 - 2026-02-16

2.2.2 - 2026-02-16

2.2.1 - 2026-02-16

2.2.0 - 2026-02-16

" + "changelog": "

2.2.8 - 2026-02-18

2.2.7 - 2026-02-18

2.2.6 - 2026-02-16

2.2.5 - 2026-02-16

2.2.4 - 2026-02-16

2.2.3 - 2026-02-16

2.2.2 - 2026-02-16

2.2.1 - 2026-02-16

2.2.0 - 2026-02-16

" }, "banners": { "low": "", diff --git a/worker.php b/worker.php index 9cb5b24..cb7cdcf 100644 --- a/worker.php +++ b/worker.php @@ -7,12 +7,17 @@ * * This script runs as a standalone CLI process, independent of WordPress cron. * It loads WordPress with DOING_CRON defined to prevent triggering actual cron. + * Batch size is read from the plugin settings in the database — no need to pass it + * as a command-line argument. * - * Usage: php worker.php [--url=] - * Example: php worker.php 10 "w1" - * MultiSite: php worker.php 10 "w1" --url="https://example.com" - * Parallel: seq 1 10 | xargs -P10 -I{} php worker.php 10 "w{}" - * Parallel MultiSite: seq 1 10 | xargs -P10 -I{} php worker.php 10 "w{}" --url="https://example.com" + * Usage: php worker.php [--url=] + * Example: php worker.php "w1" + * MultiSite: php worker.php "w1" --url="https://example.com" + * Parallel: seq 1 10 | xargs -P10 -I{} php worker.php "w{}" + * Parallel MS: seq 1 10 | xargs -P10 -I{} php worker.php "w{}" --url="https://example.com" + * + * Legacy format (deprecated, still supported): + * php worker.php [--url=] * * @package ROBOTSTXT_SMTP_Newsletter * @since 2.2.0 @@ -28,19 +33,29 @@ if ( php_sapi_name() !== 'cli' ) { } // Parse command-line arguments. -if ( $argc < 3 ) { - fwrite( STDERR, "Usage: php worker.php [--url=]\n" ); - fwrite( STDERR, "Example: php worker.php 10 \"w1\"\n" ); - fwrite( STDERR, "MultiSite: php worker.php 10 \"w1\" --url=\"https://example.com\"\n" ); +// New format: php worker.php [--url=] +// Legacy format (deprecated): php worker.php [--url=] +if ( $argc < 2 ) { + fwrite( STDERR, "Usage: php worker.php [--url=]\n" ); + fwrite( STDERR, "Example: php worker.php \"w1\"\n" ); + fwrite( STDERR, "MultiSite: php worker.php \"w1\" --url=\"https://example.com\"\n" ); exit( 1 ); } -$batch_size = max( 1, (int) $argv[1] ); -$worker_id = $argv[2]; +// Detect legacy format: first arg is numeric (old batch_size), second arg is worker_id. +$arg_offset = 2; +if ( is_numeric( $argv[1] ) && $argc >= 3 && 0 !== strpos( $argv[2], '--' ) ) { + // Legacy: php worker.php — batch_size argument is now ignored. + $worker_id = $argv[2]; + $arg_offset = 3; + fwrite( STDERR, "[DEPRECATED] Batch size is now read from plugin settings. Remove the numeric argument from the command.\n" ); +} else { + $worker_id = $argv[1]; +} // Parse optional --url parameter for MultiSite support. $site_url = null; -for ( $i = 3; $i < $argc; $i++ ) { +for ( $i = $arg_offset; $i < $argc; $i++ ) { if ( strpos( $argv[ $i ], '--url=' ) === 0 ) { $site_url = substr( $argv[ $i ], 6 ); break; @@ -126,6 +141,10 @@ if ( $plugin_manually_loaded ) { \Robotstxt_SMTP_Newsletter\Plugin::instance_init(); } +// Read batch size from plugin settings (database). +$plugin_options = get_option( 'robotstxt_smtp_newsletter_options', array() ); +$batch_size = max( 1, (int) ( $plugin_options['batch_size'] ?? 10 ) ); + // Get queue and statistics instances. $queue = \Robotstxt_SMTP_Newsletter\Queue::get_instance(); $stats = \Robotstxt_SMTP_Newsletter\Statistics::get_instance();