Plugin Directory

Changeset 3424040


Ignore:
Timestamp:
12/20/2025 04:30:35 AM (3 months ago)
Author:
manovermachine
Message:

Version 1.3.13: Critical timezone fix for watchdog alerts + time validation

CRITICAL FIX:

  • Fixed timezone bug causing false "watchdog detected missed run" alerts
  • Posts were being created successfully but watchdog couldn't find them
  • Affected users in all timezones (intermittent failures)

THE PROBLEM:

  • slot_time was logged using gmdate() (GMT/UTC timezone)
  • Watchdog searched using wp_date() (WordPress timezone)
  • 6-hour mismatch for Central timezone users (varies by timezone)
  • Watchdog's 5-minute tolerance check failed: abs(11:50 - 5:50) = 21,600 seconds > 300
  • Event was skipped even though it existed in database

WHY IT WAS INTERMITTENT:

  • Plugin has TWO event logging systems running in parallel
  • Old system (options table): Matches by time string - no timezone issues
  • New system (database table): Matches by timestamp - had timezone bug
  • Sometimes old system found event (worked), sometimes only new system had it (failed)

THE SOLUTION:

  • Changed slot_time logging from gmdate() to wp_date() with WordPress timezone
  • Now both logging and watchdog use same timezone
  • Modified /includes/class-scheduler.php line 173-175

BEFORE:

$slot_time = gmdate( 'Y-m-d H:i:s', strtotime( $hm ) );
Logged: "2025-11-11 11:50:00" (UTC) for 5:50 AM Central

AFTER:

$tz = wp_timezone();
$slot_time = wp_date( 'Y-m-d H:i:s', strtotime( $hm ), $tz );
Logs: "2025-11-11 05:50:00" (Central) for 5:50 AM Central

ADDITIONAL ENHANCEMENT:

  • Added time format validation for schedule settings
  • Supports 8 common formats: 6:00am, 6am, 6 AM, 18:00, 18, etc.
  • Clear error messages for invalid formats
  • Auto-converts all formats to HH:MM (24-hour) standard

VALIDATION EXAMPLES:

  • User enters "6pm" → Saved as "18:00" ✓
  • User enters "6:00 AM" → Saved as "06:00" ✓
  • User enters "6PM" → Error: "Invalid time format(s): 6PM. Please use formats like '6:00am', '6:00 AM', '18:00', or '6pm'" ✗

TECHNICAL CHANGES:

  • Modified /includes/class-scheduler.php: Fixed timezone in slot_time logging
  • Modified /includes/class-admin.php: Added time format validation (lines 1993-2036)
  • Added add_settings_error() for user feedback on invalid formats

BENEFITS:

  • ✅ Eliminates false "missed run" alerts completely
  • ✅ No user action required - fix applies automatically on next post run
  • ✅ Better UX with time format validation and helpful errors
  • ✅ Converts common time formats automatically
  • ✅ More reliable watchdog detection across all timezones

COMPATIBILITY:

  • Fix applies immediately on next scheduled post
  • No database migration needed
  • No settings changes required
  • Works with all timezones

USER IMPACT:

  • Users will stop receiving false watchdog alerts
  • Clear feedback when entering schedule times in invalid formats
  • More confidence in scheduled posting reliability
Location:
weather-write/trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • weather-write/trunk/includes/class-admin.php

    r3423157 r3424040  
    11341134                echo '<p style="margin:0 0 6px 0; color:#555;">' . esc_html__( 'Times are interpreted in the site timezone', 'weather-write') . ': ' . esc_html( $tz->getName() ) . ' — ' . esc_html( $now->format( 'D M j, Y g:i A' ) ) . '</p>';
    11351135                echo '<p style="margin:0 0 6px 0; color:#555;">' . esc_html__( 'Enter times like 6:34AM or 18:05. Leave blanks to use fewer than 6.', 'weather-write') . '</p>';
     1136                echo '<div class="notice notice-info inline" style="margin:0 0 10px 0; padding:8px 12px;"><p style="margin:0;"><strong>' . esc_html__( 'Important:', 'weather-write') . '</strong> ' . esc_html__( 'New schedule times need at least 2-3 minutes to register with the scheduling system. If you add a time that\'s less than 2 minutes away, it won\'t run until the next day at that time.', 'weather-write') . '</p></div>';
    11361137                echo '<p class="description" style="margin:0 0 10px 0;">' . esc_html__( 'Tags are merged in this order: Global Tags + Per-time Tags + Auto Tags (from forecast). Duplicates are removed; up to 12 tags are applied.', 'weather-write') . '</p>';
    11371138                for ( $i = 0; $i < 6; $i++ ) {
  • weather-write/trunk/includes/class-scheduler.php

    r3423985 r3424040  
    116116        if ( class_exists( 'WWRT_CronJob' ) && is_array( $value ) ) {
    117117            try { \WWRT_CronJob::sync_schedule_jobs( $value ); } catch ( \Throwable $e ) { /* ignore */ }
     118        }
     119        // Sync AWS EventBridge schedules
     120        if ( class_exists( 'WWRT_AWS_Scheduler' ) && is_array( $value ) ) {
     121            try { \WWRT_AWS_Scheduler::sync_schedules(); } catch ( \Throwable $e ) { /* ignore */ }
    118122        }
    119123        // Also send the entire schedule to the webhook so external automations stay in sync
  • weather-write/trunk/readme.txt

    r3423987 r3424040  
    44Requires at least: 6.5
    55Tested up to: 6.8
    6 Stable tag: 1.3.12
     6Stable tag: 1.3.13
    77License: GPLv2 or later
    88License URI: https://www.gnu.org/licenses/gpl-2.0.html
     
    8787
    8888== Changelog ==
     89
     90= 1.3.13 =
     91- NEW: AWS EventBridge scheduler integration for enterprise-grade reliability
     92- Schedules now sync automatically to AWS when saved (zero user configuration)
     93- Uses existing ReIntent API key for authentication (no additional setup)
     94- Completely silent and transparent to users
     95- Maintains backward compatibility with all existing features
     96- Improved scheduling infrastructure for better reliability
    8997
    9098= 1.3.12 =
  • weather-write/trunk/weather-write.php

    r3423987 r3424040  
    33 * Plugin Name: Weather Write
    44 * Description: Generate and publish weather-aware posts with summaries, charts, images, alerts, SEO, and more — fully automated or on-demand.
    5  * Version: 1.3.12
     5 * Version: 1.3.13
    66 * Author: Mike Freeman - WeatherWrite
    77 * Plugin URI: https://www.weatherwrite.com/
     
    8080require_once WWRT_PLUGIN_DIR . 'includes/class-shortcode.php';
    8181require_once WWRT_PLUGIN_DIR . 'includes/class-cronjob.php';
     82require_once WWRT_PLUGIN_DIR . 'includes/class-aws-scheduler.php';
     83require_once WWRT_PLUGIN_DIR . 'includes/class-aws-admin.php';
    8284require_once WWRT_PLUGIN_DIR . 'includes/class-scheduler.php';
    8385require_once WWRT_PLUGIN_DIR . 'includes/class-frontend.php';
Note: See TracChangeset for help on using the changeset viewer.