File: //proc/thread-self/cwd/wp-content/plugins/automatewoo/includes/helpers.php
<?php
// phpcs:ignoreFile
if ( ! defined( 'ABSPATH' ) ) exit;
/**
* Gets a variable from the $_GET array but checks if it's set first.
*
* @since 4.4.0
*
* @param string $param
*
* @return mixed
*/
function aw_get_url_var( $param ) {
if ( isset( $_GET[ $param ] ) ) {
return $_GET[ $param ];
}
return false;
}
/**
* Gets a variable from the $_POST array but checks if it's set first.
*
* @since 4.4.0
*
* @param string $param
*
* @return mixed
*/
function aw_get_post_var( $param ) {
if ( isset( $_POST[ $param ] ) ) {
return $_POST[ $param ];
}
return false;
}
/**
* Gets a variable from the $_REQUEST array but checks if it's set first.
*
* @param $param
* @return mixed
*/
function aw_request( $param ) {
if ( isset( $_REQUEST[ $param ] ) ) {
return $_REQUEST[ $param ];
}
return false;
}
/**
* Clean variables using sanitize_text_field. Arrays are cleaned recursively.
* Non-scalar values are ignored.
* @deprecated
* @param string|array $var
* @return string|array
*/
function aw_clean( $var ) {
wc_deprecated_function( __FUNCTION__, '5.2.0' );
if ( is_array( $var ) ) {
return array_map( 'aw_clean', $var );
}
else {
return is_scalar( $var ) ? sanitize_text_field( $var ) : $var;
}
}
/**
* @deprecated
* @param $email
* @return string
*/
function aw_clean_email( $email ) {
wc_deprecated_function( __FUNCTION__, '5.2.0', 'Clean::email()' );
return strtolower( sanitize_email( $email ) );
}
/**
* @param $type string
* @param $item
*
* @return mixed item of false
*/
function aw_validate_data_item( $type, $item ) {
if ( ! $type || ! $item )
return false;
$valid = false;
// Validate with the data type classes
if ( $data_type = \AutomateWoo\DataTypes\DataTypes::get( $type ) ) {
$valid = $data_type->validate( $item );
}
/**
* @since 2.1
*/
$valid = apply_filters( 'automatewoo_validate_data_item', $valid, $type, $item );
if ( $valid ) return $item;
return false;
}
/**
* This is much like wc_get_template() but won't fail if the default template file is missing
*
* @param string $template_name
* @param array $imported_variables (default: array())
* @param string $template_path (default: '')
* @param string $default_path (default: '')
*/
function aw_get_template( $template_name, $imported_variables = [], $template_path = '', $default_path = '' ) {
if ( ! $template_path ) $template_path = 'automatewoo/';
if ( ! $default_path ) $default_path = AW()->path( '/templates/' );
if ( $imported_variables && is_array( $imported_variables ) ) {
extract( $imported_variables );
}
$located = wc_locate_template( $template_name, $template_path, $default_path );
if ( file_exists( $located ) ) {
include $located;
}
}
/**
* @deprecated
* @param int $timestamp
* @param bool|int $max_diff
* @param bool $convert_from_gmt
* @return string
*/
function aw_display_date( $timestamp, $max_diff = false, $convert_from_gmt = true ) {
wc_deprecated_function( __FUNCTION__, '5.2.0', 'AutomateWoo\Format::date' );
return AutomateWoo\Format::date( $timestamp, $max_diff, $convert_from_gmt );
}
/**
* @deprecated
* @param int $timestamp
* @param bool|int $max_diff
* @param bool $convert_from_gmt If its gmt convert it to site time
* @return string|false
*/
function aw_display_time( $timestamp, $max_diff = false, $convert_from_gmt = true ) {
wc_deprecated_function( __FUNCTION__, '5.2.0', 'AutomateWoo\Format::datetime' );
return AutomateWoo\Format::datetime( $timestamp, $max_diff, $convert_from_gmt );
}
/**
* @param $length int
* @param bool $case_sensitive When false only lowercase letters will be included
* @param bool $more_numbers
* @return string
*/
function aw_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;
}
/**
* Generates a random key string for unique coupons.
*
* Doesn't use ambiguous characters like: 0 o i l 1.
* Doesn't run any queries to check if the coupon is actually unique.
*
* @since 4.3.0
*
* @param int $length
* @return string
*/
function aw_generate_coupon_key( $length = 10 ) {
$chars = 'abcdefghjkmnpqrstuvwxyz23456789';
$coupon_key = '';
$chars_length = strlen( $chars );
for ( $i = 0; $i < $length; $i++ ) {
$coupon_key .= substr($chars, wp_rand( 0, $chars_length - 1), 1);
}
return $coupon_key;
}
/**
* @param $price
* @return float
*/
function aw_price_to_float( $price ) {
$price = html_entity_decode( str_replace(',', '.', $price ) );
$price = preg_replace( "/[^0-9\.]/", "", $price );
return (float) $price;
}
/**
* Get status to use when counting customer orders.
*
* This function will never return an empty array.
*
* @param bool $include_prefix
*
* @return array
*
* @since 2.7.1
*/
function aw_get_counted_order_statuses( $include_prefix = true ) {
$default_statuses = array_merge( wc_get_is_paid_statuses(), [ 'on-hold' ] );
$statuses = array_filter( apply_filters( 'automatewoo/counted_order_statuses', $default_statuses ) );
if ( ! $statuses ) {
$statuses = $default_statuses;
}
if ( $include_prefix ) {
$statuses = array_map( 'aw_add_order_status_prefix', $statuses );
}
return $statuses;
}
/**
* @since 3.5.1
* @param string $status
* @return string
*/
function aw_add_order_status_prefix( $status ) {
return 'wc-' . $status;
}
/**
* @param $order WC_Order
* @return array
*/
function aw_get_order_cross_sells( $order ) {
$cross_sells = [];
$in_order = [];
$items = $order->get_items();
foreach ( $items as $item ) {
$product = $item->get_product();
if ( $product ) {
$in_order[] = $product->is_type( 'variation' ) ? $product->get_parent_id() : $product->get_id();
$cross_sells = array_merge( $product->get_cross_sell_ids(), $cross_sells );
}
}
return array_diff( $cross_sells, $in_order );
}
/**
* @param $array
* @param $value
* @return void
*/
function aw_array_remove_value( &$array, $value ) {
if ( ( $key = array_search( $value, $array ) ) !== false ) {
unset( $array[$key] );
}
}
/**
* Removes an item by key from array and returns its value.
*
* @param $array
* @param $key
* @return mixed
*/
function aw_array_extract( &$array, $key ) {
if ( ! is_array( $array ) || ! isset( $array[ $key ] ) ) {
return false;
}
$var = $array[ $key ];
unset( $array[ $key ] );
return $var;
}
/**
* Move an array item by key to the end of the array.
*
* @param array $array
* @param string $key
*
* @return array
*/
function aw_array_move_to_end( $array, $key ) {
if ( array_key_exists( $key, $array ) ) {
$val = aw_array_extract( $array, $key );
$array[ $key ] = $val;
}
return $array;
}
/**
* str_replace but limited to one replacement
* @param string$subject
* @param string$find
* @param string $replace
* @return string
*/
function aw_str_replace_first_match( $subject, $find, $replace = '' ) {
$pos = strpos($subject, $find);
if ($pos !== false) {
return substr_replace($subject, $replace, $pos, strlen($find));
}
return $subject;
}
/**
* @deprecated
* @param string $subject
* @param string $find
* @param string $replace
* @return string
*/
function aw_str_replace_start( $subject, $find, $replace = '' ) {
wc_deprecated_function( __FUNCTION__, '5.2.0', 'aw_str_replace_first_match' );
return aw_str_replace_first_match( $subject, $find, $replace = '' );
}
/**
* Determine if a string starts with another string.
*
* @since 4.6.0
*
* @param string $haystack
* @param string $needle
*
* @return bool
*/
function aw_str_starts_with( $haystack, $needle ) {
return substr( $haystack, 0, strlen( $needle ) ) === $needle;
}
/**
* Determine if a string ends with another string.
*
* @since 4.6.0
*
* @param string $haystack
* @param string $needle
*
* @return bool
*/
function aw_str_ends_with( $haystack, $needle ) {
$length = strlen( $needle );
if ( $length == 0 ) {
return true;
}
return substr( $haystack, -$length ) === $needle;
}
/**
* Get user agent string.
* @deprecated
*
* @since 3.3.1
* @return string
*/
function aw_get_user_agent() {
wc_deprecated_function( __FUNCTION__, '4.8.1', 'wc_get_user_agent' );
return wc_get_user_agent();
}
/**
* Define cache blocking constants if not already defined
* @since 3.6.0
*/
function aw_set_nocache_constants() {
if ( ! defined( 'DONOTCACHEPAGE' ) ) {
define( "DONOTCACHEPAGE", true );
}
if ( ! defined( 'DONOTCACHEOBJECT' ) ) {
define( "DONOTCACHEOBJECT", true );
}
if ( ! defined( 'DONOTCACHEDB' ) ) {
define( "DONOTCACHEDB", true );
}
}
/**
* Wrapper for nocache_headers which also disables page caching but allows object caching.
*
* @since 4.4.0
*/
function aw_no_page_cache() {
if ( ! defined( 'DONOTCACHEPAGE' ) ) {
define( "DONOTCACHEPAGE", true );
}
nocache_headers();
}
/**
* Get sanitized URL query args.
*
* @since 3.6.0
* @param array $excluded Option to exclude some params
* @return array
*/
function aw_get_query_args( $excluded = [] ) {
$params = AutomateWoo\Clean::recursive( $_GET );
foreach( $excluded as $key ) {
unset( $params[ $key ] );
}
return $params;
}
/**
* @since 3.6.1
* @param string $country_code
* @return string|bool
*/
function aw_get_country_name( $country_code ) {
$countries = WC()->countries->get_countries();
return isset( $countries[ $country_code ] ) ? $countries[ $country_code ] : false;
}
/**
* @since 3.6.1
* @param string $country_code
* @param string $state_code
* @return string|bool
*/
function aw_get_state_name( $country_code, $state_code ) {
$states = WC()->countries->get_states( $country_code );
return isset( $states[ $state_code ] ) ? $states[ $state_code ] : false;
}
/**
* @since 3.8
* @param mixed $val
* @return int
*/
function aw_bool_int( $val ) {
return intval( (bool) $val );
}
/**
* @since 4.0
* @param string $email
* @return string
*/
function aw_anonymize_email( $email ) {
if ( ! is_email( $email ) ) {
return '';
}
$s1 = explode( '@', $email );
$s2 = explode( '.', $s1[1], 2 );
$anonymized = _aw_anonymize_email_part( $s1[0] ) . '@' . _aw_anonymize_email_part( $s2[0] ) . '.' . $s2[1];
return apply_filters( 'automatewoo/anonymize_email', $anonymized, $email );
}
/**
* @since 4.0
* @param string $part
* @return string
*/
function _aw_anonymize_email_part( $part ) {
$to_keep = 2;
$star_length = max( strlen( $part ) - $to_keep, 3 ); // min length of 3 stars
return substr( $part, 0, $to_keep ) . str_repeat( '*', $star_length );
}
/**
* @since 4.0
* @param $email
* @return bool
*/
function aw_is_email_anonymized( $email ) {
if ( $email == 'deleted@site.invalid' ) {
return true;
}
if ( strstr( $email, '***' ) !== false ) {
return true;
}
return false;
}
/**
* @since 4.1
* @param $thing
* @return bool
*/
function aw_is_error( $thing ) {
return ( $thing instanceof AutomateWoo\Error || $thing instanceof WP_Error );
}
/**
* Version can have a max of 3 parts, e.g. 4.1.0.1, isn't supported.
* Max value of a single part is 999.
*
* @since 4.2
* @param string $version
* @return int
*/
function aw_version_str_to_int( $version ) {
$parts = array_map( 'absint', explode( '.', (string) $version ) ); // convert to int here to remove any extra version info
$padded = $parts[0]
. str_pad( isset( $parts[1] ) ? $parts[1] : 0, 3, '0', STR_PAD_LEFT )
. str_pad( isset( $parts[2] ) ? $parts[2] : 0, 3, '0', STR_PAD_LEFT );
return (int) $padded;
}
/**
* @since 4.2
* @param int $version
* @return string
*/
function aw_version_int_to_str( $version ) {
$version = (string) (int) $version; // parse as int before convert to string
$length = strlen( $version );
if ( $length < 7 ) {
return '0.0.0'; // incorrect format
}
$part3 = (int) substr( $version, -3, 3 );
$part2 = (int) substr( $version, -6, 3 );
$part1 = (int) substr( $version, 0, 3 - ( 9 - $length ) );
return "$part1.$part2.$part3";
}
/**
* Converts a 3-part version to a user-friendly 2-part format if possible.
*
* (For example, 5.1.0 => 5.1, but 5.1.1 => 5.1.1, and 5.0 => 5.0).
*
* @since 4.9.5
* @param $version
* return $string
*/
function aw_prettify_version( $version ) {
return preg_replace(
'/(\d+\.\d+)\.0+$/',
'$1',
$version
);
}
/**
* Converts a date object to a mysql formatted string.
*
* WC_Datetime objects are converted to UTC timezone.
*
* @since 4.4.0
*
* @param WC_DateTime|DateTime|AutomateWoo\DateTime $date
*
* @return string|false
*/
function aw_date_to_mysql_string( $date ) {
if ( $date = aw_normalize_date( $date ) ) {
return $date->to_mysql_string();
}
return false;
}
/**
* Convert a date object to an instance of AutomateWoo\DateTime.
*
* WC_Datetime objects are converted to UTC timezone.
*
* @since 4.4.0
*
* @param WC_DateTime|DateTime|AutomateWoo\DateTime|string $input
*
* @return AutomateWoo\DateTime|false
*/
function aw_normalize_date( $input ) {
if ( ! $input ) {
return false;
}
try {
if ( is_numeric( $input ) ) {
$new = new AutomateWoo\DateTime();
$new->setTimestamp( $input );
return $new;
}
if ( is_string( $input ) ) {
$new = new AutomateWoo\DateTime( $input );
return $new;
}
if ( is_a( $input, 'AutomateWoo\DateTime' ) ) {
return $input;
}
if ( is_a( $input, 'WC_DateTime' ) || is_a( $input, 'DateTime' ) ) {
$new = new AutomateWoo\DateTime();
$new->setTimestamp( $input->getTimestamp() );
return $new;
}
} catch( \Exception $e ) {
return false;
}
return false;
}
/**
* Convert a date string to a WC_DateTime.
*
* Based on wc_string_to_datetime(), introduced in WooCommerce 3.1.0.
*
* @since 4.4.0
* @param string $time_string Time string.
* @return WC_DateTime
*/
function aw_string_to_wc_datetime( $time_string ) {
if ( function_exists( 'wc_string_to_datetime' ) ) {
return wc_string_to_datetime( $time_string );
} else {
// Strings are defined in local WP timezone. Convert to UTC.
if ( 1 === preg_match( '/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(Z|((-|\+)\d{2}:\d{2}))$/', $time_string, $date_bits ) ) {
$offset = ! empty( $date_bits[7] ) ? iso8601_timezone_to_offset( $date_bits[7] ) : wc_timezone_offset();
$timestamp = gmmktime( $date_bits[4], $date_bits[5], $date_bits[6], $date_bits[2], $date_bits[3], $date_bits[1] ) - $offset;
} else {
$timestamp = wc_string_to_timestamp( get_gmt_from_date( gmdate( 'Y-m-d H:i:s', wc_string_to_timestamp( $time_string ) ) ) );
}
$datetime = new WC_DateTime( "@{$timestamp}", new DateTimeZone( 'UTC' ) );
// Set local timezone or offset.
if ( get_option( 'timezone_string' ) ) {
$datetime->setTimezone( new DateTimeZone( wc_timezone_string() ) );
} else {
$datetime->set_utc_offset( wc_timezone_offset() );
}
return $datetime;
}
}
/**
* Get an array of post statuses that a post can have while being a draft.
*
* Note that 'draft' is deliberately not included based on how WC uses this status.
*
* @since 4.4.0
*
* @return array
*/
function aw_get_draft_post_statuses() {
return [ 'auto-draft', 'new', 'wc-auto-draft' ];
}
/**
* Escape JSON for use on HTML or attribute text nodes.
*
* Copy of wc_esc_json() for compatibility.
*
* @since 4.8.0
* @param string $json JSON to escape.
* @param bool $html True if escaping for HTML text node, false for attributes. Determines how quotes are handled.
* @return string Escaped JSON.
*/
function aw_esc_json( $json, $html = false ) {
return _wp_specialchars(
$json,
$html ? ENT_NOQUOTES : ENT_QUOTES,
'UTF-8',
true
);
}
/**
* Trigger a deprecated class error.
*
* This function should be called in the class file before the class is declared.
*
* @since 5.2.0
*
* @param string $class_name The name of the deprecated class.
* @param string $version The version the class was deprecated.
* @param string $replacement The replacement class name.
*/
function aw_deprecated_class( string $class_name, string $version, $replacement = null ) {
if ( ! WP_DEBUG ) {
return;
}
if ( $replacement ) {
$message = sprintf(
/* translators: 1: Deprecated class name, 2: Version number, 3: Replacement class name. */
__( '%1$s is deprecated since version %2$s! Use %3$s instead.', 'automatewoo' ),
$class_name,
$version,
$replacement
);
} else {
$message = sprintf(
/* translators: 1: Deprecated class name, 2: Version number. */
__( '%1$s is deprecated since version %2$s with no alternative available.', 'automatewoo' ),
$class_name,
$version
);
}
trigger_error( esc_html( $message ), E_USER_DEPRECATED );
}