prepare_cart_data_fb_response( 'add_payment_info' ) ); } return $data; } ); } /** * Update the cart data for add payment info event when order bump product is removed from cart. * * @return void */ public function update_cart_data_for_tiktok_event() { add_filter( 'woocommerce_update_order_review_fragments', function( $data ) { if ( 'enable' === self::$tiktok_pixel_settings['enable_tiktok_add_payment_info'] ) { $data['tiktok_add_payment_info_data'] = wp_json_encode( Cartflows_Tracking::get_instance()->prepare_cart_data_tiktok_response( 'add_payment_info' ) ); } return $data; } ); } /** * Update the cart data for add payment info event when order bump product is removed from cart. * * @return void */ public function update_cart_data_for_pinterest_event() { add_filter( 'woocommerce_update_order_review_fragments', function( $data ) { if ( 'enable' === self::$pinterest_tag_settings['enable_pinterest_add_payment_info'] ) { $data['pinterest_add_payment_info_data'] = wp_json_encode( Cartflows_Tracking::get_instance()->prepare_cart_data_pinterest_response() ); } return $data; } ); } /** * Add updated cart and product in Ajax response. * * @param integer $product_id product id. */ public function trigger_fb_event( $product_id ) { add_filter( 'woocommerce_update_order_review_fragments', function( $data ) use ( $product_id ) { $data['added_to_cart_data'] = $this->prepare_fb_response( $product_id ); if ( 'enable' === self::$fb_pixel_settings['facebook_pixel_add_payment_info'] ) { $data['fb_add_payment_info_data'] = wp_json_encode( Cartflows_Tracking::get_instance()->prepare_cart_data_fb_response( 'add_payment_info' ) ); } return $data; } ); } /** * Add updated cart and product in Ajax response. * * @param integer $product_id product id. * @return void. */ public function trigger_tiktok_event( $product_id ) { add_filter( 'woocommerce_update_order_review_fragments', function( $data ) use ( $product_id ) { $data['tiktok_added_to_cart_data'] = $this->prepare_tiktok_response( $product_id ); if ( 'enable' === self::$tiktok_pixel_settings['enable_tiktok_add_payment_info'] ) { $data['tiktok_add_payment_info_data'] = wp_json_encode( Cartflows_Tracking::get_instance()->prepare_cart_data_tiktok_response( 'add_payment_info' ) ); } return $data; } ); } /** * Add updated cart and product in Ajax response. * * @param integer $product_id product id. * @return void. */ public function trigger_snapchat_event( $product_id ) { add_filter( 'woocommerce_update_order_review_fragments', function( $data ) use ( $product_id ) { $data['snapchat_added_to_cart_data'] = $this->prepare_snapchat_response( $product_id ); return $data; } ); } /** * Add updated cart and product in Ajax response. * * @param integer $product_id product id. * @return void. */ public function trigger_pinterest_event( $product_id ) { add_filter( 'woocommerce_update_order_review_fragments', function( $data ) use ( $product_id ) { $data['pinterest_added_to_cart_data'] = $this->prepare_pinterest_response( $product_id ); if ( 'enable' === self::$pinterest_tag_settings['enable_pinterest_add_payment_info'] ) { $data['pinterest_add_payment_info_data'] = wp_json_encode( Cartflows_Tracking::get_instance()->prepare_cart_data_pinterest_response() ); } return $data; } ); } /** * Save the offer details in transient to use for facebook pixel. * * @param object $parent_order parent order id. * @param array $offer_data offer product data. * @param object $child_order child order. */ public function save_offer_data_for_fb( $parent_order, $offer_data, $child_order = null ) { $order_id = null; $user_key = WC()->session->get_customer_id(); if ( $child_order ) { $order_id = $child_order->get_id(); } else { $order_id = $parent_order->get_id(); } $data = array( 'order_id' => $order_id, 'offer_product' => $offer_data, ); set_transient( 'wcf-offer-details-for-fbp-' . $user_key, $data ); } /** * Save the offer details in transient to use for tiktok pixel. * * @param object $parent_order parent order id. * @param array $offer_data offer product data. * @param object $child_order child order. * @return void. */ public function save_offer_data_for_tiktok( $parent_order, $offer_data, $child_order = null ) { $order_id = null; $user_key = WC()->session->get_customer_id(); if ( $child_order ) { $order_id = $child_order->get_id(); } else { $order_id = $parent_order->get_id(); } $data = array( 'order_id' => $order_id, 'offer_product' => $offer_data, ); set_transient( 'wcf-offer-details-for-tiktok-' . $user_key, $data ); } /** * Save the offer details in transient to use for pinterest tag. * * @param object $parent_order parent order id. * @param array $offer_data offer product data. * @param object $child_order child order. * @return void. */ public function save_offer_data_for_pinterest( $parent_order, $offer_data, $child_order = null ) { $order_id = null; $user_key = WC()->session->get_customer_id(); if ( $child_order ) { $order_id = $child_order->get_id(); } else { $order_id = $parent_order->get_id(); } $data = array( 'order_id' => $order_id, 'offer_product' => $offer_data, ); set_transient( 'wcf-offer-details-for-pinterest-' . $user_key, $data ); } /** * Save the offer details in transient to use for Google Analytics. * * @param object $parent_order parent order id. * @param array $offer_data offer product data. * @param object $child_order child order. */ public function save_offer_data_for_ga( $parent_order, $offer_data, $child_order = null ) { $order_id = null; $user_key = WC()->session->get_customer_id(); if ( $child_order ) { $order_id = $child_order->get_id(); } else { $order_id = $parent_order->get_id(); } $data = array( 'order_id' => $order_id, 'offer_product' => $offer_data, ); set_transient( 'wcf-offer-details-for-ga-' . $user_key, $data ); } /** * Save the offer details in transient to use for Google Analytics. * * @since x.x.x * @param object $parent_order parent order id. * @param array $offer_data offer product data. * @param object $child_order child order. * @return void. */ public function save_offer_data_for_gads( $parent_order, $offer_data, $child_order = null ) { $order_id = null; $user_key = WC()->session->get_customer_id(); if ( $child_order ) { $order_id = $child_order->get_id(); } else { $order_id = $parent_order->get_id(); } $data = array( 'order_id' => $order_id, 'offer_product' => $offer_data, ); set_transient( 'wcf-offer-details-for-gads-' . $user_key, $data ); } /** * Save the offer details in transient to use for snapchat pixel. * * @param object $parent_order parent order id. * @param array $offer_data offer product data. * @param object $child_order child order. * @return void. */ public function save_offer_data_for_snapchat( $parent_order, $offer_data, $child_order = null ) { $order_id = null; $user_key = WC()->session->get_customer_id(); if ( $child_order ) { $order_id = $child_order->get_id(); } else { $order_id = $parent_order->get_id(); } $data = array( 'order_id' => $order_id, 'offer_product' => $offer_data, ); set_transient( 'wcf-offer-details-for-snapchat-' . $user_key, $data ); } /** * Trigger the purchase event for the upsell/downsell offer. */ public function trigger_offer_purchase_event() { if ( isset( $_GET['wcf-order'] ) && 'enable' === self::$fb_pixel_settings['facebook_pixel_purchase_complete'] ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended $order_id = intval( $_GET['wcf-order'] ); //phpcs:ignore WordPress.Security.NonceVerification.Recommended $user_key = WC()->session->get_customer_id(); $offer_data = get_transient( 'wcf-offer-details-for-fbp-' . $user_key ); if ( empty( $offer_data ) ) { return; } $purchase_details = $this->prepare_offer_purchase_data_fb_response( $order_id, $offer_data ); delete_transient( 'wcf-offer-details-for-fbp-' . $user_key ); if ( ! empty( $purchase_details ) ) { $purchase_details = wp_json_encode( $purchase_details ); $event_script = " "; // Reason for PHPCS ignore: Printing Google Analytics script. No input taken from the user except GA ID. echo html_entity_decode( $event_script ); //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } } } /** * Trigger the tiktok purchase event for the upsell/downsell offer. * * @return void. */ public function trigger_offer_purchase_event_for_tiktok() { if ( isset( $_GET['wcf-order'] ) && 'enable' === self::$tiktok_pixel_settings['enable_tiktok_purchase_event'] ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended $order_id = intval( $_GET['wcf-order'] ); //phpcs:ignore WordPress.Security.NonceVerification.Recommended $user_key = WC()->session->get_customer_id(); $offer_data = get_transient( 'wcf-offer-details-for-tiktok-' . $user_key ); $event_script = ''; if ( empty( $offer_data ) ) { return; } $purchase_details = $this->prepare_offer_purchase_data_tiktok_response( $order_id, $offer_data ); $cart_details = $this->prepare_offer_accepted_data_tiktok_response( $offer_data ); delete_transient( 'wcf-offer-details-for-tiktok-' . $user_key ); // Apply the filter to check if the 'AddToCart' tracking should be triggered for offer steps. $enable_add_to_cart_tracking = apply_filters( 'cartflows_pro_enable_addtocart_for_offer_steps', true, $order_id ); if ( $enable_add_to_cart_tracking && ! empty( $cart_details ) ) { $cart_details = wp_json_encode( $cart_details ); $event_script .= " "; } if ( ! empty( $purchase_details ) ) { $purchase_details = wp_json_encode( $purchase_details ); $event_script .= " "; } echo html_entity_decode( $event_script ); //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } } /** * Trigger the pinterest checkout event for the upsell/downsell offer. * * @return void. */ public function trigger_offer_purchase_event_for_pinterest() { if ( isset( $_GET['wcf-order'] ) && 'enable' === self::$pinterest_tag_settings['enable_pinterest_purchase_event'] ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended $order_id = intval( $_GET['wcf-order'] ); //phpcs:ignore WordPress.Security.NonceVerification.Recommended $user_key = WC()->session->get_customer_id(); $offer_data = get_transient( 'wcf-offer-details-for-pinterest-' . $user_key ); $event_script = ''; if ( empty( $offer_data ) ) { return; } $purchase_details = $this->prepare_offer_purchase_data_pinterest_response( $order_id, $offer_data ); $cart_details = $this->prepare_offer_accepted_data_pinterest_response( $offer_data ); delete_transient( 'wcf-offer-details-for-pinterest-' . $user_key ); // Apply the filter to check if the 'AddToCart' tracking should be triggered for offer steps. $enable_add_to_cart_tracking = apply_filters( 'cartflows_pro_enable_addtocart_for_offer_steps', true, $order_id ); if ( $enable_add_to_cart_tracking && ! empty( $cart_details ) ) { $cart_details = wp_json_encode( $cart_details ); $event_script .= " "; } if ( ! empty( $purchase_details ) ) { $purchase_details = wp_json_encode( $purchase_details ); $event_script .= " "; } echo html_entity_decode( $event_script ); //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } } /** * Trigger the Snapchat purchase event for the upsell/downsell offer. * * @return void. */ public function trigger_offer_purchase_event_for_snapchat() { if ( isset( $_GET['wcf-order'] ) && 'enable' === self::$snapchat_pixel_settings['enable_snapchat_purchase_event'] ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended $order_id = intval( $_GET['wcf-order'] ); //phpcs:ignore WordPress.Security.NonceVerification.Recommended $user_key = WC()->session->get_customer_id(); $offer_data = get_transient( 'wcf-offer-details-for-snapchat-' . $user_key ); $event_script = ''; if ( empty( $offer_data ) ) { return; } $purchase_details = $this->prepare_offer_purchase_data_snapchat_response( $order_id, $offer_data ); $cart_details = $this->prepare_offer_accepted_data_snapchat_response( $offer_data ); delete_transient( 'wcf-offer-details-for-snapchat-' . $user_key ); if ( ! empty( $cart_details ) ) { $cart_details = wp_json_encode( $cart_details ); $event_script .= " "; } if ( ! empty( $purchase_details ) ) { $purchase_details = wp_json_encode( $purchase_details ); $event_script .= " "; } echo html_entity_decode( $event_script ); //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } } /** * Trigger the view content event for the upsell/downsell offer. * * @param array $params Facebook event parameters array. * @param int $step_id current step ID. * * @return array */ public function trigger_offer_viewcontent_event( $params, $step_id ) { // Upsell/Downsell Page. if ( isset( $step_id ) && wcf()->utils->check_is_offer_page( $step_id ) ) { return $this->prepare_viewcontent_data_fb_response( $params, $step_id ); } return $params; } /** * Prepare view content data for fb response. * * @param array $params Facebook event parameters array. * @param int $step_id current step id. * * @return array */ public function prepare_viewcontent_data_fb_response( $params, $step_id ) { $product_data = array(); $content_ids = array(); $category_names = ''; $product_names = ''; // Get offer page data. $offer_product = wcf_pro()->utils->get_offer_data( $step_id ); // Add offer data only if the offer data is array and set. if ( ! empty( $offer_product ) && is_array( $offer_product ) ) { $content_ids[] = $offer_product['id']; $category_names = wp_strip_all_tags( wc_get_product_category_list( $offer_product['id'] ) ); $product_data = array( 'cart_contents' => array( 'id' => $offer_product['id'], 'name' => $offer_product['name'], 'price' => $offer_product['price'], 'quantity' => $offer_product['qty'], ), 'content_ids' => $offer_product['id'], 'product_names' => $offer_product['name'], 'category_names' => $category_names, ); $params['content_ids'] = $product_data['content_ids']; $params['currency'] = get_woocommerce_currency(); $params['value'] = $offer_product['total']; $params['content_type'] = 'product'; $params['contents'] = wp_json_encode( $product_data['cart_contents'] ); } return $params; } /** * Trigger the view content event for the upsell/downsell offer. * * @param array $params Tiktok event parameters array. * @param int $step_id current step ID. * * @return array */ public function trigger_offer_viewcontent_event_for_tiktok( $params, $step_id ) { // Upsell/Downsell Page. if ( isset( $step_id ) && wcf()->utils->check_is_offer_page( $step_id ) ) { return $this->prepare_viewcontent_data_tiktok_response( $params, $step_id ); } return $params; } /** * Trigger the view content event for the upsell/downsell offer. * * @param array $params Snapchat event parameters array. * @param int $step_id current step ID. * * @return array */ public function trigger_offer_viewcontent_event_for_snapchat( $params, $step_id ) { // Upsell/Downsell Page. if ( isset( $step_id ) && wcf()->utils->check_is_offer_page( $step_id ) ) { return $this->prepare_viewcontent_data_snapchat_response( $params, $step_id ); } return $params; } /** * Prepare view content data for tiktok response. * * @param array $params Tiktok event parameters array. * @param int $step_id current step id. * * @return array */ public function prepare_viewcontent_data_tiktok_response( $params, $step_id ) { $product_data = array(); $product_names = ''; // Get offer page data. $offer_product = wcf_pro()->utils->get_offer_data( $step_id ); // Add offer data only if the offer data is array and set. if ( ! empty( $offer_product ) && is_array( $offer_product ) ) { $product_data[] = array( 'content_id' => (string) $offer_product['id'], 'content_name' => $offer_product['name'], 'content_type' => 'product', ); // Assign TikTok Pixel fields. $params['currency'] = get_woocommerce_currency(); $params['value'] = $offer_product['total']; $params['contents'] = $product_data; } return $params; } /** * Prepare view content data for Snapchat response. * * @param array $params Snapchat event parameters array. * @param int $step_id current step id. * * @return array */ public function prepare_viewcontent_data_snapchat_response( $params, $step_id ) { // Get offer page data. $offer_product = wcf_pro()->utils->get_offer_data( $step_id ); if ( ! empty( $offer_product ) && is_array( $offer_product ) ) { // Assign snapchat Pixel fields. $params['currency'] = get_woocommerce_currency(); $params['item_ids'] = array_column( $offer_product, 'id' ); $params['item_category'] = implode( ',', array_column( $offer_product, 'category' ) ); $params['number_items'] = count( $offer_product ); $params['price'] = $offer_product['total']; } return $params; } /** * Trigger the purchase event for the upsell/downsell offer. */ public function trigger_offer_purchase_event_for_ga() { if ( isset( $_GET['wcf-order'] ) && 'enable' === self::$ga_settings['enable_add_payment_info'] ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended $order_id = intval( $_GET['wcf-order'] ); //phpcs:ignore WordPress.Security.NonceVerification.Recommended $user_key = WC()->session->get_customer_id(); $offer_data = get_transient( 'wcf-offer-details-for-ga-' . $user_key ); if ( empty( $offer_data ) ) { return; } $purchase_details = $this->prepare_offer_purchase_data_ga_response( $order_id, $offer_data ); delete_transient( 'wcf-offer-details-for-ga-' . $user_key ); if ( ! empty( $purchase_details ) ) { $purchase_data = wp_json_encode( $purchase_details ); $event_script = " "; // Reason for PHPCS ignore: Printing Google Analytics script. No input taken from the user except GA ID. echo html_entity_decode( $event_script ); //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } } } /** * Trigger the purchase event for the upsell/downsell offer. * * @since x.x.x * @return void. */ public function trigger_offer_purchase_event_for_gads() { if ( isset( $_GET['wcf-order'] ) && isset( self::$gads_settings['google_ads_tracking'] ) && 'enable' === self::$gads_settings['google_ads_tracking'] ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended $order_id = intval( $_GET['wcf-order'] ); //phpcs:ignore WordPress.Security.NonceVerification.Recommended $user_key = WC()->session->get_customer_id(); $offer_data = get_transient( 'wcf-offer-details-for-gads-' . $user_key ); if ( empty( $offer_data ) ) { return; } $purchase_details = $this->prepare_offer_purchase_data_gads_response( $order_id, (array) $offer_data ); delete_transient( 'wcf-offer-details-for-gads-' . $user_key ); if ( ! empty( $purchase_details ) ) { $purchase_data = wp_json_encode( $purchase_details ); $event_script = " "; // Reason for PHPCS ignore: Printing Google Analytics script. No input taken from the user except GA ID. echo html_entity_decode( $event_script ); //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } } } /** * Prepare the purchase event data for the facebook pixel. * * @param integer $order_id order id. * @param array $offer_data offer data. */ public function prepare_offer_purchase_data_fb_response( $order_id, $offer_data ) { $purchase_data = array(); $product_data = $offer_data['offer_product']; if ( empty( $product_data ) ) { return $purchase_data; } $purchase_data['content_type'] = 'product'; $purchase_data['currency'] = wcf()->options->get_checkout_meta_value( $order_id, '_order_currency' ); $purchase_data['userAgent'] = wcf()->options->get_checkout_meta_value( $order_id, '_customer_user_agent' ); $purchase_data['plugin'] = 'CartFlows-Offer'; $purchase_data['content_ids'][] = (string) $product_data['id']; $purchase_data['content_names'][] = $product_data['name']; $purchase_data['content_category'][] = wp_strip_all_tags( wc_get_product_category_list( $product_data['id'] ) ); $purchase_data['value'] = $product_data['total']; $purchase_data['transaction_id'] = $offer_data['order_id']; if ( ! wcf_pro()->utils->is_separate_offer_order() ) { $purchase_data['transaction_id'] = $offer_data['order_id'] . '_' . $product_data['step_id']; } return $purchase_data; } /** * Prepare the purchase event data for the tiktok pixel. * * @param integer $order_id order id. * @param array $offer_data offer data. * @return array */ public function prepare_offer_purchase_data_tiktok_response( $order_id, $offer_data ) { $purchase_data = array(); $product_data = $offer_data['offer_product']; if ( empty( $product_data ) ) { return $purchase_data; } $currency = wcf()->options->get_checkout_meta_value( $order_id, '_order_currency' ); $purchase_data['currency'] = $currency ? $currency : get_woocommerce_currency(); $purchase_data['userAgent'] = wcf()->options->get_checkout_meta_value( $order_id, '_customer_user_agent' ); $purchase_data['plugin'] = 'CartFlows-Offer'; // Setting up the contents array for TikTok. $purchase_data['contents'][] = array( 'content_id' => (string) $product_data['id'], 'content_name' => $product_data['name'], 'content_type' => 'product', 'content_category' => wp_strip_all_tags( wc_get_product_category_list( $product_data['id'] ) ), ); $purchase_data['value'] = $product_data['total']; $purchase_data['transaction_id'] = $offer_data['order_id']; if ( ! wcf_pro()->utils->is_separate_offer_order() ) { $purchase_data['transaction_id'] = $offer_data['order_id'] . '_' . $product_data['step_id']; } return $purchase_data; } /** * Prepare the checkout event data for the pinterest tag. * * @param integer $order_id order id. * @param array $offer_data offer data. * @return array */ public function prepare_offer_purchase_data_pinterest_response( $order_id, $offer_data ) { $purchase_data = array(); $product_data = $offer_data['offer_product']; if ( empty( $product_data ) ) { return $purchase_data; } $currency = wcf()->options->get_checkout_meta_value( $order_id, '_order_currency' ); $purchase_data['currency'] = $currency ? $currency : get_woocommerce_currency(); $purchase_data['value'] = $product_data['total']; $purchase_data['order_quantity'] = $product_data['qty']; $purchase_data['event_id'] = 'eventId' . $order_id; $purchase_data['event_name'] = 'checkout'; $purchase_data['line_items'][] = array( 'product_name' => $product_data['name'], 'product_id' => (string) $product_data['id'], 'product_price' => $product_data['price'], 'product_quantity' => $product_data['qty'], 'product_category' => wp_strip_all_tags( wc_get_product_category_list( $product_data['id'] ) ), ); $purchase_data['transaction_id'] = $offer_data['order_id']; if ( ! wcf_pro()->utils->is_separate_offer_order() ) { $purchase_data['transaction_id'] = $offer_data['order_id'] . '_' . $product_data['step_id']; } return $purchase_data; } /** * Prepare the purchase event data for the snapchat pixel. * * @param integer $order_id order id. * @param array $offer_data offer data. * @return array */ public function prepare_offer_purchase_data_snapchat_response( $order_id, $offer_data ) { $purchase_data = Cartflows_Tracking::get_instance()->prepare_common_data_snapchat_response(); $product_data = $offer_data['offer_product']; if ( empty( $product_data ) ) { return $purchase_data; } $currency = wcf()->options->get_checkout_meta_value( $order_id, '_order_currency' ); $purchase_data['currency'] = $currency ? $currency : get_woocommerce_currency(); $purchase_data['price'] = $product_data['total']; $purchase_data['item_ids'] = array( (string) $product_data['id'] ); $purchase_data['item_category'] = wp_strip_all_tags( wc_get_product_category_list( $product_data['id'] ) ); $purchase_data['number_items'] = WC()->cart->get_cart_contents_count(); $purchase_data['transaction_id'] = $offer_data['order_id']; if ( ! wcf_pro()->utils->is_separate_offer_order() ) { $purchase_data['transaction_id'] = $offer_data['order_id'] . '_' . $product_data['step_id']; } return $purchase_data; } /** * Prepare the addtocart event data for the pinterest tag. * * @param array $offer_data offer data. * @return array */ public function prepare_offer_accepted_data_pinterest_response( $offer_data ) { $product_data = $offer_data['offer_product']; if ( empty( $product_data ) ) { return array(); } $purchase_data = array( 'value' => floatval( $product_data['total'] ), 'order_quantity' => intval( $product_data['qty'] ), 'currency' => get_woocommerce_currency(), 'event_id' => 'eventId' . gmdate( 'YmdHis' ), 'line_items' => array( array( 'product_name' => $product_data['name'], 'product_id' => (string) $product_data['id'], 'product_price' => floatval( $product_data['price'] ), 'product_quantity' => intval( $product_data['qty'] ), 'product_category' => wp_strip_all_tags( wc_get_product_category_list( $product_data['id'] ) ), ), ), ); return $purchase_data; } /** * Prepare the addtocart event data for the tiktok pixel. * * @param array $offer_data offer data. * @return array */ public function prepare_offer_accepted_data_tiktok_response( $offer_data ) { $purchase_data = array(); $product_data = $offer_data['offer_product']; if ( empty( $product_data ) ) { return $purchase_data; } $purchase_data['currency'] = get_woocommerce_currency(); $purchase_data['plugin'] = 'CartFlows-Offer'; // Setting up the contents array for TikTok. $purchase_data['contents'][] = array( 'content_id' => (string) $product_data['id'], 'content_name' => $product_data['name'], 'content_type' => 'product', 'content_category' => wp_strip_all_tags( wc_get_product_category_list( $product_data['id'] ) ), ); $purchase_data['value'] = $product_data['total']; return $purchase_data; } /** * Prepare the addtocart event data for the tiktok pixel. * * @param array $offer_data offer data. * @return array */ public function prepare_offer_accepted_data_snapchat_response( $offer_data ) { $cart_data = Cartflows_Tracking::get_instance()->prepare_common_data_snapchat_response(); $product_data = $offer_data['offer_product']; if ( empty( $product_data ) ) { return $cart_data; } $cart_data['item_ids'] = array( (string) $product_data['id'] ); $cart_data['item_category'] = wp_strip_all_tags( wc_get_product_category_list( $product_data['id'] ) ); $cart_data['number_items'] = $product_data['qty']; $cart_data['price'] = $product_data['total']; return $cart_data; } /** * Prepare the purchase event data for the google analytics. * * @param integer $order_id order id. * @param array $offer_data offer data. */ public function prepare_offer_purchase_data_ga_response( $order_id, $offer_data ) { $purchase_data = array(); $product_data = $offer_data['offer_product']; if ( empty( $product_data ) ) { return $purchase_data; } $ga_tracking_id = esc_attr( self::$ga_settings['google_analytics_id'] ); $shipping_tax = $product_data['shipping_fee_tax'] - $product_data['shipping_fee']; $products_tax = $product_data['qty'] * ( $product_data['unit_price_tax'] - intval( $product_data['unit_price'] ) ); $purchase_data = array( 'send_to' => $ga_tracking_id, 'event_category' => 'Enhanced-Ecommerce', 'transaction_id' => $offer_data['order_id'], 'affiliation' => get_bloginfo( 'name' ), 'value' => $this->format_number( $product_data['total'] ), 'currency' => wcf()->options->get_checkout_meta_value( $order_id, '_order_currency' ), 'shipping' => $product_data['shipping_fee_tax'], 'tax' => $this->format_number( $shipping_tax + $products_tax ), 'items' => array( array( 'id' => $product_data['id'], 'name' => $product_data['name'], 'quantity' => $product_data['qty'], 'price' => $this->format_number( $product_data['unit_price_tax'] ), ), ), 'non_interaction' => true, ); if ( ! wcf_pro()->utils->is_separate_offer_order() ) { $purchase_data['transaction_id'] = $offer_data['order_id'] . '_' . $product_data['step_id']; } return $purchase_data; } /** * Prepare the purchase event data for the google ads. * * @since x.x.x * @param integer $order_id order id. * @param array $offer_data offer data. * @return array */ public function prepare_offer_purchase_data_gads_response( $order_id, $offer_data ) { $purchase_data = array(); $product_data = $offer_data['offer_product']; if ( empty( $product_data ) ) { return $purchase_data; } $gads_tracking_id = sanitize_text_field( self::$gads_settings['google_ads_id'] ); $gads_conversion_label = sanitize_text_field( self::$gads_settings['google_ads_label'] ); $shipping_tax = $product_data['shipping_fee_tax'] - $product_data['shipping_fee']; $products_tax = $product_data['qty'] * ( $product_data['unit_price_tax'] - floatval( $product_data['unit_price'] ) ); $purchase_data = array( 'send_to' => $gads_tracking_id . '/' . $gads_conversion_label, 'event_category' => 'Enhanced-Ecommerce', 'transaction_id' => $offer_data['order_id'], 'affiliation' => get_bloginfo( 'name' ), 'value' => $this->format_number( $product_data['total'] ), 'currency' => wcf()->options->get_checkout_meta_value( $order_id, '_order_currency' ), 'shipping' => $product_data['shipping_fee_tax'], 'tax' => $this->format_number( $shipping_tax + $products_tax ), 'items' => array( array( 'id' => $product_data['id'], 'name' => $product_data['name'], 'quantity' => $product_data['qty'], 'price' => $this->format_number( $product_data['unit_price_tax'] ), ), ), 'non_interaction' => true, ); if ( ! wcf_pro()->utils->is_separate_offer_order() ) { $purchase_data['transaction_id'] = $offer_data['order_id'] . '_' . $product_data['step_id']; } return $purchase_data; } /** * Add updated cart and product in Ajax response. * * @param integer $product_id product id. */ public function trigger_ga_add_to_cart_event( $product_id ) { add_filter( 'woocommerce_update_order_review_fragments', function( $data ) use ( $product_id ) { $data['ga_added_to_cart_data'] = $this->prepare_ga_response( $product_id ); if ( 'enable' === self::$ga_settings['enable_add_payment_info'] ) { $data['ga_add_payment_info_data'] = wp_json_encode( Cartflows_Tracking::get_instance()->prepare_cart_data_ga_response() ); } return $data; } ); } /** * Add updated cart and product in Ajax response. * * @param integer $product_id product id. * @return void */ public function trigger_gads_add_to_cart_event( $product_id ) { add_filter( 'woocommerce_update_order_review_fragments', function( $data ) use ( $product_id ) { $data['gads_added_to_cart_data'] = $this->prepare_gads_response( $product_id ); if ( isset( self::$gads_settings['google_ads_tracking'] ) && 'enable' === self::$gads_settings['google_ads_tracking'] ) { $data['gads_add_payment_info_data'] = wp_json_encode( Cartflows_Tracking::get_instance()->prepare_cart_data_gads_response() ); } return $data; } ); } /** * Add updated cart and product in Ajax response. * * @param integer $product_id product id. */ public function trigger_ga_remove_from_cart_event( $product_id ) { add_filter( 'woocommerce_update_order_review_fragments', function( $data ) use ( $product_id ) { $product_data = array(); if ( isset( $data['removed_order_bump_data'] ) ) { $product_data = $data['removed_order_bump_data']; } $data['ga_remove_to_cart_data'] = $this->prepare_ga_response( $product_id, $product_data ); if ( 'enable' === self::$ga_settings['enable_add_payment_info'] ) { $data['ga_add_payment_info_data'] = wp_json_encode( Cartflows_Tracking::get_instance()->prepare_cart_data_ga_response() ); } return $data; } ); } /** * Add updated cart and product in Ajax response. * * @param integer $product_id product id. * @return void */ public function update_cart_data_for_gads_event( $product_id ) { add_filter( 'woocommerce_update_order_review_fragments', function( $data ) use ( $product_id ) { $data['gads_remove_to_cart_data'] = $this->prepare_gads_response( $product_id ); if ( isset( self::$gads_settings['google_ads_tracking'] ) && 'enable' === self::$gads_settings['google_ads_tracking'] ) { $data['gads_add_payment_info_data'] = wp_json_encode( Cartflows_Tracking::get_instance()->prepare_cart_data_gads_response() ); } return $data; } ); } /** * Prepare response for facebook. * * @param integer $product_id product id. * @return array */ public function prepare_fb_response( $product_id ) { $response = array(); $product_data = array(); $product = wc_get_product( $product_id ); $items = WC()->cart->get_cart(); foreach ( $items as $index => $item ) { if ( $item['product_id'] === $product_id ) { $product_data = $item; break; } } if ( ! empty( $product_data ) ) { $add_to_cart['content_type'] = 'product'; $add_to_cart['plugin'] = 'CartFlows-OrderBump'; $add_to_cart['user_roles'] = implode( ', ', wp_get_current_user()->roles ); $add_to_cart['content_category'][] = wp_strip_all_tags( wc_get_product_category_list( $product->get_id() ) ); $add_to_cart['currency'] = get_woocommerce_currency(); $add_to_cart['value'] = $this->format_number( $product_data['line_subtotal'] + $product_data['line_subtotal_tax'] ); $add_to_cart['content_name'] = $product->get_title(); $add_to_cart['content_ids'][] = (string) $item['product_id']; $add_to_cart['contents'] = wp_json_encode( array( array( 'id' => $product_data['product_id'], 'name' => $product->get_title(), 'quantity' => $product_data['quantity'], 'item_price' => $this->format_number( $product_data['line_subtotal'] + $product_data['line_subtotal_tax'] ), ), ) ); // Put it in single variable. $response['added_to_cart'] = $add_to_cart; } return $response; } /** * Prepare response for tiktok. * * @param integer $product_id product id. * @return array */ public function prepare_tiktok_response( $product_id ) { $response = array(); $product_data = array(); $product = wc_get_product( $product_id ); $items = WC()->cart->get_cart(); foreach ( $items as $index => $item ) { if ( $item['product_id'] === $product_id ) { $product_data = $item; break; } } if ( ! empty( $product_data ) ) { $add_to_cart['content_type'] = 'product'; $add_to_cart['currency'] = get_woocommerce_currency(); $add_to_cart['value'] = $this->format_number( $product_data['line_subtotal'] + $product_data['line_subtotal_tax'] ); // Building the contents array for TikTok. $add_to_cart['contents'] = array( array( 'content_id' => (string) $item['product_id'], 'content_name' => $product->get_title(), 'quantity' => $product_data['quantity'], 'price' => $this->format_number( $product_data['line_subtotal'] + $product_data['line_subtotal_tax'] ), 'content_type' => 'product', ), ); // Add other required properties. $add_to_cart['plugin'] = 'CartFlows-OrderBump'; $add_to_cart['user_roles'] = implode( ', ', wp_get_current_user()->roles ); // Put it in a single variable. $response['added_to_cart'] = $add_to_cart; } return $response; } /** * Prepare response for pinterest. * * @param integer $product_id product id. * @return array */ public function prepare_pinterest_response( $product_id ) { $response = array(); $product_data = array(); $product = wc_get_product( $product_id ); $items = WC()->cart->get_cart(); foreach ( $items as $index => $item ) { if ( $item['product_id'] === $product_id ) { $product_data = $item; break; } } if ( ! empty( $product_data ) ) { $add_to_cart = array( 'product_name' => $product->get_title(), 'product_id' => (string) $product_id, 'product_price' => $this->format_number( $product_data['line_subtotal'] + $product_data['line_subtotal_tax'] ), 'product_quantity' => $product_data['quantity'], ); // Put it in a single variable. $response['added_to_cart'] = $add_to_cart; } return $response; } /** * Prepare response for tiktok. * * @param integer $product_id product id. * @return array */ public function prepare_snapchat_response( $product_id ) { $response = Cartflows_Tracking::get_instance()->prepare_common_data_snapchat_response(); $product_data = array(); $product = wc_get_product( $product_id ); $items = WC()->cart->get_cart(); foreach ( $items as $index => $item ) { if ( $item['product_id'] === $product_id ) { $product_data = $item; break; } } if ( ! empty( $product_data ) ) { $add_to_cart['currency'] = get_woocommerce_currency(); $add_to_cart['price'] = $this->format_number( $product_data['line_subtotal'] + $product_data['line_subtotal_tax'] ); $add_to_cart['description'] = 'CartFlows-OrderBump'; $add_to_cart['item_ids'] = array( (string) $item['product_id'] ); $add_to_cart['item_category'] = wp_strip_all_tags( wc_get_product_category_list( $item['product_id'] ) ); $add_to_cart['number_items'] = '1'; // Put it in a single variable. $response['added_to_cart'] = $add_to_cart; } return $response; } /** * Prepare response for Google Analytics for Bump Order. * * @param integer $product_id product id. * @param array $product_data product data. */ public function prepare_ga_response( $product_id, $product_data = array() ) { $response = array(); $data = array( 'quantity' => 1, 'price' => 0, ); $product = wc_get_product( $product_id ); if ( $product ) { $items = WC()->cart->get_cart(); foreach ( $items as $index => $item ) { if ( $item['product_id'] === $product_id ) { $data['quantity'] = $item['quantity']; $data['price'] = $item['line_subtotal'] + $item['line_subtotal_tax']; break; } } // For remove from cart event of the order bump. if ( ! empty( $product_data ) ) { $data['quantity'] = $product_data['quantity']; $data['price'] = $product_data['line_subtotal'] + $product_data['line_subtotal_tax']; } $add_to_cart_ob = array( 'send_to' => self::$ga_settings['google_analytics_id'], 'event_category' => 'Enhanced-Ecommerce', 'currency' => get_woocommerce_currency(), 'value' => $this->format_number( $data['price'] ), 'items' => array( array( 'id' => $product_id, 'name' => $product->get_title(), 'sku' => $product->get_sku(), 'category' => wp_strip_all_tags( wc_get_product_category_list( $product->get_id() ) ), 'price' => $this->format_number( $data['price'] ), 'quantity' => $data['quantity'], ), ), 'non_interaction' => true, ); $response['add_to_cart'] = wp_json_encode( $add_to_cart_ob ); $response['remove_from_cart'] = wp_json_encode( $add_to_cart_ob ); } return $response; } /** * Prepare response for Google Ads. * * @since x.x.x * @param integer $product_id product id. * @param array $product_data product data. * @return array */ public function prepare_gads_response( $product_id, $product_data = array() ) { $response = array(); $data = array( 'quantity' => 1, 'price' => 0, ); $product = wc_get_product( $product_id ); if ( $product ) { $items = WC()->cart->get_cart(); foreach ( $items as $index => $item ) { if ( intval( $item['product_id'] ) === intval( $product_id ) ) { $data['quantity'] = $item['quantity']; $data['price'] = $item['line_subtotal'] + $item['line_subtotal_tax']; break; } } // For remove from cart event of the order bump. if ( ! empty( $product_data ) ) { $data['quantity'] = $product_data['quantity']; $data['price'] = $product_data['line_subtotal'] + $product_data['line_subtotal_tax']; } $gads_tracking_id = sanitize_text_field( self::$gads_settings['google_ads_id'] ); $gads_conversion_label = sanitize_text_field( self::$gads_settings['google_ads_label'] ); $add_to_cart_ob = array( 'send_to' => $gads_tracking_id . '/' . $gads_conversion_label, 'event_category' => 'Enhanced-Ecommerce', 'currency' => get_woocommerce_currency(), 'value' => $this->format_number( $data['price'] ), 'items' => array( array( 'id' => $product_id, 'name' => $product->get_title(), 'sku' => $product->get_sku(), 'category' => wp_strip_all_tags( wc_get_product_category_list( $product->get_id() ) ), 'price' => $this->format_number( $data['price'] ), 'quantity' => $data['quantity'], ), ), 'non_interaction' => true, ); $response['add_to_cart'] = wp_json_encode( $add_to_cart_ob ); $response['remove_from_cart'] = wp_json_encode( $add_to_cart_ob ); } return $response; } /** * Get decimal of price. * * @param integer|float $price price. */ public function format_number( $price ) { return number_format( floatval( $price ), wc_get_price_decimals(), '.', '' ); } } /** * Prepare if class 'Cartflows_Pro_Frontend' exist. * Kicking this off by calling 'get_instance()' method */ Cartflows_Pro_Tracking::get_instance();