do_action // 3. if last try : try / catch exception ? if $on_exception : throws exception ? add_action('event_retry', __NAMESPACE . '\\_try', 10, 7); function _try($callable, $args = [], $delay = 5, $retries = 1, $validator = 'validator_default', $use_cron = false, $on_exception = false) { if(!is_array($args)) { $args = [$args]; } if($retries < 1) { return call_user_func_array($callable, $args); } else { $retries--; } $must_retry = false; if($on_exception) try { $value = call_user_func_array($callable, $args); } catch (Exception $e) { $must_retry = true; } } else { $value = call_user_func_array($callable, $args); } if($must_retry || !valid_return($value, $validator)) { if($use_cron) { $time = time() + $delay; wp_schedule_single_event($time, 'event_retry', [$callable, $args, $delay, $retries, $validator, $cron, $on_exception]); } else { sleep($delay); return _try($callable, $args, $delay, $retries, $validator, $cron, $on_exception) } } else { return $value; } } function valid_return($value, $validator) { call_user_func($validator, $value); } function validator_default($value) { return false !== $value; }