Title: wp-cron.php problem
Last modified: May 16, 2019

---

# wp-cron.php problem

 *  [batuhanguldemir](https://wordpress.org/support/users/batuhanguldemir/)
 * (@batuhanguldemir)
 * [7 years ago](https://wordpress.org/support/topic/wp-cron-php-problem/)
 * hello,
    some time ago I got a cron operations error.
 * error log message “[16-May-2019 17:00:09 UTC] PHP Warning: Invalid argument supplied
   for foreach() in /home/******/public_html/sabundanhayaller.com/wp-cron.php on
   line 111”
 * i made all the steps here
    “[https://www.inmotionhosting.com/support/website/wordpress/disabling-the-wp-cronphp-in-wordpress&#8221](https://www.inmotionhosting.com/support/website/wordpress/disabling-the-wp-cronphp-in-wordpress&#8221);
 * still getting the same message.
    what do you think you can do.
 * The page I need help with: _[[log in](https://login.wordpress.org/?redirect_to=https%3A%2F%2Fwordpress.org%2Fsupport%2Ftopic%2Fwp-cron-php-problem%2F%3Foutput_format%3Dmd&locale=en_US)
   to see the link]_

Viewing 15 replies - 1 through 15 (of 34 total)

1 [2](https://wordpress.org/support/topic/wp-cron-php-problem/page/2/?output_format=md)
[3](https://wordpress.org/support/topic/wp-cron-php-problem/page/3/?output_format=md)
[→](https://wordpress.org/support/topic/wp-cron-php-problem/page/2/?output_format=md)

 *  [Joy](https://wordpress.org/support/users/joyously/)
 * (@joyously)
 * [7 years ago](https://wordpress.org/support/topic/wp-cron-php-problem/#post-11539966)
 * The steps on that page turn it off in one place and call it in another, so I 
   don’t see how that would help you if the function is getting bad data. The line
   of code is using the data saved for the scheduled events. Apparently, there is
   wrong data in the scheduled event. Do you have any plugins that set reminders
   or do things later?
 *  Thread Starter [batuhanguldemir](https://wordpress.org/support/users/batuhanguldemir/)
 * (@batuhanguldemir)
 * [7 years ago](https://wordpress.org/support/topic/wp-cron-php-problem/#post-11539984)
 * wordfence,jetpack
    i am using plugins
 * The file sequence contains all of the line of code that gives the error.
 *     ```
       f ( $doing_cron_transient != $doing_wp_cron ) {
       	return;
       }
   
       foreach ( $crons as $timestamp => $cronhooks ) {
       	if ( $timestamp > $gmt_time ) {
       		break;
       	}
   
       	foreach ( $cronhooks as $hook => $keys ) {
   
       		foreach ( $keys as $k => $v ) {
   
       			$schedule = $v['schedule'];
   
       			if ( $schedule != true ) {
       				$new_args = array( $timestamp, $schedule, $hook, $v['args'] );
       				call_user_func_array( 'wp_reschedule_event', $new_args );
       			}
   
       			wp_unschedule_event( $timestamp, $hook, $v['args'] );
       ```
   
 * foreach ( $cronhooks as $hook => $keys )
 * this 111 line
    -  This reply was modified 7 years ago by [batuhanguldemir](https://wordpress.org/support/users/batuhanguldemir/).
 *  Thread Starter [batuhanguldemir](https://wordpress.org/support/users/batuhanguldemir/)
 * (@batuhanguldemir)
 * [7 years ago](https://wordpress.org/support/topic/wp-cron-php-problem/#post-11539986)
 * foreach ( $cronhooks as $hook => $keys )
 * this 111 line
 *  [autotutorial](https://wordpress.org/support/users/autotutorial/)
 * (@autotutorial)
 * [7 years ago](https://wordpress.org/support/topic/wp-cron-php-problem/#post-11540232)
 * foreach only works with arrays any other data issues a warning.
    Some of these
   features were introduced in the wordpress version 5.1, I’m sorry I can’t figure
   out what’s wrong.
 *  [DesignSmoke](https://wordpress.org/support/users/designsmoke/)
 * (@designsmoke)
 * [7 years ago](https://wordpress.org/support/topic/wp-cron-php-problem/#post-11540421)
 * [@batuhanguldemir](https://wordpress.org/support/users/batuhanguldemir/) that
   means that something is supplying invalid data to the $cronhooks loop – I suspect
   it’s one of your plugins.
 * You can try to debug this and figure out what it is by adding this before line
   111:
    `error_log(print_r($cronhooks, TRUE));`
 * This will log _all_ cron hooks to the error log – you can then see which one 
   is printed before the error occurs.
 *  Thread Starter [batuhanguldemir](https://wordpress.org/support/users/batuhanguldemir/)
 * (@batuhanguldemir)
 * [7 years ago](https://wordpress.org/support/topic/wp-cron-php-problem/#post-11540493)
 * ı have 7 plugins (akismet,cloudflare,jetpack,limit-login-attempts-reloaded,sucuri-
   scanner,w3-total-cache,wordfence)
 * i’ll try to disable them all
 *  [DesignSmoke](https://wordpress.org/support/users/designsmoke/)
 * (@designsmoke)
 * [7 years ago](https://wordpress.org/support/topic/wp-cron-php-problem/#post-11540516)
 * [@batuhanguldemir](https://wordpress.org/support/users/batuhanguldemir/) Is W3
   Total Cache updated? It could be the source.
 *  Thread Starter [batuhanguldemir](https://wordpress.org/support/users/batuhanguldemir/)
 * (@batuhanguldemir)
 * [7 years ago](https://wordpress.org/support/topic/wp-cron-php-problem/#post-11540548)
 * [@designsmoke](https://wordpress.org/support/users/designsmoke/)
    I’m not very
   expert on this , my plugin settings are as here. [https://bloggingwizard.com/w3-total-cache-cloudflare/](https://bloggingwizard.com/w3-total-cache-cloudflare/)
 *  Thread Starter [batuhanguldemir](https://wordpress.org/support/users/batuhanguldemir/)
 * (@batuhanguldemir)
 * [7 years ago](https://wordpress.org/support/topic/wp-cron-php-problem/#post-11540567)
 * [@designsmoke](https://wordpress.org/support/users/designsmoke/) error log details
 * [16-May-2019 20:41:04 UTC] PHP Warning: Invalid argument supplied for foreach()
   in /home/xxxxxxx/public_html/wp-cron.php on line 111
    [16-May-2019 20:41:04 UTC]
   Array ( [recovery_mode_clean_expired_keys] => Array ( [40cd750bba9870f18aada2478b24840a]
   => Array ( [schedule] => daily [args] => Array ( )
 *  [interval] => 86400
    )
 *  )
 *  [jetpack_clean_nonces] => Array
    ( [40cd750bba9870f18aada2478b24840a] => Array([
   schedule] => hourly [args] => Array ( )
 *  [interval] => 3600
    )
 *  )
 * )
 * [16-May-2019 20:41:04 UTC] Array
    ( [jetpack_sync_cron] => Array ( [40cd750bba9870f18aada2478b24840a]
   => Array ( [schedule] => jetpack_sync_interval [args] => Array ( )
 *  [interval] => 300
    )
 *  )
 *  [jetpack_sync_full_cron] => Array
    ( [40cd750bba9870f18aada2478b24840a] => Array([
   schedule] => jetpack_sync_interval [args] => Array ( )
 *  [interval] => 300
    )
 *  )
 * )
 * [16-May-2019 20:41:07 UTC] Array
    ( [wp_privacy_delete_old_export_files] => Array([
   40cd750bba9870f18aada2478b24840a] => Array ( [schedule] => hourly [args] => Array()
 *  [interval] => 3600
    )
 *  )
 *  [wp_version_check] => Array
    ( [40cd750bba9870f18aada2478b24840a] => Array ([
   schedule] => twicedaily [args] => Array ( )
 *  [interval] => 43200
    )
 *  )
 *  [wp_update_plugins] => Array
    ( [40cd750bba9870f18aada2478b24840a] => Array ([
   schedule] => twicedaily [args] => Array ( )
 *  [interval] => 43200
    )
 *  )
 *  [wp_update_themes] => Array
    ( [40cd750bba9870f18aada2478b24840a] => Array ([
   schedule] => twicedaily [args] => Array ( )
 *  [interval] => 43200
    )
 *  )
 * )
 *  [DesignSmoke](https://wordpress.org/support/users/designsmoke/)
 * (@designsmoke)
 * [7 years ago](https://wordpress.org/support/topic/wp-cron-php-problem/#post-11540626)
 * [@batuhanguldemir](https://wordpress.org/support/users/batuhanguldemir/) Do you
   have the cron task that happened before the warning?
 *  Thread Starter [batuhanguldemir](https://wordpress.org/support/users/batuhanguldemir/)
 * (@batuhanguldemir)
 * [7 years ago](https://wordpress.org/support/topic/wp-cron-php-problem/#post-11540633)
 * [@designsmoke](https://wordpress.org/support/users/designsmoke/)
    as far as I
   know. only jetpack and wordfence remote access available
 *  Thread Starter [batuhanguldemir](https://wordpress.org/support/users/batuhanguldemir/)
 * (@batuhanguldemir)
 * [7 years ago](https://wordpress.org/support/topic/wp-cron-php-problem/#post-11540640)
 * [@designsmoke](https://wordpress.org/support/users/designsmoke/)
    all cron page
   code here
 *     ```
       <?php
       /**
        * A pseudo-CRON daemon for scheduling WordPress tasks
        *
        * WP Cron is triggered when the site receives a visit. In the scenario
        * where a site may not receive enough visits to execute scheduled tasks
        * in a timely manner, this file can be called directly or via a server
        * CRON daemon for X number of times.
        *
        * Defining DISABLE_WP_CRON as true and calling this file directly are
        * mutually exclusive and the latter does not rely on the former to work.
        *
        * The HTTP request to this file will not slow down the visitor who happens to
        * visit when the cron job is needed to run.
        *
        * @package WordPress
        */
   
       ignore_user_abort( true );
   
       /* Don't make the request block till we finish, if possible. */
       if ( function_exists( 'fastcgi_finish_request' ) && version_compare( phpversion(), '7.0.16', '>=' ) ) {
       	fastcgi_finish_request();
       }
   
       if ( ! empty( $_POST ) || defined( 'DOING_AJAX' ) || defined( 'DOING_CRON' ) ) {
       	die();
       }
   
       /**
        * Tell WordPress we are doing the CRON task.
        *
        * @var bool
        */
       define( 'DOING_CRON', true );
   
       if ( ! defined( 'ABSPATH' ) ) {
       	/** Set up WordPress environment */
       	require_once( dirname( __FILE__ ) . '/wp-load.php' );
       }
   
       /**
        * Retrieves the cron lock.
        *
        * Returns the uncached <code>doing_cron</code> transient.
        *
        * @ignore
        * @since 3.3.0
        *
        * @global wpdb $wpdb WordPress database abstraction object.
        *
        * @return string|false Value of the <code>doing_cron</code> transient, 0|false otherwise.
        */
       function _get_cron_lock() {
       	global $wpdb;
   
       	$value = 0;
       	if ( wp_using_ext_object_cache() ) {
       		/*
       		 * Skip local cache and force re-fetch of doing_cron transient
       		 * in case another process updated the cache.
       		 */
       		$value = wp_cache_get( 'doing_cron', 'transient', true );
       	} else {
       		$row = $wpdb->get_row( $wpdb->prepare( "SELECT option_value FROM $wpdb->options WHERE option_name = %s LIMIT 1", '_transient_doing_cron' ) );
       		if ( is_object( $row ) ) {
       			$value = $row->option_value;
       		}
       	}
   
       	return $value;
       }
   
       $crons = wp_get_ready_cron_jobs();
       if ( empty( $crons ) ) {
       	die();
       }
   
       $gmt_time = microtime( true );
   
       // The cron lock: a unix timestamp from when the cron was spawned.
       $doing_cron_transient = get_transient( 'doing_cron' );
   
       // Use global $doing_wp_cron lock otherwise use the GET lock. If no lock, trying grabbing a new lock.
       if ( empty( $doing_wp_cron ) ) {
       	if ( empty( $_GET['doing_wp_cron'] ) ) {
       		// Called from external script/job. Try setting a lock.
       		if ( $doing_cron_transient && ( $doing_cron_transient + WP_CRON_LOCK_TIMEOUT > $gmt_time ) ) {
       			return;
       		}
       		$doing_cron_transient = $doing_wp_cron = sprintf( '%.22F', microtime( true ) );
       		set_transient( 'doing_cron', $doing_wp_cron );
       	} else {
       		$doing_wp_cron = $_GET['doing_wp_cron'];
       	}
       }
   
       /*
        * The cron lock (a unix timestamp set when the cron was spawned),
        * must match $doing_wp_cron (the "key").
        */
       if ( $doing_cron_transient != $doing_wp_cron ) {
       	return;
       }
   
       foreach ( $crons as $timestamp => $cronhooks ) {
       	if ( $timestamp > $gmt_time ) {
       		break;
       	}
       error_log(print_r($cronhooks, TRUE));
       	foreach ( $cronhooks as $hook => $keys ) {
   
       		foreach ( $keys as $k => $v ) {
   
       			$schedule = $v['schedule'];
   
       			if ( $schedule != true ) {
       				$new_args = array( $timestamp, $schedule, $hook, $v['args'] );
       				call_user_func_array( 'wp_reschedule_event', $new_args );
       			}
   
       			wp_unschedule_event( $timestamp, $hook, $v['args'] );
   
       			/**
       			 * Fires scheduled events.
       			 *
       			 * @ignore
       			 * @since 2.1.0
       			 *
       			 * @param string $hook Name of the hook that was scheduled to be fired.
       			 * @param array  $args The arguments to be passed to the hook.
       			 */
       			do_action_ref_array( $hook, $v['args'] );
   
       			// If the hook ran too long and another cron process stole the lock, quit.
       			if ( _get_cron_lock() != $doing_wp_cron ) {
       				return;
       			}
       		}
       	}
       }
   
       if ( _get_cron_lock() == $doing_wp_cron ) {
       	delete_transient( 'doing_cron' );
       }
   
       die();
       ```
   
 *  [autotutorial](https://wordpress.org/support/users/autotutorial/)
 * (@autotutorial)
 * [7 years ago](https://wordpress.org/support/topic/wp-cron-php-problem/#post-11540689)
 *     ```
       if(!is_array($cronhooks)){
       if(is_null($cronhooks)){
       $cronhooks = (int) $cronhooks;
       }
       error_log(print_r($cronhooks, TRUE)."\n");
       }
       ```
   
 * Prove this for your errors 🙂
 *  Thread Starter [batuhanguldemir](https://wordpress.org/support/users/batuhanguldemir/)
 * (@batuhanguldemir)
 * [7 years ago](https://wordpress.org/support/topic/wp-cron-php-problem/#post-11540864)
 * I searched a lot. Since I couldn’t find the answer, I got the following codes.
   Do you think there is a problem?
 *     ```
       	foreach ( $cronhooks as $hook => $keys ) {
   
       		foreach ( $keys as $k => $v ) {
   
       			$schedule = $v['schedule'];
   
       			if ( $schedule != true ) {
       				$new_args = array( $timestamp, $schedule, $hook, $v['args'] );
       				call_user_func_array( 'wp_reschedule_event', $new_args );
       			}
   
       			wp_unschedule_event( $timestamp, $hook, $v['args'] );
   
       			/**
       			 * Fires scheduled events.
       			 *
       			 * @ignore
       			 * @since 2.1.0
       			 *
       			 * @param string $hook Name of the hook that was scheduled to be fired.
       			 * @param array  $args The arguments to be passed to the hook.
       			 */
       			do_action_ref_array( $hook, $v['args'] );
   
       			// If the hook ran too long and another cron process stole the lock, quit.
       			if ( _get_cron_lock() != $doing_wp_cron ) {
       				return;
       			}
       		}
       	}
       ```
   
 *  [autotutorial](https://wordpress.org/support/users/autotutorial/)
 * (@autotutorial)
 * [7 years ago](https://wordpress.org/support/topic/wp-cron-php-problem/#post-11540876)
 * yes surely there is a problem but the log you posted is right, use my code because
   foreach puts a warning only if $cronhooks is not an array

Viewing 15 replies - 1 through 15 (of 34 total)

1 [2](https://wordpress.org/support/topic/wp-cron-php-problem/page/2/?output_format=md)
[3](https://wordpress.org/support/topic/wp-cron-php-problem/page/3/?output_format=md)
[→](https://wordpress.org/support/topic/wp-cron-php-problem/page/2/?output_format=md)

The topic ‘wp-cron.php problem’ is closed to new replies.

## Tags

 * [cron](https://wordpress.org/support/topic-tag/cron/)
 * [cron job](https://wordpress.org/support/topic-tag/cron-job/)
 * [wp-cron.php](https://wordpress.org/support/topic-tag/wp-cron-php/)

 * In: [Fixing WordPress](https://wordpress.org/support/forum/how-to-and-troubleshooting/)
 * 34 replies
 * 12 participants
 * Last reply from: [calderwood](https://wordpress.org/support/users/calderwood/)
 * Last activity: [6 years, 8 months ago](https://wordpress.org/support/topic/wp-cron-php-problem/page/3/#post-11926505)
 * Status: not resolved

## Topics

### Topics with no replies

### Non-support topics

### Resolved topics

### Unresolved topics

### All topics
