Wrangling WP_Cron - WordCamp Grand Rapids 2014

Preview:

DESCRIPTION

Learning to schedule tasks, the WordPress way

Citation preview

@cklosowski cklosows

Wrangling WP_Cron Scheduling Your Tasks the WordPress Way

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

WP_Cron

A tool to replace a tool

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.

WP_Cron

The platform-agnostic task scheduler

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

Basic Usage

<?php wp_schedule_event( $timestamp, $recurrence, $hook, $args );

Simple Right?

Sort Of

Some Caveats

$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' );

$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

$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)

$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)

// 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 }

<?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 );

Why Not WP_Cron?

Not all unicorns and rainbows

Because WP_Cron _______________

• Why WP Cron Suckshttp://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…

Low Traffic Sites

• WP_Cron is based off traffic

• No visits, no cron

• Unreliable for time specific tasks

High Traffic Sites

• Possibility of many concurrent cron events.

• Expensive cron events can cause load issues.

• If needing EXACT times, still not 100%

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

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

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);

@cklosowski cklosows

Questions? Scheduling Your Tasks the WordPress Way

Recommended