WordPress cron not working: schedule AI video jobs reliably

WP-Cron runs only when someone loads a page. Trigger wp-cron.php from a system cron so scheduled AI video jobs start on time.

5 min readSume
All posts

WordPress cron often looks broken because WP-Cron isn't a clock. WordPress's plugin handbook says it checks the list of scheduled tasks on every page load and runs what's due during that load, so a task set for 2:00 PM waits until the next visit. To make it run on time, call wp-cron.php from your system's scheduler and set DISABLE_WP_CRON to true in wp-config.php.

WordPress facts come from the plugin handbook's WP-Cron overview, system task scheduler and testing pages and the wp_schedule_single_event() reference, read 2026-09-29. For AI video, the same point matters twice: a cron task should only start work or check on it, and Sume's Jobs and results page says video jobs routinely outlast any request you could hold open.

Why is my WordPress cron job not running on time?

Because nothing wakes it up. The handbook says WP-Cron isn't constant like the system cron and is only triggered on page load, and gives the example that a task scheduled for 2:00 PM won't run if no page loads happen until 5:00 PM. A site with few visits can therefore run tasks late. The task isn't lost: the handbook says scheduled tasks go into a queue and run at the next opportunity, meaning the next page load.

How do I make WP-Cron run on a real schedule?

Do the two steps from the handbook: schedule a system task that makes a web request to wp-cron.php, then disable the per-page-load trigger so the work doesn't run twice. On Linux and macOS the handbook uses crontab -e with wget --delete-after; on Windows it uses a Task Scheduler task with PowerShell's Invoke-WebRequest.

From WordPress's system task scheduler and WP-Cron overview pages, read 2026-09-29.
SetupWhen scheduled tasks run
Default WP-CronDuring a page load, once the task is due
System task calling wp-cron.phpWhenever your system scheduler makes the request
System task plus DISABLE_WP_CRONOnly from the system task; page loads stop triggering cron
# wp-config.php
define( 'DISABLE_WP_CRON', true );

# crontab -e   (every 15 minutes; replace the host)
*/15 * * * * wget --delete-after http://YOUR_SITE_URL/wp-cron.php

Why does my single scheduled event never fire twice?

wp_schedule_single_event() ignores an event scheduled within 10 minutes of an existing event with the same hook, unless you pass unique $args for each event. The reference says the args identify the event, so events for different jobs should carry the job id. The reference also says to use wp_next_scheduled() to prevent duplicate events. Scheduling one check per Sume job, with the job id as the argument, fits that rule.

// Check this job again in 10 minutes. The job id makes the event unique.
wp_schedule_single_event( time() + 600, 'acme_check_sume_job', array( $job_id ) );

add_action( 'acme_check_sume_job', function ( $job_id ) {
  // GET the job's polling URL with your Bearer key (server-side only).
  // Terminal? Store the result. Otherwise schedule the next check.
} );

What should a scheduled task do with a video job?

Start it, or check on it. Don't wait inside the task. Sume's docs say a 30-second wait budget isn't a job duration and that video jobs routinely don't finish inside it, and they recommend async polling or a webhook for work that outlasts 30 seconds. So the task submits the job with an Idempotency-Key built from something stable, because a cron task can run again after a failure: the docs say a same-key retry returns the original job instead of billing a second one.

Pass a callback_url so Sume tells you when the job is terminal. Keep a status check like the one above as the backup: the Webhooks page says a webhook is never the only recovery path.

How do I test that cron fires?

The handbook says you can test cron jobs with WP-CLI: wp cron event list shows what's scheduled and wp cron event run {job name} runs one now. Run the event by hand once before you trust the schedule.

Sources

Related posts

More in Integrations

All Integrations posts

Written by Sume