WordPress schedules jobs, but nothing wakes it up. It checks whether anything is due when someone loads a page - so the schedule is really "the next time a visitor arrives", which is wrong in both directions.

  • A quiet site - no visitors overnight, so backups and publishing scheduled for 3am simply do not happen.
  • A busy site - the check runs on every request, adding work to pages that should be fast.

Turn the fake one off

// wp-config.php
define('DISABLE_WP_CRON', true);

And call it from a real one

*/5 * * * * /usr/bin/php8.3 /var/www/site/wp-cron.php >/dev/null 2>&1

Running the file directly is better than fetching the URL: no HTTP round trip, no web-server timeout, and it works even when the site is behind a password.

Do not disable WP_CRON without adding the real job. Scheduled posts stop publishing, backups stop running, and nothing announces it - the site simply goes quiet.

Check what is scheduled

wp cron event list

A hook you do not recognise, scheduled every minute, is usually a plugin. A queue of overdue events means the cron is not running at all.

Five minutes is a good interval. One minute adds load for no benefit unless something genuinely needs that resolution, and WordPress checks the whole schedule on every call.