I have several cron jobs all hooked to the same hook, but each with a different argument (a post ID). It appears wp_clear_scheduled_hook only clears job which match the argument passed with it (or jobs without any arguments, if no argument is provided).

Is there a way to delete all the cron jobs associated with a hook, regardless of the argument that job has? (Without doing so 'manually' by looping through the IDs).

Seems an answer was deleted! To clarify what I would like to achieve: each post has an expiration date - and I would like to delete the post after this date.

(An alternative option is to have one cron job - repeating every 24 hours that deletes any expired posts).

However, I decided to create a one-off job for each post - but it seems you can't delete all the jobs at once without cycling through them.

2 Answers 2


4.9.0 introduced wp_unschedule_hook()



I have just quickly wrote the below function, it will clear all crons for the specified hook, irrespective of the cron time and the hook argument.

NOTE: I have NOT TESTED the function, so please don't run it on your live site.

function wpse39681_clear_all_crons( $hook ) {
    $crons = _get_cron_array();
    if ( empty( $crons ) ) {
    foreach( $crons as $timestamp => $cron ) {
        if ( ! empty( $cron[$hook] ) )  {
            unset( $crons[$timestamp][$hook] );

        if ( empty( $crons[$timestamp] ) ) {
            unset( $crons[$timestamp] );
    _set_cron_array( $crons );

Related: http://core.trac.wordpress.org/ticket/18997

  • Thanks Hameedullah. I decided to go with the alternative option, since that is how WordPress deletes old trashed posts. I've not tested your function, but it looks right and would do the job. Thanks again. Commented Jan 21, 2012 at 21:32

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.