/**
* Workflow helper functions
*
* @since 4.4.1
* @version 1.0
* @package Email Subscribers
*/
/**
* Function to validate workflow data item
*
* @param string $type Data item type.
* @param ES_Workflow_Data_Type $item Data item.
*
* @return mixed item of false
*
* @since 4.4.1
*/
function ig_es_validate_data_item( $type, $item ) {
if ( ! $type || ! $item ) {
return false;
}
$valid = false;
// Validate with the data type classes.
$data_type = ES_Workflow_Data_Types::get( $type );
if ( $data_type ) {
$valid = $data_type->validate( $item );
}
/**
* Filter to override data item validation
*
* @since 4.4.1
*/
$valid = apply_filters( 'ig_es_validate_data_item', $valid, $type, $item );
if ( $valid ) {
return $item;
}
return false;
}
/**
* Function to convert bool values to int values.
*
* @param mixed $val Mixed values.
* @return int
*
* @since 4.4.1
*/
function ig_es_bool_int( $val ) {
return intval( (bool) $val );
}
/**
* Generate tracking key
*
* @param $length int
* @param bool $case_sensitive When false only lowercase letters will be included
* @param bool $more_numbers
* @return string
*/
function ig_es_generate_key( $length = 25, $case_sensitive = true, $more_numbers = false ) {
$chars = 'abcdefghijklmnopqrstuvwxyz0123456789';
if ( $case_sensitive ) {
$chars .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
}
if ( $more_numbers ) {
$chars .= '01234567890123456789';
}
$password = '';
$chars_length = strlen( $chars );
for ( $i = 0; $i < $length; $i++ ) {
$password .= substr($chars, wp_rand( 0, $chars_length - 1), 1);
}
return $password;
}
/**
* Does str_replace but limited to one replacement
*
* @param string$subject
* @param string$find
* @param string $replace
* @return string
*/
function ig_es_str_replace_first_match( $subject, $find, $replace = '' ) {
$pos = strpos($subject, $find);
if ( false !== $pos ) {
return substr_replace($subject, $replace, $pos, strlen($find));
}
return $subject;
}
/**
* Get country name from country code
*
* @param string $country_code
* @return string|bool
*
* @since 4.6.9
*/
function ig_es_get_country_name( $country_code ) {
$countries = WC()->countries->get_countries();
return isset( $countries[ $country_code ] ) ? $countries[ $country_code ] : false;
}
/**
* Get state name from country and state code
*
* @param string $country_code
* @param string $state_code
* @return string|bool
*
* @since 4.6.9
*/
function ig_es_get_state_name( $country_code, $state_code ) {
$states = WC()->countries->get_states( $country_code );
return isset( $states[ $state_code ] ) ? $states[ $state_code ] : false;
}
/**
* Get product image
*
* @param WC_Product $product
* @param string $size
* @return array|false|string
*
* @since 4.6.9
*/
function ig_es_get_wc_product_image_url( $product, $size = 'shop_catalog' ) {
$image_id = $product->get_image_id();
if ( $image_id ) {
$image_url = wp_get_attachment_image_url( $image_id, $size );
return apply_filters( 'ig_es_email_product_image_src', $image_url, $size, $product );
} else {
$image_url = wc_placeholder_img_src( $size );
return apply_filters( 'ig_es_email_product_placeholder_image_src', $image_url, $size, $product );
}
}
function ig_es_create_list_from_product( $product ) {
$list_id = 0;
if ( ! ( $product instanceof WC_Product ) ) {
return $list_id;
}
$product_name = $product->get_name();
$product_sku = $product->get_sku();
$list_name = $product_name;
if ( empty( $product_sku ) ) {
$list_slug = $product_name;
} else {
$list_slug = $product_sku;
}
$list = ES()->lists_db->get_list_by_slug( $list_slug );
if ( ! empty( $list ) ) {
$list_id = $list['id'];
} else {
$list_id = ES()->lists_db->add_list( $list_name, $list_slug );
}
return $list_id;
}/**
* General API functions for scheduling actions
*/
/**
* Enqueue an action to run one time, as soon as possible
*
* @param string $hook The hook to trigger.
* @param array $args Arguments to pass when the hook triggers.
* @param string $group The group to assign this job to.
* @return int The action ID.
*/
function as_enqueue_async_action( $hook, $args = array(), $group = '' ) {
if ( ! ActionScheduler::is_initialized( __FUNCTION__ ) ) {
return 0;
}
return ActionScheduler::factory()->async( $hook, $args, $group );
}
/**
* Schedule an action to run one time
*
* @param int $timestamp When the job will run.
* @param string $hook The hook to trigger.
* @param array $args Arguments to pass when the hook triggers.
* @param string $group The group to assign this job to.
*
* @return int The action ID.
*/
function as_schedule_single_action( $timestamp, $hook, $args = array(), $group = '' ) {
if ( ! ActionScheduler::is_initialized( __FUNCTION__ ) ) {
return 0;
}
return ActionScheduler::factory()->single( $hook, $args, $timestamp, $group );
}
/**
* Schedule a recurring action
*
* @param int $timestamp When the first instance of the job will run.
* @param int $interval_in_seconds How long to wait between runs.
* @param string $hook The hook to trigger.
* @param array $args Arguments to pass when the hook triggers.
* @param string $group The group to assign this job to.
*
* @return int The action ID.
*/
function as_schedule_recurring_action( $timestamp, $interval_in_seconds, $hook, $args = array(), $group = '' ) {
if ( ! ActionScheduler::is_initialized( __FUNCTION__ ) ) {
return 0;
}
return ActionScheduler::factory()->recurring( $hook, $args, $timestamp, $interval_in_seconds, $group );
}
/**
* Schedule an action that recurs on a cron-like schedule.
*
* @param int $base_timestamp The first instance of the action will be scheduled
* to run at a time calculated after this timestamp matching the cron
* expression. This can be used to delay the first instance of the action.
* @param string $schedule A cron-link schedule string
* @see http://en.wikipedia.org/wiki/Cron
* * * * * * *
* ┬ ┬ ┬ ┬ ┬ ┬
* | | | | | |
* | | | | | + year [optional]
* | | | | +----- day of week (0 - 7) (Sunday=0 or 7)
* | | | +---------- month (1 - 12)
* | | +--------------- day of month (1 - 31)
* | +-------------------- hour (0 - 23)
* +------------------------- min (0 - 59)
* @param string $hook The hook to trigger.
* @param array $args Arguments to pass when the hook triggers.
* @param string $group The group to assign this job to.
*
* @return int The action ID.
*/
function as_schedule_cron_action( $timestamp, $schedule, $hook, $args = array(), $group = '' ) {
if ( ! ActionScheduler::is_initialized( __FUNCTION__ ) ) {
return 0;
}
return ActionScheduler::factory()->cron( $hook, $args, $timestamp, $schedule, $group );
}
/**
* Cancel the next occurrence of a scheduled action.
*
* While only the next instance of a recurring or cron action is unscheduled by this method, that will also prevent
* all future instances of that recurring or cron action from being run. Recurring and cron actions are scheduled in
* a sequence instead of all being scheduled at once. Each successive occurrence of a recurring action is scheduled
* only after the former action is run. If the next instance is never run, because it's unscheduled by this function,
* then the following instance will never be scheduled (or exist), which is effectively the same as being unscheduled
* by this method also.
*
* @param string $hook The hook that the job will trigger.
* @param array $args Args that would have been passed to the job.
* @param string $group The group the job is assigned to.
*
* @return string|null The scheduled action ID if a scheduled action was found, or null if no matching action found.
*/
function as_unschedule_action( $hook, $args = array(), $group = '' ) {
if ( ! ActionScheduler::is_initialized( __FUNCTION__ ) ) {
return 0;
}
$params = array(
'hook' => $hook,
'status' => ActionScheduler_Store::STATUS_PENDING,
'orderby' => 'date',
'order' => 'ASC',
'group' => $group,
);
if ( is_array( $args ) ) {
$params['args'] = $args;
}
$action_id = ActionScheduler::store()->query_action( $params );
if ( $action_id ) {
ActionScheduler::store()->cancel_action( $action_id );
}
return $action_id;
}
/**
* Cancel all occurrences of a scheduled action.
*
* @param string $hook The hook that the job will trigger.
* @param array $args Args that would have been passed to the job.
* @param string $group The group the job is assigned to.
*/
function as_unschedule_all_actions( $hook, $args = array(), $group = '' ) {
if ( ! ActionScheduler::is_initialized( __FUNCTION__ ) ) {
return;
}
if ( empty( $args ) ) {
if ( ! empty( $hook ) && empty( $group ) ) {
ActionScheduler_Store::instance()->cancel_actions_by_hook( $hook );
return;
}
if ( ! empty( $group ) && empty( $hook ) ) {
ActionScheduler_Store::instance()->cancel_actions_by_group( $group );
return;
}
}
do {
$unscheduled_action = as_unschedule_action( $hook, $args, $group );
} while ( ! empty( $unscheduled_action ) );
}
/**
* Check if there is an existing action in the queue with a given hook, args and group combination.
*
* An action in the queue could be pending, in-progress or async. If the is pending for a time in
* future, its scheduled date will be returned as a timestamp. If it is currently being run, or an
* async action sitting in the queue waiting to be processed, in which case boolean true will be
* returned. Or there may be no async, in-progress or pending action for this hook, in which case,
* boolean false will be the return value.
*
* @param string $hook
* @param array $args
* @param string $group
*
* @return int|bool The timestamp for the next occurrence of a pending scheduled action, true for an async or in-progress action or false if there is no matching action.
*/
function as_next_scheduled_action( $hook, $args = null, $group = '' ) {
if ( ! ActionScheduler::is_initialized( __FUNCTION__ ) ) {
return false;
}
$params = array(
'hook' => $hook,
'orderby' => 'date',
'order' => 'ASC',
'group' => $group,
);
if ( is_array( $args ) ) {
$params['args'] = $args;
}
$params['status'] = ActionScheduler_Store::STATUS_RUNNING;
$action_id = ActionScheduler::store()->query_action( $params );
if ( $action_id ) {
return true;
}
$params['status'] = ActionScheduler_Store::STATUS_PENDING;
$action_id = ActionScheduler::store()->query_action( $params );
if ( null === $action_id ) {
return false;
}
$action = ActionScheduler::store()->fetch_action( $action_id );
$scheduled_date = $action->get_schedule()->get_date();
if ( $scheduled_date ) {
return (int) $scheduled_date->format( 'U' );
} elseif ( null === $scheduled_date ) { // pending async action with NullSchedule
return true;
}
return false;
}
/**
* Check if there is a scheduled action in the queue but more efficiently than as_next_scheduled_action().
*
* It's recommended to use this function when you need to know whether a specific action is currently scheduled
* (pending or in-progress).
*
* @since x.x.x
*
* @param string $hook The hook of the action.
* @param array $args Args that have been passed to the action. Null will matches any args.
* @param string $group The group the job is assigned to.
*
* @return bool True if a matching action is pending or in-progress, false otherwise.
*/
function as_has_scheduled_action( $hook, $args = null, $group = '' ) {
if ( ! ActionScheduler::is_initialized( __FUNCTION__ ) ) {
return false;
}
$query_args = array(
'hook' => $hook,
'status' => array( ActionScheduler_Store::STATUS_RUNNING, ActionScheduler_Store::STATUS_PENDING ),
'group' => $group,
'orderby' => 'none',
);
if ( null !== $args ) {
$query_args['args'] = $args;
}
$action_id = ActionScheduler::store()->query_action( $query_args );
return $action_id !== null;
}
/**
* Find scheduled actions
*
* @param array $args Possible arguments, with their default values:
* 'hook' => '' - the name of the action that will be triggered
* 'args' => NULL - the args array that will be passed with the action
* 'date' => NULL - the scheduled date of the action. Expects a DateTime object, a unix timestamp, or a string that can parsed with strtotime(). Used in UTC timezone.
* 'date_compare' => '<=' - operator for testing "date". accepted values are '!=', '>', '>=', '<', '<=', '='
* 'modified' => NULL - the date the action was last updated. Expects a DateTime object, a unix timestamp, or a string that can parsed with strtotime(). Used in UTC timezone.
* 'modified_compare' => '<=' - operator for testing "modified". accepted values are '!=', '>', '>=', '<', '<=', '='
* 'group' => '' - the group the action belongs to
* 'status' => '' - ActionScheduler_Store::STATUS_COMPLETE or ActionScheduler_Store::STATUS_PENDING
* 'claimed' => NULL - TRUE to find claimed actions, FALSE to find unclaimed actions, a string to find a specific claim ID
* 'per_page' => 5 - Number of results to return
* 'offset' => 0
* 'orderby' => 'date' - accepted values are 'hook', 'group', 'modified', 'date' or 'none'
* 'order' => 'ASC'
*
* @param string $return_format OBJECT, ARRAY_A, or ids.
*
* @return array
*/
function as_get_scheduled_actions( $args = array(), $return_format = OBJECT ) {
if ( ! ActionScheduler::is_initialized( __FUNCTION__ ) ) {
return array();
}
$store = ActionScheduler::store();
foreach ( array('date', 'modified') as $key ) {
if ( isset($args[$key]) ) {
$args[$key] = as_get_datetime_object($args[$key]);
}
}
$ids = $store->query_actions( $args );
if ( $return_format == 'ids' || $return_format == 'int' ) {
return $ids;
}
$actions = array();
foreach ( $ids as $action_id ) {
$actions[$action_id] = $store->fetch_action( $action_id );
}
if ( $return_format == ARRAY_A ) {
foreach ( $actions as $action_id => $action_object ) {
$actions[$action_id] = get_object_vars($action_object);
}
}
return $actions;
}
/**
* Helper function to create an instance of DateTime based on a given
* string and timezone. By default, will return the current date/time
* in the UTC timezone.
*
* Needed because new DateTime() called without an explicit timezone
* will create a date/time in PHP's timezone, but we need to have
* assurance that a date/time uses the right timezone (which we almost
* always want to be UTC), which means we need to always include the
* timezone when instantiating datetimes rather than leaving it up to
* the PHP default.
*
* @param mixed $date_string A date/time string. Valid formats are explained in http://php.net/manual/en/datetime.formats.php.
* @param string $timezone A timezone identifier, like UTC or Europe/Lisbon. The list of valid identifiers is available http://php.net/manual/en/timezones.php.
*
* @return ActionScheduler_DateTime
*/
function as_get_datetime_object( $date_string = null, $timezone = 'UTC' ) {
if ( is_object( $date_string ) && $date_string instanceof DateTime ) {
$date = new ActionScheduler_DateTime( $date_string->format( 'Y-m-d H:i:s' ), new DateTimeZone( $timezone ) );
} elseif ( is_numeric( $date_string ) ) {
$date = new ActionScheduler_DateTime( '@' . $date_string, new DateTimeZone( $timezone ) );
} else {
$date = new ActionScheduler_DateTime( $date_string, new DateTimeZone( $timezone ) );
}
return $date;
}
Warning: Cannot modify header information - headers already sent by (output started at /home/go2hei5/hipskillz.com/wp-content/plugins/email-subscribers/lite/includes/workflows/workflow-helper-functions.php:180) in /home/go2hei5/hipskillz.com/wp-includes/pluggable.php on line 1427
Warning: Cannot modify header information - headers already sent by (output started at /home/go2hei5/hipskillz.com/wp-content/plugins/email-subscribers/lite/includes/workflows/workflow-helper-functions.php:180) in /home/go2hei5/hipskillz.com/wp-includes/pluggable.php on line 1430