From 4bdcd3eccdc759ecb616d804dc61a515567f1095 Mon Sep 17 00:00:00 2001 From: Rebecca Scott Date: Tue, 17 Mar 2020 11:27:57 +1000 Subject: [PATCH 01/16] Start tracking product_update --- .../tracks/events/class-wc-products-tracking.php | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/includes/tracks/events/class-wc-products-tracking.php b/includes/tracks/events/class-wc-products-tracking.php index 07545e4d433..a3378c0e124 100644 --- a/includes/tracks/events/class-wc-products-tracking.php +++ b/includes/tracks/events/class-wc-products-tracking.php @@ -6,6 +6,7 @@ */ use Automattic\Jetpack\Constants; +use \Automattic\WooCommerce\Admin\API\Reports\Products\DataStore as ProductsDataStore; defined( 'ABSPATH' ) || exit; @@ -23,7 +24,7 @@ class WC_Products_Tracking { } /** - * Send a Tracks event when a product is updated. + * Send some Tracks events when a product is updated. * * @param int $product_id Product id. * @param object $post WordPress post. @@ -38,6 +39,18 @@ class WC_Products_Tracking { ); WC_Tracks::record_event( 'product_edit', $properties ); + + $product = new WC_Product( $product_id ); + $update_properties = array( + 'product_id' => $product_id, + // 'product_type' => TODO where does this come from?? there is no product type, only category ids. + 'category_ids' => $product->get_category_ids(), + 'manage_stock' => 0 == $product->get_manage_stock() ? 'N' : 'Y', + // 'stock_quantity_update' => 'Y' TODO this may require hooking in to product edit at a lower level, which doesn't seem possible for an extension. + // You can only get the current product, not the product before the update... + ); + + WC_Tracks::record_event( 'product_update', $update_properties ); } /** From 7adabc9a6adfd3a08a4a1a15ad4e8d1a0f8fe6fe Mon Sep 17 00:00:00 2001 From: Rebecca Scott Date: Tue, 17 Mar 2020 11:51:50 +1000 Subject: [PATCH 02/16] Remove unnecessary use statement --- includes/tracks/events/class-wc-products-tracking.php | 1 - 1 file changed, 1 deletion(-) diff --git a/includes/tracks/events/class-wc-products-tracking.php b/includes/tracks/events/class-wc-products-tracking.php index a3378c0e124..a51ec4e2940 100644 --- a/includes/tracks/events/class-wc-products-tracking.php +++ b/includes/tracks/events/class-wc-products-tracking.php @@ -6,7 +6,6 @@ */ use Automattic\Jetpack\Constants; -use \Automattic\WooCommerce\Admin\API\Reports\Products\DataStore as ProductsDataStore; defined( 'ABSPATH' ) || exit; From 928529880d374554cd4e284a1640d75fdadcead5 Mon Sep 17 00:00:00 2001 From: Rebecca Scott Date: Wed, 18 Mar 2020 13:14:31 +1000 Subject: [PATCH 03/16] Track viewing an order --- includes/tracks/class-wc-site-tracking.php | 2 + .../tracks/events/class-wc-order-tracking.php | 37 +++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 includes/tracks/events/class-wc-order-tracking.php diff --git a/includes/tracks/class-wc-site-tracking.php b/includes/tracks/class-wc-site-tracking.php index aa53aa2d2f8..a6cd8c0ff82 100644 --- a/includes/tracks/class-wc-site-tracking.php +++ b/includes/tracks/class-wc-site-tracking.php @@ -113,6 +113,7 @@ class WC_Site_Tracking { include_once WC_ABSPATH . 'includes/tracks/events/class-wc-settings-tracking.php'; include_once WC_ABSPATH . 'includes/tracks/events/class-wc-status-tracking.php'; include_once WC_ABSPATH . 'includes/tracks/events/class-wc-coupons-tracking.php'; + include_once WC_ABSPATH . 'includes/tracks/events/class-wc-order-tracking.php'; $tracking_classes = array( 'WC_Admin_Setup_Wizard_Tracking', @@ -123,6 +124,7 @@ class WC_Site_Tracking { 'WC_Settings_Tracking', 'WC_Status_Tracking', 'WC_Coupons_Tracking', + 'WC_Order_Tracking', ); foreach ( $tracking_classes as $tracking_class ) { diff --git a/includes/tracks/events/class-wc-order-tracking.php b/includes/tracks/events/class-wc-order-tracking.php new file mode 100644 index 00000000000..60011a6ebff --- /dev/null +++ b/includes/tracks/events/class-wc-order-tracking.php @@ -0,0 +1,37 @@ + $order->get_id(), + 'current_status' => $order->get_status(), + 'date_created' => $order->get_date_created(), + 'payment_method' => $order->get_payment_method(), + ); + + WC_Tracks::record_event( 'wcadmin_single_order_view', $properties ); + } +} + From 5eab1cbdba851a63383157f708ac35d01122a37d Mon Sep 17 00:00:00 2001 From: Rebecca Scott Date: Wed, 18 Mar 2020 15:10:14 +1000 Subject: [PATCH 04/16] Get product type instead of category IDs and split out virtual and downloadable --- includes/tracks/events/class-wc-products-tracking.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/includes/tracks/events/class-wc-products-tracking.php b/includes/tracks/events/class-wc-products-tracking.php index a51ec4e2940..161c5137570 100644 --- a/includes/tracks/events/class-wc-products-tracking.php +++ b/includes/tracks/events/class-wc-products-tracking.php @@ -39,11 +39,13 @@ class WC_Products_Tracking { WC_Tracks::record_event( 'product_edit', $properties ); - $product = new WC_Product( $product_id ); + $product_factory = new WC_Product_Factory(); + $product = $product_factory->get_product( $product_id ); $update_properties = array( 'product_id' => $product_id, - // 'product_type' => TODO where does this come from?? there is no product type, only category ids. - 'category_ids' => $product->get_category_ids(), + 'product_type' => $product->get_type(), + 'is_virtual' => $product->get_virtual(), + 'is_downloadable' => $product->get_downloadable(), 'manage_stock' => 0 == $product->get_manage_stock() ? 'N' : 'Y', // 'stock_quantity_update' => 'Y' TODO this may require hooking in to product edit at a lower level, which doesn't seem possible for an extension. // You can only get the current product, not the product before the update... From a4e6b48aa38e9c1c4aed624c0a244a486643e11e Mon Sep 17 00:00:00 2001 From: Rebecca Scott Date: Tue, 24 Mar 2020 11:18:46 +1000 Subject: [PATCH 05/16] Track when a coupon is created/updated --- includes/tracks/class-wc-site-tracking.php | 2 + .../events/class-wc-coupon-tracking.php | 38 +++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 includes/tracks/events/class-wc-coupon-tracking.php diff --git a/includes/tracks/class-wc-site-tracking.php b/includes/tracks/class-wc-site-tracking.php index a6cd8c0ff82..02464ad2232 100644 --- a/includes/tracks/class-wc-site-tracking.php +++ b/includes/tracks/class-wc-site-tracking.php @@ -114,6 +114,7 @@ class WC_Site_Tracking { include_once WC_ABSPATH . 'includes/tracks/events/class-wc-status-tracking.php'; include_once WC_ABSPATH . 'includes/tracks/events/class-wc-coupons-tracking.php'; include_once WC_ABSPATH . 'includes/tracks/events/class-wc-order-tracking.php'; + include_once WC_ABSPATH . 'includes/tracks/events/class-wc-coupon-tracking.php'; $tracking_classes = array( 'WC_Admin_Setup_Wizard_Tracking', @@ -125,6 +126,7 @@ class WC_Site_Tracking { 'WC_Status_Tracking', 'WC_Coupons_Tracking', 'WC_Order_Tracking', + 'WC_Coupon_Tracking', ); foreach ( $tracking_classes as $tracking_class ) { diff --git a/includes/tracks/events/class-wc-coupon-tracking.php b/includes/tracks/events/class-wc-coupon-tracking.php new file mode 100644 index 00000000000..f85b7b3f807 --- /dev/null +++ b/includes/tracks/events/class-wc-coupon-tracking.php @@ -0,0 +1,38 @@ + $coupon->get_code(), + 'free_shipping' => $coupon->get_free_shipping(), + 'individual_use' => $coupon->get_individual_use(), + 'exclude_sale_items' => $coupon->get_exclude_sale_items(), + 'usage_limits_applied' => 0 < intval( $coupon->get_usage_limit() ) + || 0 < intval( $coupon->get_usage_limit_per_user() ) + || 0 < intval( $coupon->get_limit_usage_to_x_items() ), + ); + + WC_Tracks::record_event( 'coupon_add', $properties ); + } +} From f580b34aa7661a3c7a58d018b27486f9ccbcc6d3 Mon Sep 17 00:00:00 2001 From: Rebecca Scott Date: Tue, 24 Mar 2020 12:03:36 +1000 Subject: [PATCH 06/16] Add tracks for quantity updates --- .../tracks/events/class-wc-products-tracking.php | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/includes/tracks/events/class-wc-products-tracking.php b/includes/tracks/events/class-wc-products-tracking.php index 161c5137570..3af4281850b 100644 --- a/includes/tracks/events/class-wc-products-tracking.php +++ b/includes/tracks/events/class-wc-products-tracking.php @@ -20,6 +20,8 @@ class WC_Products_Tracking { add_action( 'edit_post', array( $this, 'track_product_updated' ), 10, 2 ); add_action( 'transition_post_status', array( $this, 'track_product_published' ), 10, 3 ); add_action( 'created_product_cat', array( $this, 'track_product_category_created' ) ); + add_action( 'woocommerce_variation_set_stock', array( $this, 'track_product_stock_level_set' ), 10, 1 ); + add_action( 'woocommerce_product_set_stock', array( $this, 'track_product_stock_level_set' ), 10, 1 ); } /** @@ -54,6 +56,19 @@ class WC_Products_Tracking { WC_Tracks::record_event( 'product_update', $update_properties ); } + /** + * Send a Tracks event when a product's stock level is adjusted. + * + * @param WC_Product $product Product. + */ + public function track_product_stock_level_set( $product ) { + $properties = array( + 'product_id' => $product->get_id(), + ); + + WC_Tracks::record_event( 'product_stock_level_set', $properties ); + } + /** * Send a Tracks event when a product is published. * From 496b602eb4ea1c92f3241d78aac6ee5d56610b77 Mon Sep 17 00:00:00 2001 From: Rebecca Scott Date: Tue, 24 Mar 2020 12:09:32 +1000 Subject: [PATCH 07/16] Remove commented out stock quantity value --- includes/tracks/events/class-wc-products-tracking.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/includes/tracks/events/class-wc-products-tracking.php b/includes/tracks/events/class-wc-products-tracking.php index 3af4281850b..c4de27b8483 100644 --- a/includes/tracks/events/class-wc-products-tracking.php +++ b/includes/tracks/events/class-wc-products-tracking.php @@ -49,8 +49,6 @@ class WC_Products_Tracking { 'is_virtual' => $product->get_virtual(), 'is_downloadable' => $product->get_downloadable(), 'manage_stock' => 0 == $product->get_manage_stock() ? 'N' : 'Y', - // 'stock_quantity_update' => 'Y' TODO this may require hooking in to product edit at a lower level, which doesn't seem possible for an extension. - // You can only get the current product, not the product before the update... ); WC_Tracks::record_event( 'product_update', $update_properties ); From 75a9971e9d5b6d3c44ee7ef4cea18b54dcee1b3f Mon Sep 17 00:00:00 2001 From: Rebecca Scott Date: Wed, 25 Mar 2020 13:04:54 +1000 Subject: [PATCH 08/16] Fix single_order_view event name --- includes/tracks/events/class-wc-order-tracking.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/tracks/events/class-wc-order-tracking.php b/includes/tracks/events/class-wc-order-tracking.php index 60011a6ebff..e4effe7766c 100644 --- a/includes/tracks/events/class-wc-order-tracking.php +++ b/includes/tracks/events/class-wc-order-tracking.php @@ -31,7 +31,7 @@ class WC_Order_Tracking { 'payment_method' => $order->get_payment_method(), ); - WC_Tracks::record_event( 'wcadmin_single_order_view', $properties ); + WC_Tracks::record_event( 'single_order_view', $properties ); } } From 768a3a3f4f5c59b35479939a0d15c78ffde8a7a8 Mon Sep 17 00:00:00 2001 From: Rebecca Scott Date: Thu, 26 Mar 2020 10:55:31 +1000 Subject: [PATCH 09/16] Track product updates using client side scripting to avoid double bouncing on the server --- .../events/class-wc-products-tracking.php | 47 ++++++++++++++----- 1 file changed, 36 insertions(+), 11 deletions(-) diff --git a/includes/tracks/events/class-wc-products-tracking.php b/includes/tracks/events/class-wc-products-tracking.php index c4de27b8483..10e65244ac4 100644 --- a/includes/tracks/events/class-wc-products-tracking.php +++ b/includes/tracks/events/class-wc-products-tracking.php @@ -22,13 +22,14 @@ class WC_Products_Tracking { add_action( 'created_product_cat', array( $this, 'track_product_category_created' ) ); add_action( 'woocommerce_variation_set_stock', array( $this, 'track_product_stock_level_set' ), 10, 1 ); add_action( 'woocommerce_product_set_stock', array( $this, 'track_product_stock_level_set' ), 10, 1 ); + add_action( 'add_meta_boxes_product', array( $this, 'track_product_updated_client_side' ), 10, 1 ); } /** * Send some Tracks events when a product is updated. * * @param int $product_id Product id. - * @param object $post WordPress post. + * @param object $post WordPress post. */ public function track_product_updated( $product_id, $post ) { if ( 'product' !== $post->post_type ) { @@ -40,18 +41,42 @@ class WC_Products_Tracking { ); WC_Tracks::record_event( 'product_edit', $properties ); + } - $product_factory = new WC_Product_Factory(); - $product = $product_factory->get_product( $product_id ); - $update_properties = array( - 'product_id' => $product_id, - 'product_type' => $product->get_type(), - 'is_virtual' => $product->get_virtual(), - 'is_downloadable' => $product->get_downloadable(), - 'manage_stock' => 0 == $product->get_manage_stock() ? 'N' : 'Y', + /** + * Track the Update button being clicked on the client side. + * This is needed because `track_product_updated` (using the `edit_post` + * hook) is called in response to a number of other triggers. + * + * @param WP_Post $post The post, not used. + */ + public function track_product_updated_client_side( $post ) { + wc_enqueue_js( + " + if ( $( 'h1.wp-heading-inline' ).text().trim() === 'Edit product') { + const initialStockValue = $( '#_stock' ).val(); + let hasRecordedEvent = false; + + $( '#publish' ).click( function() { + if ( hasRecordedEvent ) { + return; + } + + const currentStockValue = $( '#_stock' ).val(); + const properties = { + product_type: $( '#product-type' ).val(), + is_virtual: $( '#_virtual' ).is( ':checked' ) ? 'Y' : 'N', + is_downloadable: $( '#_downloadable' ).is( ':checked' ) ? 'Y' : 'N', + manage_stock: $( '#_manage_stock' ).is( ':checked' ) ? 'Y' : 'N', + stock_quantity_update: ( initialStockValue != currentStockValue ) ? 'Y' : 'N', + }; + + window.wcTracks.recordEvent( 'product_update', properties ); + hasRecordedEvent = true; + } ); + } + " ); - - WC_Tracks::record_event( 'product_update', $update_properties ); } /** From db6a4c630fa3cfc4eb48c3fdf0951371bc290cd9 Mon Sep 17 00:00:00 2001 From: Rebecca Scott Date: Thu, 26 Mar 2020 11:09:37 +1000 Subject: [PATCH 10/16] fix coupon tracking method name --- includes/tracks/events/class-wc-coupon-tracking.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/tracks/events/class-wc-coupon-tracking.php b/includes/tracks/events/class-wc-coupon-tracking.php index f85b7b3f807..1f596fc8cec 100644 --- a/includes/tracks/events/class-wc-coupon-tracking.php +++ b/includes/tracks/events/class-wc-coupon-tracking.php @@ -13,7 +13,7 @@ class WC_Coupon_Tracking { * Init */ public function init() { - add_action( 'woocommerce_coupon_object_updated_props', array( $this, 'track_coupon_created' ), 10, 3 ); + add_action( 'woocommerce_coupon_object_updated_props', array( $this, 'track_coupon_updated' ), 10, 3 ); } /** From 17d5f42228855c6b2062ad11eb5ddc1ca265d01a Mon Sep 17 00:00:00 2001 From: Rebecca Scott Date: Thu, 26 Mar 2020 11:12:26 +1000 Subject: [PATCH 11/16] remove order id from order tracking as it isn't required --- includes/tracks/events/class-wc-order-tracking.php | 1 - 1 file changed, 1 deletion(-) diff --git a/includes/tracks/events/class-wc-order-tracking.php b/includes/tracks/events/class-wc-order-tracking.php index e4effe7766c..fb0589517e0 100644 --- a/includes/tracks/events/class-wc-order-tracking.php +++ b/includes/tracks/events/class-wc-order-tracking.php @@ -25,7 +25,6 @@ class WC_Order_Tracking { */ public function track_order_viewed( $order ) { $properties = array( - 'order_id' => $order->get_id(), 'current_status' => $order->get_status(), 'date_created' => $order->get_date_created(), 'payment_method' => $order->get_payment_method(), From 5a45d6a3f29951f7107cd21f223c1a0cc23e5089 Mon Sep 17 00:00:00 2001 From: Rebecca Scott Date: Fri, 27 Mar 2020 14:51:26 +1000 Subject: [PATCH 12/16] Use var instead of const/let because IE11 --- includes/tracks/events/class-wc-products-tracking.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/includes/tracks/events/class-wc-products-tracking.php b/includes/tracks/events/class-wc-products-tracking.php index 10e65244ac4..1b6e2c62d04 100644 --- a/includes/tracks/events/class-wc-products-tracking.php +++ b/includes/tracks/events/class-wc-products-tracking.php @@ -54,16 +54,16 @@ class WC_Products_Tracking { wc_enqueue_js( " if ( $( 'h1.wp-heading-inline' ).text().trim() === 'Edit product') { - const initialStockValue = $( '#_stock' ).val(); - let hasRecordedEvent = false; + var initialStockValue = $( '#_stock' ).val(); + var hasRecordedEvent = false; $( '#publish' ).click( function() { if ( hasRecordedEvent ) { return; } - const currentStockValue = $( '#_stock' ).val(); - const properties = { + var currentStockValue = $( '#_stock' ).val(); + var properties = { product_type: $( '#product-type' ).val(), is_virtual: $( '#_virtual' ).is( ':checked' ) ? 'Y' : 'N', is_downloadable: $( '#_downloadable' ).is( ':checked' ) ? 'Y' : 'N', From b31878440ee485404d890cbba23c9defb9163856 Mon Sep 17 00:00:00 2001 From: Rebecca Scott Date: Fri, 27 Mar 2020 14:52:24 +1000 Subject: [PATCH 13/16] Revert function event --- includes/tracks/events/class-wc-products-tracking.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/tracks/events/class-wc-products-tracking.php b/includes/tracks/events/class-wc-products-tracking.php index 1b6e2c62d04..9bdaa68f64b 100644 --- a/includes/tracks/events/class-wc-products-tracking.php +++ b/includes/tracks/events/class-wc-products-tracking.php @@ -26,7 +26,7 @@ class WC_Products_Tracking { } /** - * Send some Tracks events when a product is updated. + * Send a Tracks event when a product is updated. * * @param int $product_id Product id. * @param object $post WordPress post. From 39f654124c8a618cfbb62dd04dc142673a40d5de Mon Sep 17 00:00:00 2001 From: Rebecca Scott Date: Fri, 27 Mar 2020 14:54:48 +1000 Subject: [PATCH 14/16] Fix event name --- includes/tracks/events/class-wc-coupon-tracking.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/tracks/events/class-wc-coupon-tracking.php b/includes/tracks/events/class-wc-coupon-tracking.php index 1f596fc8cec..28ed1fa1b7e 100644 --- a/includes/tracks/events/class-wc-coupon-tracking.php +++ b/includes/tracks/events/class-wc-coupon-tracking.php @@ -33,6 +33,6 @@ class WC_Coupon_Tracking { || 0 < intval( $coupon->get_limit_usage_to_x_items() ), ); - WC_Tracks::record_event( 'coupon_add', $properties ); + WC_Tracks::record_event( 'coupon_updated', $properties ); } } From 4136a42e1ef407fb0b10800252abd55641cde083 Mon Sep 17 00:00:00 2001 From: Rebecca Scott Date: Fri, 27 Mar 2020 15:19:18 +1000 Subject: [PATCH 15/16] Just include the ISO8601 date instead of the full WC_DateTime object --- includes/tracks/events/class-wc-order-tracking.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/includes/tracks/events/class-wc-order-tracking.php b/includes/tracks/events/class-wc-order-tracking.php index fb0589517e0..7e02a398989 100644 --- a/includes/tracks/events/class-wc-order-tracking.php +++ b/includes/tracks/events/class-wc-order-tracking.php @@ -26,7 +26,7 @@ class WC_Order_Tracking { public function track_order_viewed( $order ) { $properties = array( 'current_status' => $order->get_status(), - 'date_created' => $order->get_date_created(), + 'date_created' => $order->get_date_created()->format( DateTime::ATOM ), 'payment_method' => $order->get_payment_method(), ); From e998cc963c2aa75f7de62b53253262a003370da1 Mon Sep 17 00:00:00 2001 From: Rebecca Scott Date: Fri, 27 Mar 2020 15:23:51 +1000 Subject: [PATCH 16/16] Remove stock level set tracking as this is done in JS now --- .../tracks/events/class-wc-products-tracking.php | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/includes/tracks/events/class-wc-products-tracking.php b/includes/tracks/events/class-wc-products-tracking.php index 9bdaa68f64b..bb9639ba58e 100644 --- a/includes/tracks/events/class-wc-products-tracking.php +++ b/includes/tracks/events/class-wc-products-tracking.php @@ -20,8 +20,6 @@ class WC_Products_Tracking { add_action( 'edit_post', array( $this, 'track_product_updated' ), 10, 2 ); add_action( 'transition_post_status', array( $this, 'track_product_published' ), 10, 3 ); add_action( 'created_product_cat', array( $this, 'track_product_category_created' ) ); - add_action( 'woocommerce_variation_set_stock', array( $this, 'track_product_stock_level_set' ), 10, 1 ); - add_action( 'woocommerce_product_set_stock', array( $this, 'track_product_stock_level_set' ), 10, 1 ); add_action( 'add_meta_boxes_product', array( $this, 'track_product_updated_client_side' ), 10, 1 ); } @@ -79,19 +77,6 @@ class WC_Products_Tracking { ); } - /** - * Send a Tracks event when a product's stock level is adjusted. - * - * @param WC_Product $product Product. - */ - public function track_product_stock_level_set( $product ) { - $properties = array( - 'product_id' => $product->get_id(), - ); - - WC_Tracks::record_event( 'product_stock_level_set', $properties ); - } - /** * Send a Tracks event when a product is published. *