Plugin Directory

Changeset 2346835


Ignore:
Timestamp:
07/26/2020 07:40:51 PM (6 years ago)
Author:
oribi
Message:

improving revenue tracking for stores with custom thank you page

Location:
oribi-analytics-for-woocommerce
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • oribi-analytics-for-woocommerce/trunk/oribi-analytics-ecommerce.php

    r2339827 r2346835  
    66 * Author: Oribi
    77 * Author URI: https://oribi.io
    8  * Version: 1.0.1
     8 * Version: 1.1.0
    99 * Text Domain: oribi
    1010 * WC requires at least: 2.2
     
    5858
    5959    class Oribi_Event_Tracker {
     60        public static $default_tracking_capabilities = array(
     61            'email' => true
     62        );
     63
    6064        public static function init() {
    6165            $tracking_capabilities = self::get_tracking_capabilities();
    6266
    63             add_action( 'woocommerce_thankyou', array( self::class, 'oribi_track_woocommerce_purchase' ) );
    64 
     67            add_filter('woocommerce_payment_successful_result',  array( self::class, 'oribi_track_woocommerce_purchase' ), 1, 2 );
     68            add_action('wp_footer',  array( self::class, 'trackIntegratePurchase' ));
    6569
    6670            if ( isset( $tracking_capabilities['email'] ) && (bool)$tracking_capabilities['email'] ) {
    67                 add_action( 'wp_head', array( self::class, 'oribi_track_users_email' ) );
     71                add_action( 'wp_footer', array( self::class, 'oribi_track_users_email' ), 999999999 );
    6872            }
    6973        }
     
    7175        public static function get_tracking_capabilities() {
    7276            $tracking_capabilities = get_option( 'oribi_tracking_capabilities' );
    73             $tracking_capabilities = array_replace(
    74                 array(
    75                    'woocommerce' => true,
    76                    'email' => false
    77                 ),
    78                 (array)$tracking_capabilities
     77            $default_unchecked = array(
     78                'email' => false
    7979            );
    80             return $tracking_capabilities;
     80            $tracking_capabilities =
     81                is_array( $tracking_capabilities )
     82                    ? array_replace( $default_unchecked, $tracking_capabilities )
     83                    : $default_unchecked;
     84            return array_replace( self::$default_tracking_capabilities, $tracking_capabilities );
    8185        }
    8286
     
    8488            $user_email = null;
    8589            if ( is_user_logged_in() ) {
    86                 $user_email = wp_get_current_user()->user_email;
     90                $current_user = wp_get_current_user();
     91                $user_email = $current_user->user_email;
    8792            }
    8893            if ( isset( $user_email ) ) {
     
    97102        }
    98103
    99         public static function oribi_track_woocommerce_purchase( $order_id ) {
     104        public static function oribi_track_woocommerce_purchase( $result, $order_id ) {
    100105            $order    = wc_get_order( $order_id );
     106
     107            if ( !isset($order) ) return $result;
     108
    101109            $items    = $order->get_items();
    102110            $products = array();
     
    104112            $user_email = $order->get_billing_email();
    105113            if ( !isset($user_email) && is_user_logged_in() ) {
    106                 $user_email = wp_get_current_user()->user_email;
     114                $current_user = wp_get_current_user();
     115                $user_email = $current_user->user_email;
    107116            }
    108117
    109118            foreach( $items as $item ) {
    110                 $terms = get_the_terms ( $item->get_product_id(), 'product_cat' );
    111 
    112                 $quantity = (int)$item->get_quantity();
    113                 $price    = (float)$item->get_subtotal() / $quantity;
     119                $terms               = get_the_terms ( $item->get_product_id(), 'product_cat' );
     120                $product             = $item->get_product();
     121                $quantity            = (int)$item->get_quantity();
     122                $price               = $quantity > 0 ? (float)$item->get_subtotal() / $quantity : 0;
     123                $productRegularPrice = (float)$product->get_regular_price();
     124                $productActivePrice  = (float)$product->get_price();
     125
     126                if ($productRegularPrice >= $productActivePrice) {
     127                    $discountPrice = $productRegularPrice - $productActivePrice;
     128                } else {
     129                    $discountPrice = $productRegularPrice - $price;
     130                }
     131                $discountPrice = $discountPrice > 0 ? $discountPrice : 0;
    114132
    115133                $product = array(
    116                     'id'         => $item->get_product_id(),
    117                     'name'       => $item->get_name(),
    118                     'price'      => $price,
    119                     'quantity'   => $quantity,
    120                     'categories' => array(),
     134                    'id'            => $item->get_product_id(),
     135                    'name'          => $item->get_name(),
     136                    'price'         => $price,
     137                    'taxPrice'      => $quantity > 0 ? (float)$item->get_subtotal_tax() / $quantity : 0,
     138                    'discountPrice' => $discountPrice,
     139                    'quantity'      => $quantity,
     140                    'categories'    => array(),
    121141                );
    122142
     
    135155                'shippingPrice' => (float)$order->calculate_shipping(),
    136156                'discountPrice' => (float)$order->get_total_discount(),
     157                'storeCurrency' => get_woocommerce_currency(),
    137158                'products'      => $products,
    138                 'source'        => 'WooCommerce',
     159                'source'        => 'WooCommerce-plugin',
    139160            );
     161
     162            $customer_id = $order->get_customer_id();
     163            if ( $customer_id > 0 ) {
     164                $customer = new WC_Customer( $customer_id );
     165                $data['isFirstPurchase'] = $customer->get_order_count() === 1;
     166            }
    140167            $data = json_encode($data);
    141             ?>
    142             <script>
    143                 document.addEventListener( 'DOMContentLoaded', function() {
    144                     <?php if( isset( $user_email ) && (bool)self::get_tracking_capabilities()['email'] ): ?>
    145                     ORIBI.api('setUserEmail', '<?php echo $user_email ?>');
    146                     <?php endif; ?>
    147                     ORIBI.api( 'trackIntegratePurchase', <?php echo $data ?>);
    148                 });
    149             </script>
    150             <?php
     168
     169            WC()->session->set( 'trackIntegratePurchase_data' , $data );
     170
     171            $tracking_capabilities = self::get_tracking_capabilities();
     172            if( isset( $user_email ) && $tracking_capabilities['email'] ) {
     173                WC()->session->set( 'trackIntegratePurchase_email' , $user_email );
     174            }
     175
     176            return $result;
     177
     178        }
     179
     180        public static function trackIntegratePurchase() {
     181            $data = WC()->session->get( 'trackIntegratePurchase_data' );
     182            $user_email =  WC()->session->get( 'trackIntegratePurchase_email');
     183
     184            if(!empty($data)){
     185                $tracking_capabilities = self::get_tracking_capabilities();
     186                WC()->session->set( 'trackIntegratePurchase_email' , '' );
     187                WC()->session->set( 'trackIntegratePurchase_data' , '' );
     188                ?>
     189                <script>
     190                    document.addEventListener( 'DOMContentLoaded', function() {
     191                        <?php if( isset( $user_email ) && $tracking_capabilities['email'] ) : ?>
     192                            ORIBI.api('setUserEmail', '<?php echo $user_email ?>');
     193                        <?php endif; ?>
     194                        ORIBI.api( 'trackIntegratePurchase', <?php echo $data ?>);
     195                    });
     196                </script>
     197                <?php
     198            }
     199
    151200        }
    152201    }
    153202
    154203  Oribi_Event_Tracker::init();
    155 
Note: See TracChangeset for help on using the changeset viewer.