This document discusses WordPress cron (WP_Cron) and how it can be used to schedule tasks in WordPress. It notes that WP_Cron works on all systems including Windows and when cron access is not available. The basics of using WP_Cron are covered, including scheduling events with wp_schedule_event() and specifying the timestamp, recurrence, hook, and optional arguments. Some limitations of WP_Cron are mentioned, such as it only running when the site receives traffic and possible race conditions with concurrent cron jobs. Ways to work around these limitations are proposed, such as using an external ping service or limiting cron threads.
2. Chris Klosowski
• Plugin Developer (WP-Push.com, PostPromoterPro.com,
GitHub, WordPress.org)
• Contributing Developer and Support Tech for Easy Digital
Downloads
• Hang out with my Wife and Kid
@cklosowski cklosows
4. What is “Cron”
• A time-based job scheduler in Unix-like computer
operating systems.
• Used to schedule jobs (commands or shell scripts) to run
periodically at fixed times, dates, or intervals.
• Cleanup, populate data into cache, etc.
6. WP_Cron vs Cron
• Works on Windows based systems
• Works when you don’t have access to cron
• Easily allows access to the WordPress core
• “Reliably” available to Theme and Plugin developers
9. $timestamp
• The first time you want this item to run
• UNIX Timestamp format
• Always in UTC (not localized timezone)
• Use time(); as it uses GMT for right now
• No Default
get_option( 'gmt_offset' );
10. $recurrence
• The name of the schedule value
• hourly
• twicedaily
• daily
• Using cron_schedules filter, you can add your own recurrences.
• Not a timestamp, but a string that references a timestamp
• Number of seconds between occurrences
11. $hook
• Essentially does a do_action() when it runs. You would
then attach a function to this hook you’re creating.
• Possible issue on some systems where the hook must
not contain underscores or uppercase characters. (Have
not seen this myself)
12. $args
• Optional array of data to pass through the hook
• Great for when doing post or page specific crons
• Used later when doing lookups for scheduled crons.
• Must be an indexed array (no numeric keys)
13. // Be Kind, Rewind
register_deactivation_hook( __FILE__, 'ck_deactivation' );
function ck_deactivation() {
wp_clear_scheduled_hook( 'ck_hourly_event_hook' );
}
<?php
register_activation_hook( __FILE__, 'ck_activation' );
!
function ck_activation() {
wp_schedule_event( time(), 'hourly', 'ck_hourly_event_hook' );
}
!
add_action( 'ck_hourly_event_hook', 'ck_do_this_hourly' );
function ck_do_this_hourly() {
// do something every hour
}
14. <?php
// Situation of single event
$args = array( 'post_id' => 42, 'service' => 'twitter' );
wp_schedule_single_event( time(), 'ck_single_event', $args );
!
!
// Clear with same hook and EXACT same args
$args2 = array( 'post_id' => 42, 'service' => 'twitter' );
wp_clear_scheduled_hook( 'ck_single_event', $args2 );
16. Because WP_Cron _______________
• Why WP Cron Sucks
http://www.lucasrolff.com/wordpress/why-wp-cron-sucks/
• Disabling WP-Cron in WordPress
http://www.limecanvas.com/disabling-wp-cron-in-wordpress/
• Understanding WP Cron, and why I don’t use it
http://chrislema.com/understanding-wp-cron/
…I could go on…
17. Low Traffic Sites
• WP_Cron is based off traffic
• No visits, no cron
• Unreliable for time specific
tasks
18. High Traffic Sites
• Possibility of many concurrent
cron events.
• Expensive cron events can
cause load issues.
• If needing EXACT times, still
not 100%
19. Race Conditions
• Identified by the same
scheduled task running twice,
at the same time.
• Due to PHP threads, they
aren’t aware of each other
20. Missed Tasks
• They will run.
• Scenario
• Tasks scheduled 8a and 9a.
• No cron run until 9:15a
• Both tasks will run at 9:15a
• Be aware of this when:
• Pushing to Web Services
• APIs
21. How to Wrangle WP_Cron
• 3rd party ping service (Pingdom)
• Setup an actual cron if available
http://domain.com/wp-cron.php?doing_wp_cron=1
• Limit threads with DB or file locks
• Know what crons are scheduled, and what they do
define('DISABLE_WP_CRON', true);