Replaces WordPress's option-based cron storage with a dedicated database table for proper task tracking.
WordPress stores all scheduled cron events in a single serialized row in wp_options. This causes problems:
- Concurrency issues — concurrent requests can overwrite each other's changes to the cron array.
- No visibility — events are buried in a serialized blob, making debugging difficult.
- Performance — the entire cron array is loaded and rewritten on every schedule/unschedule operation.
- Unreliable deletion — garbage collection of expired transients and old posts depends on cron events that may be silently lost.
Table Cron tries to solve this by storing each event as its own row in a dedicated database table. See also https://core.trac.wordpress.org/ticket/57271
- Intercepts all cron operations via the official
pre_*filters (pre_schedule_event,pre_unschedule_event, etc.). - Stores individual events in a
{prefix}_crontable instead of a serializedwp_optionsrow. - Fully backwards-compatible with
wp_schedule_event(),wp_schedule_single_event(), and all standard cron APIs. - On activation, migrates existing option-based events into the table.
- On deactivation, migrates events back and drops the table.
- Admin page — View all scheduled cron tasks under Tools > Cron Tasks, with overdue indicators and the ability to delete individual events.
- Core event protection — WordPress core cron hooks are locked and cannot be deleted from the admin UI.
- Nice schedule names — The admin page shows human-readable schedule labels (e.g. "Once Hourly") instead of internal names.
- Duplicate detection — Prevents scheduling the same single event twice within a 10-minute window.
last_runtracking — Records when each event was last picked up for execution.- Multisite compatible — Works on both single site and multisite installs.
- WordPress 6+
- PHP 8+
- MySQL 5.7+ or MariaDB 10.2+
- Upload the
table-cronfolder to/wp-content/plugins/. - Activate the plugin through the Plugins menu.
- Done — existing cron events are automatically migrated.
When deactivated, all events are migrated back to the wp_options cron row and the table is dropped. No data is lost.
GPL-2.0-or-later