Scheduled tasks

WordPress runs Quickmunch's scheduled jobs for you. On a quiet site, one server cron entry keeps them on time.

Tools → Site Health  ·  WooCommerce → Status → Scheduled Actions

How WordPress runs them

WordPress has its own scheduler, WP-Cron, and it needs no setup. Every time somebody loads a page, WordPress checks whether a job is due and runs it. On a busy site that is as good as on time. On a quiet one — a new site, a small town, the middle of the night — a due job waits for the next visitor, and that can be hours.

Email does not depend on it. Order confirmations, status updates and password resets leave the moment they happen. If mail is not arriving, the scheduler is not the cause — see Troubleshooting.

What runs, and when

JobRunsWhat it does
Billing sweepDailyRenews the plan terms that renew themselves, opens a grace period when a renewal fails, and ends the terms that have lapsed — dropping the venue back to its plan's allowance, taking its sponsored placement out of rotation, and telling the owner.
Text message log clean-upDailyDeletes SMS log entries older than 30 days, so the log never grows without end.
WooCommerce's own jobsAs each is dueCancelling unpaid orders once the hold-stock time passes, clearing expired sessions, and the background work some payment gateways do. Listed under WooCommerce → Status → Scheduled Actions.

Renewals run before lapses on purpose: a term that renews itself must never be seen by the step that ends terms, and a term whose renewal just failed opens its grace period before anything else looks at it.

Make them run on time

Optional, and worth doing on any site that is not busy around the clock. It swaps "when somebody visits" for "every five minutes, whoever visits".

  1. Stop WordPress checking on page loads. In wp-config.php, above the line that reads That's all, stop editing!, add:
    define( 'DISABLE_WP_CRON', true );
  2. Call it from the server instead. In your hosting control panel (Cron Jobs), add one entry that runs every five minutes:
    */5 * * * * wget -q -O - "https://example.com/wp-cron.php?doing_wp_cron" >/dev/null 2>&1
    If your host blocks wget, run the file with PHP instead:
    */5 * * * * cd /path/to/your/site && php wp-cron.php >/dev/null 2>&1
Do both steps or neither. Step one on its own switches the scheduler off and puts nothing in its place — no job runs at all.

Every job checks whether it is due, so a single five-minute entry is enough for all of them; the daily jobs still run once a day.

How to tell it is working

  • Tools → Site Health checks scheduled events and warns when one is late or has failed.
  • WooCommerce → Status → Scheduled Actions lists WooCommerce's jobs, with tabs for Pending, Complete and Failed.
  • With WP-CLI, wp cron event list shows every scheduled job and when it is next due, and wp cron event run --due-now runs whatever is due.
Running too often is safe. Every job is written to be safe to repeat: it picks up the work still outstanding rather than assuming the last run finished.

When it doesn't work

A plan that should have ended is still active

The billing sweep has not run yet. On a quiet site that can take a while — add the server cron entry above.

Unpaid orders are never cancelled

Check WooCommerce → Settings → Products → Inventory → Hold stock has a value; with it empty, WooCommerce never cancels anything. Then check scheduled jobs are running at all.

You added DISABLE_WP_CRON and now nothing runs

The server cron entry is missing or failing. Check the address is your site's own, or — for the PHP form — that the path is absolute and the PHP binary is the right one; some hosts need a specific binary such as /usr/local/bin/php82 rather than plain php.