PNG %k25u25%fgd5n!
<?php
if ( ! function_exists( 'wffn_clean' ) ) {
function wffn_clean( $var ) {
if ( is_array( $var ) ) {
return array_map( 'wffn_clean', $var );
} else {
return is_scalar( $var ) ? sanitize_text_field( $var ) : $var;
}
}
}
if ( ! function_exists( 'wffn_show_notice' ) ) {
function wffn_show_notice( $args, $context ) {
global $wffn_notices;
ob_start();
if ( $context === 'version_mismatch' ) {
?>
<div class="bwf-notice error">
<p>
<strong><?php esc_html_e( 'Attention', 'woofunnels-upstroke-power-pack' ); ?></strong>
<?php
/* translators: %1$s: Plugin name %2$s Plugin name */
echo sprintf( esc_html__( 'The %1$s version running your site is not compatible with the Funnel Builder plugin, Please update %1$s to the recent version. ', 'woofunnels-upstroke-power-pack' ), esc_attr( $args['pname'] ) );
?>
</p>
</div>
<?php
} else {
echo wp_kses_post( $args['text'] );
}
$wffn_notices[] = ob_get_clean();
}
}
/**
* Converts a string (e.g. 'yes' or 'no' , 'true') to a bool.
*
* @param $string
*
* @return bool
*/
if ( ! function_exists( 'wffn_string_to_bool' ) ) {
function wffn_string_to_bool( $string ) {
if ( is_null( $string ) ) {
return false;
}
return is_bool( $string ) ? $string : ( 'yes' === strtolower( $string ) || 1 === $string || 'true' === strtolower( $string ) || '1' === $string );
}
}
/**
* Converts a bool to a 'yes' or 'no'.
*
* @param bool $bool String to convert.
*
* @return string
* @since 3.0.0
*/
if ( ! function_exists( 'wffn_bool_to_string' ) ) {
function wffn_bool_to_string( $bool ) {
if ( ! is_bool( $bool ) ) {
$bool = wffn_string_to_bool( $bool );
}
return true === $bool ? 'yes' : 'no';
}
}
if ( ! function_exists( 'wffn_maybe_import_funnel_in_background' ) ) {
if ( ! function_exists( 'wffn_maybe_import_funnel_in_background' ) ) {
function wffn_maybe_import_funnel_in_background() {
$funnel_id = get_option( '_wffn_scheduled_funnel_id', 0 );
BWF_Logger::get_instance()->log( "Running the callback wffn_maybe_import_funnel_in_background: $funnel_id ", 'wffn_template_import' ); // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_print_r
if ( $funnel_id > 0 ) {
BWF_Logger::get_instance()->log( 'Importing template for funnel: ' . print_r( $funnel_id, true ) . '-fn- ' . __FUNCTION__, 'wffn_template_import' ); // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_print_r
do_action('wffn_import_template_background', $funnel_id);
$funnel = new WFFN_Funnel( $funnel_id );
$funnel_steps = $funnel->get_steps();
BWF_Logger::get_instance()->log( 'Funnel steps: ' . print_r( $funnel_steps, true ), 'wffn_template_import' ); // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_print_r
foreach ( $funnel_steps as $funnel_step ) {
$get_object = WFFN_Core()->steps->get_integration_object( $funnel_step['type'] );
if ( ! empty( $get_object ) ) {
$has_scheduled = $get_object->has_import_scheduled( $funnel_step['id'] );
if ( is_array( $has_scheduled ) ) {
BWF_Logger::get_instance()->log( 'Ready to import, step ID: ' . $funnel_step['id'] . ', Template: ' . print_r( $has_scheduled, true ), 'wffn_template_import' ); // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_print_r
$get_object->do_import( $funnel_step['id'] );
$get_object->update_template_data( $funnel_step['id'], [
'selected' => $has_scheduled['template'],
'selected_type' => $has_scheduled['template_type'],
] );
if ( $get_object->slug === 'wc_thankyou' ) {
do_action( 'wfty_page_design_updated', $funnel_step['id'], [
'selected' => $has_scheduled['template'],
'selected_type' => $has_scheduled['template_type'],
] );
}
if ( $get_object->slug === 'optin' ) {
do_action( 'wfop_page_design_updated', $funnel_step['id'], [
'selected' => $has_scheduled['template'],
'selected_type' => $has_scheduled['template_type'],
] );
}
if ( $get_object->slug === 'optin_ty' ) {
do_action( 'wfoty_page_design_updated', $funnel_step['id'], [
'selected' => $has_scheduled['template'],
'selected_type' => $has_scheduled['template_type'],
] );
}
if ( $get_object->slug === 'landing' ) {
do_action( 'wflp_page_design_updated', $funnel_step['id'], [
'selected' => $has_scheduled['template'],
'selected_type' => $has_scheduled['template_type'],
] );
}
}
}
}
}
}
}
}
if ( ! function_exists( 'wffn_price' ) ) {
function wffn_price( $price, $args = array() ) {
if ( function_exists( 'wc_price' ) ) {
return wc_price( $price, $args );
}
$currency_pos = 'left';
$format = '%1$s%2$s';
$price_format = apply_filters( 'wffn_price_format', $format, $currency_pos );
$args = apply_filters( 'wffn_price_args', wp_parse_args( $args, array(
'ex_tax_label' => false,
'currency' => '',
'decimal_separator' => apply_filters( 'wffn_get_price_decimal_separator', '.' ),
'thousand_separator' => apply_filters( 'wffn_get_price_thousand_separator', '.' ),
'decimals' => apply_filters( 'wffn_get_price_thousand_separator', '2' ),
'price_format' => $price_format,
) ) );
$unformatted_price = $price;
$negative = $price < 0;
$price = apply_filters( 'wffn_raw_woocommerce_price', floatval( $negative ? $price * - 1 : $price ) );
$price = apply_filters( 'wffn_formatted_woocommerce_price', number_format( $price, $args['decimals'], $args['decimal_separator'], $args['thousand_separator'] ), $price, $args['decimals'], $args['decimal_separator'], $args['thousand_separator'] );
if ( apply_filters( 'wffn_price_trim_zeros', false ) && $args['decimals'] > 0 ) {
$price = preg_replace( '/' . preg_quote( $args['decimal_separator'], '/' ) . '0++$/', '', $price );
}
$currency = $args['currency'];
if ( ! $currency ) {
$currency = 'USD';
}
$symbols = wffn_currency_symbols();
$currency_symbol = isset( $symbols[ $currency ] ) ? $symbols[ $currency ] : '';
$symbol = apply_filters( 'woocommerce_currency_symbol', $currency_symbol, $currency );
$formatted_price = ( $negative ? '-' : '' ) . sprintf( $args['price_format'], '' . $symbol . '', $price );
$return = $formatted_price;
/**
* Filters the string of price markup.
*
* @param string $return Price HTML markup.
* @param string $price Formatted price.
* @param array $args Pass on the args.
* @param float $unformatted_price Price as float to allow plugins custom formatting. Since 3.2.0.
*/
return apply_filters( 'wffn_price', $return, $price, $args, $unformatted_price );
}
}
if ( ! function_exists( 'wffn_currency_symbols' ) ) {
function wffn_currency_symbols() {
$symbols = apply_filters( 'wffn_currency_symbols', array(
'AED' => 'د.إ',
'AFN' => '؋',
'ALL' => 'L',
'AMD' => 'AMD',
'ANG' => 'ƒ',
'AOA' => 'Kz',
'ARS' => '$',
'AUD' => '$',
'AWG' => 'Afl.',
'AZN' => 'AZN',
'BAM' => 'KM',
'BBD' => '$',
'BDT' => '৳ ',
'BGN' => 'лв.',
'BHD' => '.د.ب',
'BIF' => 'Fr',
'BMD' => '$',
'BND' => '$',
'BOB' => 'Bs.',
'BRL' => 'R$',
'BSD' => '$',
'BTC' => '฿',
'BTN' => 'Nu.',
'BWP' => 'P',
'BYR' => 'Br',
'BYN' => 'Br',
'BZD' => '$',
'CAD' => '$',
'CDF' => 'Fr',
'CHF' => 'CHF',
'CLP' => '$',
'CNY' => '¥',
'COP' => '$',
'CRC' => '₡',
'CUC' => '$',
'CUP' => '$',
'CVE' => '$',
'CZK' => 'Kč',
'DJF' => 'Fr',
'DKK' => 'DKK',
'DOP' => 'RD$',
'DZD' => 'د.ج',
'EGP' => 'EGP',
'ERN' => 'Nfk',
'ETB' => 'Br',
'EUR' => '€',
'FJD' => '$',
'FKP' => '£',
'GBP' => '£',
'GEL' => '₾',
'GGP' => '£',
'GHS' => '₵',
'GIP' => '£',
'GMD' => 'D',
'GNF' => 'Fr',
'GTQ' => 'Q',
'GYD' => '$',
'HKD' => '$',
'HNL' => 'L',
'HRK' => 'kn',
'HTG' => 'G',
'HUF' => 'Ft',
'IDR' => 'Rp',
'ILS' => '₪',
'IMP' => '£',
'INR' => '₹',
'IQD' => 'ع.د',
'IRR' => '﷼',
'IRT' => 'تومان',
'ISK' => 'kr.',
'JEP' => '£',
'JMD' => '$',
'JOD' => 'د.ا',
'JPY' => '¥',
'KES' => 'KSh',
'KGS' => 'сом',
'KHR' => '៛',
'KMF' => 'Fr',
'KPW' => '₩',
'KRW' => '₩',
'KWD' => 'د.ك',
'KYD' => '$',
'KZT' => '₸',
'LAK' => '₭',
'LBP' => 'ل.ل',
'LKR' => 'රු',
'LRD' => '$',
'LSL' => 'L',
'LYD' => 'ل.د',
'MAD' => 'د.م.',
'MDL' => 'MDL',
'MGA' => 'Ar',
'MKD' => 'ден',
'MMK' => 'Ks',
'MNT' => '₮',
'MOP' => 'P',
'MRU' => 'UM',
'MUR' => '₨',
'MVR' => '.ރ',
'MWK' => 'MK',
'MXN' => '$',
'MYR' => 'RM',
'MZN' => 'MT',
'NAD' => 'N$',
'NGN' => '₦',
'NIO' => 'C$',
'NOK' => 'kr',
'NPR' => '₨',
'NZD' => '$',
'OMR' => 'ر.ع.',
'PAB' => 'B/.',
'PEN' => 'S/',
'PGK' => 'K',
'PHP' => '₱',
'PKR' => '₨',
'PLN' => 'zł',
'PRB' => 'р.',
'PYG' => '₲',
'QAR' => 'ر.ق',
'RMB' => '¥',
'RON' => 'lei',
'RSD' => 'рсд',
'RUB' => '₽',
'RWF' => 'Fr',
'SAR' => 'ر.س',
'SBD' => '$',
'SCR' => '₨',
'SDG' => 'ج.س.',
'SEK' => 'kr',
'SGD' => '$',
'SHP' => '£',
'SLL' => 'Le',
'SOS' => 'Sh',
'SRD' => '$',
'SSP' => '£',
'STN' => 'Db',
'SYP' => 'ل.س',
'SZL' => 'L',
'THB' => '฿',
'TJS' => 'ЅМ',
'TMT' => 'm',
'TND' => 'د.ت',
'TOP' => 'T$',
'TRY' => '₺',
'TTD' => '$',
'TWD' => 'NT$',
'TZS' => 'Sh',
'UAH' => '₴',
'UGX' => 'UGX',
'USD' => '$',
'UYU' => '$',
'UZS' => 'UZS',
'VEF' => 'Bs F',
'VES' => 'Bs.S',
'VND' => '₫',
'VUV' => 'Vt',
'WST' => 'T',
'XAF' => 'CFA',
'XCD' => '$',
'XOF' => 'CFA',
'XPF' => 'Fr',
'YER' => '﷼',
'ZAR' => 'R',
'ZMW' => 'ZK',
) );
return $symbols;
}
}
if ( ! function_exists( 'wffn_is_valid_funnel' ) ) {
function wffn_is_valid_funnel( $funnel ) {
return ( $funnel instanceof WFFN_Funnel && 0 < $funnel->get_id() );
}
}
if ( ! function_exists( 'wffn_is_wc_active' ) ) {
function wffn_is_wc_active() {
return wffn_is_plugin_active( 'woocommerce/woocommerce.php' );
}
}
if ( ! function_exists( 'wffn_is_plugin_active' ) ) {
function wffn_is_plugin_active( $plugin_basename ) {
$active_plugins = (array) get_option( 'active_plugins', array() );
if ( is_multisite() ) {
$active_plugins = array_merge( $active_plugins, get_site_option( 'active_sitewide_plugins', array() ) );
}
if ( in_array( $plugin_basename, apply_filters( 'active_plugins', $active_plugins ), true ) || array_key_exists( $plugin_basename, apply_filters( 'active_plugins', $active_plugins ) ) ) {
return true;
}
return false;
}
}
if ( ! function_exists( 'wffn_get_ip_address' ) ) {
function wffn_get_ip_address() {
if ( isset( $_SERVER['HTTP_X_REAL_IP'] ) ) {
return sanitize_text_field( wp_unslash( $_SERVER['HTTP_X_REAL_IP'] ) );
} elseif ( isset( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) { //phpcs:ignore WordPressVIPMinimum.Variables.ServerVariables.UserControlledHeaders
// Proxy servers can send through this header like this: X-Forwarded-For: client1, proxy1, proxy2
// Make sure we always only send through the first IP in the list which should always be the client IP.
return (string) rest_is_ip_address( trim( current( preg_split( '/,/', sanitize_text_field( wp_unslash( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) ) ) ) ); //phpcs:ignore WordPressVIPMinimum.Variables.ServerVariables.UserControlledHeaders
} elseif ( isset( $_SERVER['REMOTE_ADDR'] ) ) { //phpcs:ignore WordPressVIPMinimum.Variables.ServerVariables.UserControlledHeaders
return sanitize_text_field( wp_unslash( $_SERVER['REMOTE_ADDR'] ) ); //phpcs:ignore WordPressVIPMinimum.Variables.ServerVariables.UserControlledHeaders,WordPressVIPMinimum.Variables.RestrictedVariables
}
return '127.0.0.1';
}
}
if ( ! function_exists( 'wffn_get_user_agent' ) ) {
function wffn_get_user_agent() {
return isset( $_SERVER['HTTP_USER_AGENT'] ) ? wffn_clean( wp_unslash( $_SERVER['HTTP_USER_AGENT'] ) ) : ''; //phpcs:ignore WordPressVIPMinimum.Variables.RestrictedVariables
}
}
if ( ! function_exists( 'wffn_fk_automations_active' ) ) {
function wffn_fk_automations_active() {
return class_exists( 'BWFAN_Core' );
}
}
/**
* conversion table migration functions
*/
if ( ! function_exists( 'wffn_run_conversion_migrator' ) ) {
function wffn_run_conversion_migrator() {
global $wpdb;
$per_page = 20;
$conversion_threshold = absint( get_option( '_bwf_conversion_threshold', 0 ) );
/**
* If threshold is 0 then we will set it to total number of orders
* reaching inside this condition also means that this is the first time we are running this migration
*/
if ( 0 === $conversion_threshold ) {
/**
* delete all duplicate entries from checkout table
*/
$duplicate_col = $wpdb->get_col( "SELECT s1.ID FROM {$wpdb->prefix}wfacp_stats AS s1 LEFT JOIN ( SELECT MIN(ID) AS min_id FROM {$wpdb->prefix}wfacp_stats GROUP BY order_id ) AS s2 ON s1.ID = s2.min_id
WHERE s2.min_id IS NULL" );
if ( is_array( $duplicate_col ) && count( $duplicate_col ) > 0 ) {
$duplicate_ids = implode( ',', $duplicate_col );
$wpdb->query( $wpdb->prepare( "DELETE from {$wpdb->prefix}wfacp_stats WHERE ID IN (%1s)", $duplicate_ids ) ); //phpcs:ignore WordPress.DB.PreparedSQLPlaceholders.UnquotedComplexPlaceholder
if ( ! empty( $wpdb->last_error ) ) {
WFFN_Core()->logger->log( 'migration process delete duplicate entry from wfacp table query error ' . $wpdb->last_error . ' last query ' . $wpdb->last_query, 'fk_conv_migration', true );
}
}
/**
* delete all duplicate entries from bump table
*/
$ob_duplicate_col = $wpdb->get_col( "SELECT s1.ID FROM {$wpdb->prefix}wfob_stats AS s1 LEFT JOIN ( SELECT MIN(ID) AS min_id FROM {$wpdb->prefix}wfob_stats GROUP BY oid ) AS s2 ON s1.ID = s2.min_id
WHERE s2.min_id IS NULL" );
if ( is_array( $ob_duplicate_col ) && count( $ob_duplicate_col ) > 0 ) {
$ob_duplicate_ids = implode( ',', $ob_duplicate_col );
$wpdb->query( $wpdb->prepare( "DELETE from {$wpdb->prefix}wfob_stats WHERE ID IN (%1s)", $ob_duplicate_ids ) ); //phpcs:ignore WordPress.DB.PreparedSQLPlaceholders.UnquotedComplexPlaceholder
if ( ! empty( $wpdb->last_error ) ) {
WFFN_Core()->logger->log( 'migration process delete duplicate entry from bump table query error ' . $wpdb->last_error . ' last query ' . $wpdb->last_query, 'fk_conv_migration', true );
}
}
$number_of_order = $wpdb->get_var( "select count(ID) as order_count from {$wpdb->prefix}wfacp_stats WHERE ( fid != 0 OR fid != '' );" );
WFFN_Core()->logger->log( 'migration process total number of order ' . $number_of_order, 'fk_conv_migration', true );
if ( $number_of_order === 0 ) {
WFFN_Core()->logger->log( 'no orders found in aero table', 'fk_conv_migration', true );
return wffn_run_optin_conversion_migrator();
}
update_option( '_bwf_conversion_threshold', absint( $number_of_order ) );
$conversion_threshold = $number_of_order;
/**
* We are marking all the wc checkout funnel IDs to 0 so that after the process is done we could delete all those orphan rows that should no longer exists.
*/
$wpdb->query( $wpdb->prepare( 'UPDATE ' . $wpdb->prefix . 'bwf_conversion_tracking SET funnel_id = %d WHERE type = %d', 0, 2 ) );
}
/**
* Get the offset from where we need to start the process
*/
$offset = absint( get_option( '_bwf_conversion_offset', 0 ) );
if ( $offset > 0 && $conversion_threshold > 0 && $offset >= $conversion_threshold ) {
/**
* Since we are inside here we must terminate the process as offset is equal to threshold
*/
WFFN_Core()->logger->log( 'no orders found', 'fk_conv_migration', true );
return wffn_run_optin_conversion_migrator();
}
/**
* Let's proceed with the process and find out next batch of orders
*/
WFFN_Core()->logger->log( 'finding orders from wfacp_stats - offset: ' . $offset, 'fk_conv_migration', true );
$number_of_order = $wpdb->get_results( $wpdb->prepare( "select * from {$wpdb->prefix}wfacp_stats WHERE ( fid != 0 OR fid != '' ) limit %d,%d ", $offset, $per_page ), ARRAY_A );
/**
* If we don't have any orders then we must terminate the process
*/
if ( empty( $number_of_order ) ) {
WFFN_Core()->logger->log( 'no orders found', 'fk_conv_migration', true );
return wffn_run_optin_conversion_migrator();
}
$need_to_delete_orders = [];
$need_to_update_orders = [];
$need_to_create_orders = [];
$upsell_created_orders = [];
$conversion_tracking = BWF_Ecomm_Tracking_Common::get_instance();
$order_ids_string = implode( ',', wp_list_pluck( $number_of_order, 'order_id' ) );
/**
* delete all order from conversion if order not exists in wc_order_stats table
*/
$bumps_data = $wpdb->get_results( $wpdb->prepare( "select * from {$wpdb->prefix}wfob_stats where oid IN (%1s)", $order_ids_string ), ARRAY_A ); //phpcs:ignore WordPress.DB.PreparedSQLPlaceholders.UnquotedComplexPlaceholder
$upsells_data = $wpdb->get_results( $wpdb->prepare( "SELECT sess.order_id,
event_t.object_id AS offer_id,
event_t.action_type_id AS action_type,
event_t.value AS total_revenue
FROM `{$wpdb->prefix}wfocu_session` AS sess JOIN `{$wpdb->prefix}wfocu_event` AS event_t ON sess.id = event_t.sess_id
WHERE sess.order_id IN (%1s) AND event_t.action_type_id IN (4,6);", $order_ids_string ), ARRAY_A ); //phpcs:ignore WordPress.DB.PreparedSQLPlaceholders.UnquotedComplexPlaceholder
/***
* prepare process order array
*/
foreach ( $number_of_order as $k => $item ) {
$order_id = absint( $item['order_id'] );
WFFN_Core()->logger->log( 'Processing order: ' . $order_id, 'fk_conv_migration', true );
if ( in_array( $order_id, $upsell_created_orders, true ) ) {
continue;
}
$offset ++;
update_option( '_bwf_conversion_offset', $offset );
/**
* Filter aero table order from wc_orders
* 1. Remove order from conversion table which have not paid status
* 2. Remove order from conversion table which not exists in wc table
*/
$is_delete = false;
/**
* continue if maybe order need delete
*/
if ( $is_delete ) {
unset( $number_of_order[ $k ] );
continue;
}
/**
* merge bump data
*/
$accepted_bump = [];
$rejected_bump = [];
$bump_total = 0;
if ( ! empty( $bumps_data ) && is_array( $bumps_data ) ) {
foreach ( $bumps_data as $bump ) {
if ( absint( $item['order_id'] ) === absint( $bump['oid'] ) ) {
if ( 1 === absint( $bump['converted'] ) ) {
$accepted_bump[] = ( string ) $bump['bid'];
$bump_total += floatval( $bump['total'] );
} else {
$rejected_bump[] = ( string ) $bump['bid'];
}
}
}
}
/**
* merge offer data
*/
$accepted_offer = [];
$rejected_offer = [];
$offer_total = 0;
if ( ! empty( $upsells_data ) ) {
foreach ( $upsells_data as $u_data ) {
if ( absint( $item['order_id'] ) === absint( $u_data['order_id'] ) ) {
if ( 4 === absint( $u_data['action_type'] ) ) {
$accepted_offer[] = $u_data['offer_id'];
$offer_total += floatval( $u_data['total_revenue'] );
}
if ( 6 === absint( $u_data['action_type'] ) ) {
$rejected_offer[] = $u_data['offer_id'];
}
}
}
}
$cid = $item['cid'];
$fid = $item['fid'];
$step_id = $item['wfacp_id'];
$aero_total = $item['total_revenue'];
$maybe_upsell_orders = '';
if ( ! empty( $item['accepted_offer'] ) ) {
$maybe_upsell_orders = $wpdb->get_results( $wpdb->prepare( "SELECT metatable.meta_value as 'order_id', event.value as 'total_sales',event.timestamp as 'offertime', event.object_id as 'offer_id' FROM `" . $wpdb->prefix . "wfocu_event` as event LEFT JOIN " . $wpdb->prefix . "wfocu_event_meta as metatable ON ( event.id = metatable.event_id AND metatable.meta_key = '_new_order') INNER JOIN " . $wpdb->prefix . "wfocu_session as session ON (event.sess_id = session.id) WHERE session.order_id = %d AND event.action_type_id = 4", $item['order_id'] ), ARRAY_A );
}
$conversion = $wpdb->get_row( $wpdb->prepare( "select * from {$wpdb->prefix}bwf_conversion_tracking where type=2 AND source=%d;", $item['order_id'] ), ARRAY_A );
if ( ! empty( $conversion ) ) {
/**
* if it's not a checkout order & it's not an order of upsells
*/
if ( empty( $fid ) && empty( $conversion['funnel_id'] ) ) {
$need_to_delete_orders[] = $order_id;
continue;
}
$conversion_data = [];
$save_bump_rejected = ! empty( $conversion['bump_rejected'] ) ? $conversion['bump_rejected'] : '';
$save_bump_accepted = ! empty( $conversion['bump_accepted'] ) ? $conversion['bump_accepted'] : '';
$save_offer_rejected = ! empty( $conversion['offer_rejected'] ) ? $conversion['offer_rejected'] : '';
$save_offer_accepted = ! empty( $conversion['offer_accepted'] ) ? $conversion['offer_accepted'] : '';
$conversion_data['id'] = $conversion['id'];
$conversion_data['utm_source'] = $conversion_tracking->string_length( $conversion['utm_source'] );
$conversion_data['utm_medium'] = $conversion_tracking->string_length( $conversion['utm_medium'] );
$conversion_data['utm_campaign'] = $conversion_tracking->string_length( $conversion['utm_campaign'] );
$conversion_data['utm_term'] = $conversion_tracking->string_length( $conversion['utm_term'] );
$conversion_data['utm_content'] = $conversion_tracking->string_length( $conversion['utm_content'] );
$conversion_data['bump_rejected'] = ! empty( $rejected_bump ) ? wp_json_encode( $rejected_bump ) : $save_bump_rejected;
$conversion_data['bump_accepted'] = ! empty( $accepted_bump ) ? wp_json_encode( $accepted_bump ) : $save_bump_accepted;
$conversion_data['offer_rejected'] = ! empty( $rejected_offer ) ? wp_json_encode( $rejected_offer ) : $save_offer_rejected;
$conversion_data['offer_accepted'] = ! empty( $accepted_offer ) ? wp_json_encode( $accepted_offer ) : $save_offer_accepted;
$conversion_data['offer_total'] = floatval( $offer_total );
$conversion_data['referrer'] = $conversion_tracking->filter_referrer( $conversion['referrer'] );
$conversion_data['bump_total'] = $bump_total;
$conversion_data['funnel_id'] = ! empty( $fid ) ? $fid : $conversion['funnel_id'];
$conversion_data['contact_id'] = ! empty( $cid ) ? $cid : $conversion['contact_id'];
$conversion_data['checkout_total'] = floatval( $aero_total );
$conversion_data['value'] = ( $conversion_data['checkout_total'] + $conversion_data['offer_total'] + $conversion_data['bump_total'] );
if ( function_exists( 'wc_get_order' ) ) {
$order = wc_get_order( $order_id );
if ( $order && method_exists( $order, 'get_order_number' ) ) {
$temp_order_number = $order->get_order_number();
$conversion_data['order_number'] = $temp_order_number;
}else {
$need_to_delete_orders[] = $order_id;
continue;
}
}
// Run Update for conversion
$need_to_update_orders[] = $conversion_data;
} else {
if ( empty( $fid ) ) {
$need_to_delete_orders[] = $order_id;
continue;
}
/**
* add upsell created order in conversion table
*/
$args = [
'contact_id' => '',
'utm_source' => '',
'utm_medium' => '',
'utm_campaign' => '',
'utm_term' => '',
'utm_content' => '',
'click_id' => '',
'type' => 2,
'value' => 0,
'checkout_total' => 0,
'bump_total' => 0,
'offer_total' => 0,
'bump_accepted' => '',
'bump_rejected' => '',
'offer_accepted' => '',
'offer_rejected' => '',
'step_id' => 0,
'funnel_id' => 0,
'automation_id' => 0,
'first_click' => '0000-00-00 00:00:00',
'first_landing_url' => '',
'referrer' => '',
'journey' => '',
'source' => 0,
'order_number' => '',
'device' => 'desktop',
'browser' => '',
'country' => '',
'timestamp' => '0000-00-00 00:00:00'
];
if ( is_array( $maybe_upsell_orders ) && count( $maybe_upsell_orders ) > 0 ) {
foreach ( $maybe_upsell_orders as $upsell_order ) {
$offer_id = ( string ) $upsell_order['offer_id'];
$upsell_created_orders[] = absint( $upsell_order['order_id'] );
$upsell_args = $args;
$upsell_args['funnel_id'] = $fid;
$upsell_args['contact_id'] = $cid;
$upsell_args['source'] = $upsell_order['order_id'];
$upsell_args['offer_accepted'] = wp_json_encode( [ $offer_id ] );
$upsell_args['timestamp'] = $upsell_order['offertime'];
$upsell_args['step_id'] = $step_id;
$upsell_args['offer_total'] = floatval( $upsell_order['total_sales'] );
if ( function_exists( 'wc_get_order' ) ) {
$upsell_order_obj = wc_get_order( $upsell_order['order_id'] );
if ( $upsell_order_obj && method_exists( $upsell_order_obj, 'get_order_number' ) ) {
$temp_order_number = $upsell_order_obj->get_order_number();
$upsell_args['order_number'] = $temp_order_number;
}else {
$need_to_delete_orders[] = $order_id;
continue;
}
}
$upsell_args['utm_source'] = ! empty( $conversion ) ? $conversion_tracking->string_length( $conversion['utm_source'] ) : '';
$upsell_args['utm_medium'] = ! empty( $conversion ) ? $conversion_tracking->string_length( $conversion['utm_medium'] ) : '';
$upsell_args['utm_campaign'] = ! empty( $conversion ) ? $conversion_tracking->string_length( $conversion['utm_campaign'] ) : '';
$upsell_args['utm_term'] = ! empty( $conversion ) ? $conversion_tracking->string_length( $conversion['utm_term'] ) : '';
$upsell_args['utm_content'] = ! empty( $conversion ) ? $conversion_tracking->string_length( $conversion['utm_content'] ) : '';
$need_to_create_orders[] = $upsell_args;
}
/***
* remove offer data from primary order
*/
$accepted_offer = [];
$offer_total = 0;
}
$args['funnel_id'] = $fid;
$args['contact_id'] = $cid;
$args['source'] = $order_id;
$args['bump_rejected'] = ! empty( $rejected_bump ) ? wp_json_encode( $rejected_bump ) : '';
$args['bump_accepted'] = ! empty( $accepted_bump ) ? wp_json_encode( $accepted_bump ) : '';
$args['offer_rejected'] = ! empty( $rejected_offer ) ? wp_json_encode( $rejected_offer ) : '';
$args['offer_accepted'] = ! empty( $accepted_offer ) ? wp_json_encode( $accepted_offer ) : '';
$args['bump_total'] = floatval( $bump_total );
$args['checkout_total'] = floatval( $aero_total );
$args['timestamp'] = $item['date'];
$args['step_id'] = $step_id;
$args['offer_total'] = floatval( $offer_total );
$args['value'] = ( $args['checkout_total'] + $args['offer_total'] + $args['bump_total'] );
if ( function_exists( 'wc_get_order' ) ) {
$order = wc_get_order( $order_id );
if ( $order && method_exists( $order, 'get_order_number' ) ) {
$temp_order_number = $order->get_order_number();
$args['order_number'] = $temp_order_number;
}else {
$need_to_delete_orders[] = $order_id;
continue;
}
}
$need_to_create_orders[] = $args;
}
}
if ( ! empty( $need_to_delete_orders ) ) {
$ids = implode( ',', $need_to_delete_orders );
$wpdb->query( $wpdb->prepare( "delete from {$wpdb->prefix}bwf_conversion_tracking where type=2 and source IN (%1s)", $ids ) ); //phpcs:ignore WordPress.DB.PreparedSQLPlaceholders.UnquotedComplexPlaceholder
if ( ! empty( $wpdb->last_error ) ) {
WFFN_Core()->logger->log( 'migration process delete orders query error ' . $wpdb->last_error . ' last query ' . $wpdb->last_query, 'fk_conv_migration', true );
}
}
if ( ! empty( $need_to_update_orders ) ) {
WFFN_Conversion_Tracking_Migrator::update_multiple_conversion_rows( $need_to_update_orders );
}
if ( ! empty( $need_to_create_orders ) ) {
WFFN_Conversion_Tracking_Migrator::insert_multiple_conversion_rows( $need_to_create_orders );
}
do_action( 'wffn_conversion_migration_complete_batch' );
return true;
}
}
if ( ! function_exists( 'wffn_run_optin_conversion_migrator' ) ) {
function wffn_run_optin_conversion_migrator() {
global $wpdb;
$per_page = 20;
/**
* If threshold is 0 then we will set it to total number of optins
* reaching inside this condition also means that this is the first time we are running this migration
*/
$conversion_threshold = absint( get_option( '_bwf_optin_conversion_threshold', 0 ) );
if ( 0 === $conversion_threshold ) {
$number_of_entries = $wpdb->get_var( "SELECT COUNT(`id`) FROM {$wpdb->prefix}bwf_optin_entries" );
WFFN_Core()->logger->log( 'migration process total number of optins ' . $number_of_entries, 'fk_conv_migration', true );
if ( $number_of_entries === 0 ) {
return false;
}
update_option( '_bwf_optin_conversion_threshold', absint( $number_of_entries ) );
$conversion_threshold = $number_of_entries;
}
$offset = absint( get_option( '_bwf_optin_conversion_offset', 0 ) );
if ( $offset > 0 && $conversion_threshold > 0 && $offset >= $conversion_threshold ) {
WFFN_Core()->logger->log( 'No optin record found', 'fk_conv_migration', true );
return false;
}
WFFN_Core()->logger->log( 'finding entry from bwf_optin_entries - offset: ' . $offset, 'fk_conv_migration', true );
$number_of_entries = $wpdb->get_results( $wpdb->prepare( "select * from {$wpdb->prefix}bwf_optin_entries limit %d,%d ", $offset, $per_page ), ARRAY_A );
if ( empty( $number_of_entries ) ) {
WFFN_Core()->logger->log( 'no entries found', 'fk_conv_migration', true );
return false;
}
$default = [
'contact_id' => '',
'utm_source' => '',
'utm_medium' => '',
'utm_campaign' => '',
'utm_term' => '',
'utm_content' => '',
'click_id' => '',
'type' => 2,
'value' => 0,
'checkout_total' => 0,
'bump_total' => 0,
'offer_total' => 0,
'bump_accepted' => '',
'bump_rejected' => '',
'offer_accepted' => '',
'offer_rejected' => '',
'step_id' => 0,
'funnel_id' => 0,
'automation_id' => 0,
'first_click' => '0000-00-00 00:00:00',
'first_landing_url' => '',
'referrer' => '',
'journey' => '',
'source' => 0,
'device' => 'desktop',
'browser' => '',
'country' => '',
'timestamp' => '0000-00-00 00:00:00'
];
$conversion_tracking = BWF_Ecomm_Tracking_Common::get_instance();
$new_data = [];
$update_data = [];
foreach ( $number_of_entries as $entry ) {
WFFN_Core()->logger->log( 'Processing optin : ' . $entry['id'], 'fk_conv_migration', true );
$offset ++;
update_option( '_bwf_optin_conversion_offset', $offset );
$optin_id = $entry['id'];
$cid = $entry['cid'];
$step_id = $entry['step_id'];
$funnel_id = $entry['funnel_id'];
$_conversion = $wpdb->get_row( $wpdb->prepare( "SELECT id,utm_source, utm_medium, utm_campaign, utm_term, utm_content, referrer FROM {$wpdb->prefix}bwf_conversion_tracking WHERE type=1 AND source = %d", $optin_id ), ARRAY_A );
if ( ! empty( $_conversion ) ) {
// Trim Reference
foreach ( [ 'utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content' ] as $key ) {
$_conversion[ $key ] = $conversion_tracking->string_length( $_conversion[ $key ] );
}
$_conversion['referrer'] = $conversion_tracking->filter_referrer( $_conversion['referrer'] );
$update_data[ $_conversion['id'] ] = $_conversion;
} else {
$_conversion = $wpdb->get_row( $wpdb->prepare( "SELECT id,utm_source, utm_medium, utm_campaign, utm_term, utm_content,referrer,timestamp FROM {$wpdb->prefix}bwf_conversion_tracking WHERE step_id = %d AND contact_id = %d AND timestamp BETWEEN DATE_SUB(%s, INTERVAL 5 SECOND) AND DATE_ADD(%s, INTERVAL 5 SECOND)", $step_id, $cid, $entry['date'], $entry['date'] ), ARRAY_A );
$new_data_entry = wp_parse_args( [
'contact_id' => $cid,
'type' => 1,
'step_id' => $step_id,
'source' => $entry['id'],
'funnel_id' => $funnel_id,
'first_click' => $entry['date'],
'timestamp' => $entry['date']
], $default );
if ( ! empty( $_conversion ) ) {
$_conversion['source'] = $optin_id;
foreach ( [ 'utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content' ] as $key ) {
$_conversion[ $key ] = $conversion_tracking->string_length( $_conversion[ $key ] );
}
$_conversion['referrer'] = $conversion_tracking->filter_referrer( $_conversion['referrer'] );
$update_data[ $_conversion['id'] ] = $_conversion;
} else {
$new_data[] = $new_data_entry;
}
}
}
if ( ! empty( $update_data ) ) {
WFFN_Conversion_Tracking_Migrator::update_multiple_conversion_rows( $update_data );
}
if ( ! empty( $new_data ) ) {
WFFN_Conversion_Tracking_Migrator::insert_multiple_conversion_rows( $new_data );
}
return true;
}
}