initial commit
This commit is contained in:
176
includes/tracks/events/class-wc-admin-setup-wizard-tracking.php
Normal file
176
includes/tracks/events/class-wc-admin-setup-wizard-tracking.php
Normal file
@ -0,0 +1,176 @@
|
||||
<?php
|
||||
/**
|
||||
* WooCommerce Admin Setup Wizard Tracking
|
||||
*
|
||||
* @package WooCommerce\Tracks
|
||||
*
|
||||
* @deprecated 4.6.0
|
||||
*/
|
||||
|
||||
defined( 'ABSPATH' ) || exit;
|
||||
|
||||
/**
|
||||
* This class adds actions to track usage of the WooCommerce Onboarding Wizard.
|
||||
*/
|
||||
class WC_Admin_Setup_Wizard_Tracking {
|
||||
/**
|
||||
* Steps for the setup wizard
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private $steps = array();
|
||||
|
||||
/**
|
||||
* Init tracking.
|
||||
*
|
||||
* @deprecated 4.6.0
|
||||
*/
|
||||
public function init() {
|
||||
_deprecated_function( __CLASS__ . '::' . __FUNCTION__, '4.6.0', __( 'Onboarding is maintained in WooCommerce Admin.', 'woocommerce' ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the name of the current step.
|
||||
*
|
||||
* @deprecated 4.6.0
|
||||
* @return string
|
||||
*/
|
||||
public function get_current_step() {
|
||||
_deprecated_function( __CLASS__ . '::' . __FUNCTION__, '4.6.0', __( 'Onboarding is maintained in WooCommerce Admin.', 'woocommerce' ) );
|
||||
return isset( $_GET['step'] ) ? sanitize_key( $_GET['step'] ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
|
||||
}
|
||||
|
||||
/**
|
||||
* Add footer scripts to OBW via woocommerce_setup_footer
|
||||
*
|
||||
* @deprecated 4.6.0
|
||||
*/
|
||||
public function add_footer_scripts() {
|
||||
_deprecated_function( __CLASS__ . '::' . __FUNCTION__, '4.6.0', __( 'Onboarding is maintained in WooCommerce Admin.', 'woocommerce' ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Dequeue unwanted scripts from OBW footer.
|
||||
*
|
||||
* @deprecated 4.6.0
|
||||
*/
|
||||
public function dequeue_non_allowed_scripts() {
|
||||
_deprecated_function( __CLASS__ . '::' . __FUNCTION__, '4.6.0', __( 'Onboarding is maintained in WooCommerce Admin.', 'woocommerce' ) );
|
||||
global $wp_scripts;
|
||||
$allowed = array( 'woo-tracks' );
|
||||
|
||||
foreach ( $wp_scripts->queue as $script ) {
|
||||
if ( in_array( $script, $allowed, true ) ) {
|
||||
continue;
|
||||
}
|
||||
wp_dequeue_script( $script );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Track when tracking is opted into and OBW has started.
|
||||
*
|
||||
* @param string $option Option name.
|
||||
* @param string $value Option value.
|
||||
*
|
||||
* @deprecated 4.6.0
|
||||
*/
|
||||
public function track_start( $option, $value ) {
|
||||
_deprecated_function( __CLASS__ . '::' . __FUNCTION__, '4.6.0', __( 'Onboarding is maintained in WooCommerce Admin.', 'woocommerce' ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Track the marketing form on submit.
|
||||
*
|
||||
* @deprecated 4.6.0
|
||||
*/
|
||||
public function track_ready_next_steps() {
|
||||
_deprecated_function( __CLASS__ . '::' . __FUNCTION__, '4.6.0', __( 'Onboarding is maintained in WooCommerce Admin.', 'woocommerce' ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Track various events when a step is saved.
|
||||
*
|
||||
* @deprecated 4.6.0
|
||||
*/
|
||||
public function add_step_save_events() {
|
||||
_deprecated_function( __CLASS__ . '::' . __FUNCTION__, '4.6.0', __( 'Onboarding is maintained in WooCommerce Admin.', 'woocommerce' ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Track store setup and store properties on save.
|
||||
*
|
||||
* @deprecated 4.6.0
|
||||
*/
|
||||
public function track_store_setup() {
|
||||
_deprecated_function( __CLASS__ . '::' . __FUNCTION__, '4.6.0', __( 'Onboarding is maintained in WooCommerce Admin.', 'woocommerce' ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Track payment gateways selected.
|
||||
*
|
||||
* @deprecated 4.6.0
|
||||
*/
|
||||
public function track_payments() {
|
||||
_deprecated_function( __CLASS__ . '::' . __FUNCTION__, '4.6.0', __( 'Onboarding is maintained in WooCommerce Admin.', 'woocommerce' ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Track shipping units and whether or not labels are set.
|
||||
*
|
||||
* @deprecated 4.6.0
|
||||
*/
|
||||
public function track_shipping() {
|
||||
_deprecated_function( __CLASS__ . '::' . __FUNCTION__, '4.6.0', __( 'Onboarding is maintained in WooCommerce Admin.', 'woocommerce' ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Track recommended plugins selected for install.
|
||||
*
|
||||
* @deprecated 4.6.0
|
||||
*/
|
||||
public function track_recommended() {
|
||||
_deprecated_function( __CLASS__ . '::' . __FUNCTION__, '4.6.0', __( 'Onboarding is maintained in WooCommerce Admin.', 'woocommerce' ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Tracks when Jetpack is activated through the OBW.
|
||||
*
|
||||
* @deprecated 4.6.0
|
||||
*/
|
||||
public function track_jetpack_activate() {
|
||||
_deprecated_function( __CLASS__ . '::' . __FUNCTION__, '4.6.0', __( 'Onboarding is maintained in WooCommerce Admin.', 'woocommerce' ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Tracks when last next_steps screen is viewed in the OBW.
|
||||
*
|
||||
* @deprecated 4.6.0
|
||||
*/
|
||||
public function track_next_steps() {
|
||||
_deprecated_function( __CLASS__ . '::' . __FUNCTION__, '4.6.0', __( 'Onboarding is maintained in WooCommerce Admin.', 'woocommerce' ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Track skipped steps.
|
||||
*
|
||||
* @deprecated 4.6.0
|
||||
*/
|
||||
public function track_skip_step() {
|
||||
_deprecated_function( __CLASS__ . '::' . __FUNCTION__, '4.6.0', __( 'Onboarding is maintained in WooCommerce Admin.', 'woocommerce' ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the OBW steps inside this class instance.
|
||||
*
|
||||
* @param array $steps Array of OBW steps.
|
||||
*
|
||||
* @deprecated 4.6.0
|
||||
*/
|
||||
public function set_obw_steps( $steps ) {
|
||||
_deprecated_function( __CLASS__ . '::' . __FUNCTION__, '4.6.0', __( 'Onboarding is maintained in WooCommerce Admin.', 'woocommerce' ) );
|
||||
$this->steps = $steps;
|
||||
|
||||
return $steps;
|
||||
}
|
||||
}
|
39
includes/tracks/events/class-wc-coupon-tracking.php
Normal file
39
includes/tracks/events/class-wc-coupon-tracking.php
Normal file
@ -0,0 +1,39 @@
|
||||
<?php
|
||||
/**
|
||||
* WooCommerce Coupon Tracking
|
||||
*
|
||||
* @package WooCommerce\Tracks
|
||||
*/
|
||||
|
||||
/**
|
||||
* This class adds actions to track usage of a WooCommerce Coupon.
|
||||
*/
|
||||
class WC_Coupon_Tracking {
|
||||
|
||||
/**
|
||||
* Init tracking.
|
||||
*/
|
||||
public function init() {
|
||||
add_action( 'woocommerce_coupon_object_updated_props', array( $this, 'track_coupon_updated' ), 10, 2 );
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a Tracks event when a coupon is updated.
|
||||
*
|
||||
* @param WC_Coupon $coupon The coupon that has been updated.
|
||||
* @param Array $updated_props The props of the coupon that have been updated.
|
||||
*/
|
||||
public function track_coupon_updated( $coupon, $updated_props ) {
|
||||
$properties = array(
|
||||
'discount_code' => $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_updated', $properties );
|
||||
}
|
||||
}
|
73
includes/tracks/events/class-wc-coupons-tracking.php
Normal file
73
includes/tracks/events/class-wc-coupons-tracking.php
Normal file
@ -0,0 +1,73 @@
|
||||
<?php
|
||||
/**
|
||||
* WooCommerce Coupons Tracking
|
||||
*
|
||||
* @package WooCommerce\Tracks
|
||||
*/
|
||||
|
||||
defined( 'ABSPATH' ) || exit;
|
||||
|
||||
/**
|
||||
* This class adds actions to track usage of WooCommerce Orders.
|
||||
*/
|
||||
class WC_Coupons_Tracking {
|
||||
/**
|
||||
* Init tracking.
|
||||
*/
|
||||
public function init() {
|
||||
add_action( 'load-edit.php', array( $this, 'tracks_coupons_events' ), 10 );
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a listener on the "Apply" button to track bulk actions.
|
||||
*/
|
||||
public function tracks_coupons_bulk_actions() {
|
||||
wc_enqueue_js(
|
||||
"
|
||||
function onApplyBulkActions( event ) {
|
||||
var id = event.data.id;
|
||||
var action = $( '#' + id ).val();
|
||||
|
||||
if ( action && '-1' !== action ) {
|
||||
window.wcTracks.recordEvent( 'coupons_view_bulk_action', {
|
||||
action: action
|
||||
} );
|
||||
}
|
||||
}
|
||||
$( '#doaction' ).on( 'click', { id: 'bulk-action-selector-top' }, onApplyBulkActions );
|
||||
$( '#doaction2' ).on( 'click', { id: 'bulk-action-selector-bottom' }, onApplyBulkActions );
|
||||
"
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Track page view events.
|
||||
*/
|
||||
public function tracks_coupons_events() {
|
||||
if ( isset( $_GET['post_type'] ) && 'shop_coupon' === $_GET['post_type'] ) {
|
||||
|
||||
$this->tracks_coupons_bulk_actions();
|
||||
|
||||
WC_Tracks::record_event(
|
||||
'coupons_view',
|
||||
array(
|
||||
'status' => isset( $_GET['post_status'] ) ? sanitize_text_field( wp_unslash( $_GET['post_status'] ) ) : 'all',
|
||||
)
|
||||
);
|
||||
|
||||
if ( isset( $_GET['filter_action'] ) && 'Filter' === sanitize_text_field( wp_unslash( $_GET['filter_action'] ) ) && isset( $_GET['coupon_type'] ) ) {
|
||||
WC_Tracks::record_event(
|
||||
'coupons_filter',
|
||||
array(
|
||||
'filter' => 'coupon_type',
|
||||
'value' => sanitize_text_field( wp_unslash( $_GET['coupon_type'] ) ),
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
if ( isset( $_GET['s'] ) && 0 < strlen( sanitize_text_field( wp_unslash( $_GET['s'] ) ) ) ) {
|
||||
WC_Tracks::record_event( 'coupons_search' );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
101
includes/tracks/events/class-wc-extensions-tracking.php
Normal file
101
includes/tracks/events/class-wc-extensions-tracking.php
Normal file
@ -0,0 +1,101 @@
|
||||
<?php
|
||||
/**
|
||||
* WooCommerce Extensions Tracking
|
||||
*
|
||||
* @package WooCommerce\Tracks
|
||||
*/
|
||||
|
||||
defined( 'ABSPATH' ) || exit;
|
||||
|
||||
/**
|
||||
* This class adds actions to track usage of the WooCommerce Extensions page.
|
||||
*/
|
||||
class WC_Extensions_Tracking {
|
||||
/**
|
||||
* Init tracking.
|
||||
*/
|
||||
public function init() {
|
||||
add_action( 'load-woocommerce_page_wc-addons', array( $this, 'track_extensions_page' ) );
|
||||
add_action( 'woocommerce_helper_connect_start', array( $this, 'track_helper_connection_start' ) );
|
||||
add_action( 'woocommerce_helper_denied', array( $this, 'track_helper_connection_cancelled' ) );
|
||||
add_action( 'woocommerce_helper_connected', array( $this, 'track_helper_connection_complete' ) );
|
||||
add_action( 'woocommerce_helper_disconnected', array( $this, 'track_helper_disconnected' ) );
|
||||
add_action( 'woocommerce_helper_subscriptions_refresh', array( $this, 'track_helper_subscriptions_refresh' ) );
|
||||
add_action( 'woocommerce_addon_installed', array( $this, 'track_addon_install' ), 10, 2 );
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a Tracks event when an Extensions page is viewed.
|
||||
*/
|
||||
public function track_extensions_page() {
|
||||
// phpcs:disable WordPress.Security.NonceVerification.Recommended
|
||||
$properties = array(
|
||||
'section' => empty( $_REQUEST['section'] ) ? '_featured' : wc_clean( wp_unslash( $_REQUEST['section'] ) ),
|
||||
);
|
||||
|
||||
$event = 'extensions_view';
|
||||
if ( 'helper' === $properties['section'] ) {
|
||||
$event = 'subscriptions_view';
|
||||
}
|
||||
|
||||
if ( ! empty( $_REQUEST['search'] ) ) {
|
||||
$event = 'extensions_view_search';
|
||||
$properties['search_term'] = wc_clean( wp_unslash( $_REQUEST['search'] ) );
|
||||
}
|
||||
// phpcs:enable
|
||||
|
||||
WC_Tracks::record_event( $event, $properties );
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a Tracks even when a Helper connection process is initiated.
|
||||
*/
|
||||
public function track_helper_connection_start() {
|
||||
WC_Tracks::record_event( 'extensions_subscriptions_connect' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a Tracks even when a Helper connection process is cancelled.
|
||||
*/
|
||||
public function track_helper_connection_cancelled() {
|
||||
WC_Tracks::record_event( 'extensions_subscriptions_cancelled' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a Tracks even when a Helper connection process completed successfully.
|
||||
*/
|
||||
public function track_helper_connection_complete() {
|
||||
WC_Tracks::record_event( 'extensions_subscriptions_connected' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a Tracks even when a Helper has been disconnected.
|
||||
*/
|
||||
public function track_helper_disconnected() {
|
||||
WC_Tracks::record_event( 'extensions_subscriptions_disconnect' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a Tracks even when Helper subscriptions are refreshed.
|
||||
*/
|
||||
public function track_helper_subscriptions_refresh() {
|
||||
WC_Tracks::record_event( 'extensions_subscriptions_update' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a Tracks event when addon is installed via the Extensions page.
|
||||
*
|
||||
* @param string $addon_id Addon slug.
|
||||
* @param string $section Extensions tab.
|
||||
*/
|
||||
public function track_addon_install( $addon_id, $section ) {
|
||||
$properties = array(
|
||||
'context' => 'extensions',
|
||||
'section' => $section,
|
||||
);
|
||||
|
||||
if ( 'woocommerce-payments' === $addon_id ) {
|
||||
WC_Tracks::record_event( 'woocommerce_payments_install', $properties );
|
||||
}
|
||||
}
|
||||
}
|
83
includes/tracks/events/class-wc-importer-tracking.php
Normal file
83
includes/tracks/events/class-wc-importer-tracking.php
Normal file
@ -0,0 +1,83 @@
|
||||
<?php
|
||||
/**
|
||||
* WooCommerce Import Tracking
|
||||
*
|
||||
* @package WooCommerce\Tracks
|
||||
*/
|
||||
|
||||
defined( 'ABSPATH' ) || exit;
|
||||
|
||||
/**
|
||||
* This class adds actions to track usage of WooCommerce Imports.
|
||||
*/
|
||||
class WC_Importer_Tracking {
|
||||
/**
|
||||
* Init tracking.
|
||||
*/
|
||||
public function init() {
|
||||
add_action( 'product_page_product_importer', array( $this, 'track_product_importer' ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Route product importer action to the right callback.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function track_product_importer() {
|
||||
// phpcs:disable WordPress.Security.NonceVerification.Recommended
|
||||
if ( ! isset( $_REQUEST['step'] ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( 'import' === $_REQUEST['step'] ) {
|
||||
return $this->track_product_importer_start();
|
||||
}
|
||||
|
||||
if ( 'done' === $_REQUEST['step'] ) {
|
||||
return $this->track_product_importer_complete();
|
||||
}
|
||||
// phpcs:enable
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a Tracks event when the product importer is started.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function track_product_importer_start() {
|
||||
// phpcs:disable WordPress.Security.NonceVerification.Recommended
|
||||
if ( ! isset( $_REQUEST['file'] ) || ! isset( $_REQUEST['_wpnonce'] ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$properties = array(
|
||||
'update_existing' => isset( $_REQUEST['update_existing'] ) ? (bool) $_REQUEST['update_existing'] : false,
|
||||
'delimiter' => empty( $_REQUEST['delimiter'] ) ? ',' : wc_clean( wp_unslash( $_REQUEST['delimiter'] ) ),
|
||||
);
|
||||
// phpcs:enable
|
||||
|
||||
WC_Tracks::record_event( 'product_import_start', $properties );
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a Tracks event when the product importer has finished.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function track_product_importer_complete() {
|
||||
// phpcs:disable WordPress.Security.NonceVerification.Recommended
|
||||
if ( ! isset( $_REQUEST['nonce'] ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$properties = array(
|
||||
'imported' => isset( $_GET['products-imported'] ) ? absint( $_GET['products-imported'] ) : 0,
|
||||
'updated' => isset( $_GET['products-updated'] ) ? absint( $_GET['products-updated'] ) : 0,
|
||||
'failed' => isset( $_GET['products-failed'] ) ? absint( $_GET['products-failed'] ) : 0,
|
||||
'skipped' => isset( $_GET['products-skipped'] ) ? absint( $_GET['products-skipped'] ) : 0,
|
||||
);
|
||||
// phpcs:enable
|
||||
|
||||
WC_Tracks::record_event( 'product_import_complete', $properties );
|
||||
}
|
||||
}
|
40
includes/tracks/events/class-wc-order-tracking.php
Normal file
40
includes/tracks/events/class-wc-order-tracking.php
Normal file
@ -0,0 +1,40 @@
|
||||
<?php
|
||||
/**
|
||||
* WooCommerce Order Tracking
|
||||
*
|
||||
* @package WooCommerce\Tracks
|
||||
*/
|
||||
|
||||
defined( 'ABSPATH' ) || exit;
|
||||
|
||||
/**
|
||||
* This class adds actions to track usage of a WooCommerce Order.
|
||||
*/
|
||||
class WC_Order_Tracking {
|
||||
|
||||
/**
|
||||
* Init tracking.
|
||||
*/
|
||||
public function init() {
|
||||
add_action( 'woocommerce_admin_order_data_after_order_details', array( $this, 'track_order_viewed' ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a Tracks event when an order is viewed.
|
||||
*
|
||||
* @param WC_Order $order Order.
|
||||
*/
|
||||
public function track_order_viewed( $order ) {
|
||||
if ( ! $order instanceof WC_Order || ! $order->get_id() ) {
|
||||
return;
|
||||
}
|
||||
$properties = array(
|
||||
'current_status' => $order->get_status(),
|
||||
'date_created' => $order->get_date_created() ? $order->get_date_created()->format( DateTime::ATOM ) : '',
|
||||
'payment_method' => $order->get_payment_method(),
|
||||
);
|
||||
|
||||
WC_Tracks::record_event( 'single_order_view', $properties );
|
||||
}
|
||||
}
|
||||
|
178
includes/tracks/events/class-wc-orders-tracking.php
Normal file
178
includes/tracks/events/class-wc-orders-tracking.php
Normal file
@ -0,0 +1,178 @@
|
||||
<?php
|
||||
/**
|
||||
* WooCommerce Orders Tracking
|
||||
*
|
||||
* @package WooCommerce\Tracks
|
||||
*/
|
||||
|
||||
defined( 'ABSPATH' ) || exit;
|
||||
|
||||
/**
|
||||
* This class adds actions to track usage of WooCommerce Orders.
|
||||
*/
|
||||
class WC_Orders_Tracking {
|
||||
/**
|
||||
* Init tracking.
|
||||
*/
|
||||
public function init() {
|
||||
add_action( 'woocommerce_order_status_changed', array( $this, 'track_order_status_change' ), 10, 3 );
|
||||
add_action( 'load-edit.php', array( $this, 'track_orders_view' ), 10 );
|
||||
add_action( 'pre_post_update', array( $this, 'track_created_date_change' ), 10 );
|
||||
// WC_Meta_Box_Order_Actions::save() hooks in at priority 50.
|
||||
add_action( 'woocommerce_process_shop_order_meta', array( $this, 'track_order_action' ), 51 );
|
||||
add_action( 'load-post-new.php', array( $this, 'track_add_order_from_edit' ), 10 );
|
||||
add_filter( 'woocommerce_shop_order_search_results', array( $this, 'track_order_search' ), 10, 3 );
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a track event when on the Order Listing page, and search results are being displayed.
|
||||
*
|
||||
* @param array $order_ids Array of order_ids that are matches for the search.
|
||||
* @param string $term The string that was used in the search.
|
||||
* @param array $search_fields Fields that were used in the original search.
|
||||
*/
|
||||
public function track_order_search( $order_ids, $term, $search_fields ) {
|
||||
// Since `woocommerce_shop_order_search_results` can run in the front-end context, exit if get_current_screen isn't defined.
|
||||
if ( ! function_exists( 'get_current_screen' ) ) {
|
||||
return $order_ids;
|
||||
}
|
||||
|
||||
$screen = get_current_screen();
|
||||
|
||||
// We only want to record this track when the filter is executed on the order listing page.
|
||||
if ( 'edit-shop_order' === $screen->id ) {
|
||||
// we are on the order listing page, and query results are being shown.
|
||||
WC_Tracks::record_event( 'orders_view_search' );
|
||||
}
|
||||
|
||||
return $order_ids;
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a Tracks event when the Orders page is viewed.
|
||||
*/
|
||||
public function track_orders_view() {
|
||||
if ( isset( $_GET['post_type'] ) && 'shop_order' === wp_unslash( $_GET['post_type'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
|
||||
|
||||
// phpcs:disable WordPress.Security.NonceVerification, WordPress.Security.ValidatedSanitizedInput
|
||||
$properties = array(
|
||||
'status' => isset( $_GET['post_status'] ) ? sanitize_text_field( $_GET['post_status'] ) : 'all',
|
||||
);
|
||||
// phpcs:enable
|
||||
|
||||
WC_Tracks::record_event( 'orders_view', $properties );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a Tracks event when an order status is changed.
|
||||
*
|
||||
* @param int $id Order id.
|
||||
* @param string $previous_status the old WooCommerce order status.
|
||||
* @param string $next_status the new WooCommerce order status.
|
||||
*/
|
||||
public function track_order_status_change( $id, $previous_status, $next_status ) {
|
||||
$order = wc_get_order( $id );
|
||||
|
||||
$properties = array(
|
||||
'order_id' => $id,
|
||||
'next_status' => $next_status,
|
||||
'previous_status' => $previous_status,
|
||||
'date_created' => $order->get_date_created() ? $order->get_date_created()->date( 'Y-m-d' ) : '',
|
||||
'payment_method' => $order->get_payment_method(),
|
||||
'order_total' => $order->get_total(),
|
||||
);
|
||||
|
||||
WC_Tracks::record_event( 'orders_edit_status_change', $properties );
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a Tracks event when an order date is changed.
|
||||
*
|
||||
* @param int $id Order id.
|
||||
*/
|
||||
public function track_created_date_change( $id ) {
|
||||
$post_type = get_post_type( $id );
|
||||
|
||||
if ( 'shop_order' !== $post_type ) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ( 'auto-draft' === get_post_status( $id ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$order = wc_get_order( $id );
|
||||
$date_created = $order->get_date_created() ? $order->get_date_created()->date( 'Y-m-d H:i:s' ) : '';
|
||||
// phpcs:disable WordPress.Security.NonceVerification
|
||||
$new_date = sprintf(
|
||||
'%s %2d:%2d:%2d',
|
||||
isset( $_POST['order_date'] ) ? wc_clean( wp_unslash( $_POST['order_date'] ) ) : '',
|
||||
isset( $_POST['order_date_hour'] ) ? wc_clean( wp_unslash( $_POST['order_date_hour'] ) ) : '',
|
||||
isset( $_POST['order_date_minute'] ) ? wc_clean( wp_unslash( $_POST['order_date_minute'] ) ) : '',
|
||||
isset( $_POST['order_date_second'] ) ? wc_clean( wp_unslash( $_POST['order_date_second'] ) ) : ''
|
||||
);
|
||||
// phpcs:enable
|
||||
|
||||
if ( $new_date !== $date_created ) {
|
||||
$properties = array(
|
||||
'order_id' => $id,
|
||||
'status' => $order->get_status(),
|
||||
);
|
||||
|
||||
WC_Tracks::record_event( 'order_edit_date_created', $properties );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Track order actions taken.
|
||||
*
|
||||
* @param int $order_id Order ID.
|
||||
*/
|
||||
public function track_order_action( $order_id ) {
|
||||
// phpcs:disable WordPress.Security.NonceVerification
|
||||
if ( ! empty( $_POST['wc_order_action'] ) ) {
|
||||
$order = wc_get_order( $order_id );
|
||||
$action = wc_clean( wp_unslash( $_POST['wc_order_action'] ) );
|
||||
$properties = array(
|
||||
'order_id' => $order_id,
|
||||
'status' => $order->get_status(),
|
||||
'action' => $action,
|
||||
);
|
||||
|
||||
WC_Tracks::record_event( 'order_edit_order_action', $properties );
|
||||
}
|
||||
// phpcs:enable
|
||||
}
|
||||
|
||||
/**
|
||||
* Track "add order" button on the Edit Order screen.
|
||||
*/
|
||||
public function track_add_order_from_edit() {
|
||||
// phpcs:ignore WordPress.Security.NonceVerification, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
|
||||
if ( isset( $_GET['post_type'] ) && 'shop_order' === wp_unslash( $_GET['post_type'] ) ) {
|
||||
$referer = wp_get_referer();
|
||||
|
||||
if ( $referer ) {
|
||||
$referring_page = wp_parse_url( $referer );
|
||||
$referring_args = array();
|
||||
$post_edit_page = wp_parse_url( admin_url( 'post.php' ) );
|
||||
|
||||
if ( ! empty( $referring_page['query'] ) ) {
|
||||
parse_str( $referring_page['query'], $referring_args );
|
||||
}
|
||||
|
||||
// Determine if we arrived from an Order Edit screen.
|
||||
if (
|
||||
$post_edit_page['path'] === $referring_page['path'] &&
|
||||
isset( $referring_args['action'] ) &&
|
||||
'edit' === $referring_args['action'] &&
|
||||
isset( $referring_args['post'] ) &&
|
||||
'shop_order' === get_post_type( $referring_args['post'] )
|
||||
) {
|
||||
WC_Tracks::record_event( 'order_edit_add_order' );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
211
includes/tracks/events/class-wc-products-tracking.php
Normal file
211
includes/tracks/events/class-wc-products-tracking.php
Normal file
@ -0,0 +1,211 @@
|
||||
<?php
|
||||
/**
|
||||
* WooCommerce Import Tracking
|
||||
*
|
||||
* @package WooCommerce\Tracks
|
||||
*/
|
||||
|
||||
use Automattic\Jetpack\Constants;
|
||||
|
||||
defined( 'ABSPATH' ) || exit;
|
||||
|
||||
/**
|
||||
* This class adds actions to track usage of WooCommerce Products.
|
||||
*/
|
||||
class WC_Products_Tracking {
|
||||
/**
|
||||
* Init tracking.
|
||||
*/
|
||||
public function init() {
|
||||
add_action( 'load-edit.php', array( $this, 'track_products_view' ), 10 );
|
||||
add_action( 'load-edit-tags.php', array( $this, 'track_categories_and_tags_view' ), 10, 2 );
|
||||
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( 'add_meta_boxes_product', array( $this, 'track_product_updated_client_side' ), 10 );
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a Tracks event when the Products page is viewed.
|
||||
*/
|
||||
public function track_products_view() {
|
||||
// We only record Tracks event when no `_wp_http_referer` query arg is set, since
|
||||
// when searching, the request gets sent from the browser twice,
|
||||
// once with the `_wp_http_referer` and once without it.
|
||||
//
|
||||
// Otherwise, we would double-record the view and search events.
|
||||
|
||||
// phpcs:disable WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification
|
||||
if (
|
||||
isset( $_GET['post_type'] )
|
||||
&& 'product' === wp_unslash( $_GET['post_type'] )
|
||||
&& ! isset( $_GET['_wp_http_referer'] )
|
||||
) {
|
||||
// phpcs:enable
|
||||
|
||||
WC_Tracks::record_event( 'products_view' );
|
||||
|
||||
// phpcs:disable WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification
|
||||
if (
|
||||
isset( $_GET['s'] )
|
||||
&& 0 < strlen( sanitize_text_field( wp_unslash( $_GET['s'] ) ) )
|
||||
) {
|
||||
// phpcs:enable
|
||||
|
||||
WC_Tracks::record_event( 'products_search' );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a Tracks event when the Products Categories and Tags page is viewed.
|
||||
*/
|
||||
public function track_categories_and_tags_view() {
|
||||
// We only record Tracks event when no `_wp_http_referer` query arg is set, since
|
||||
// when searching, the request gets sent from the browser twice,
|
||||
// once with the `_wp_http_referer` and once without it.
|
||||
//
|
||||
// Otherwise, we would double-record the view and search events.
|
||||
|
||||
// phpcs:disable WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification
|
||||
if (
|
||||
isset( $_GET['post_type'] )
|
||||
&& 'product' === wp_unslash( $_GET['post_type'] )
|
||||
&& isset( $_GET['taxonomy'] )
|
||||
&& ! isset( $_GET['_wp_http_referer'] )
|
||||
) {
|
||||
$taxonomy = wp_unslash( $_GET['taxonomy'] );
|
||||
// phpcs:enable
|
||||
|
||||
if ( 'product_cat' === $taxonomy ) {
|
||||
WC_Tracks::record_event( 'categories_view' );
|
||||
} elseif ( 'product_tag' === $taxonomy ) {
|
||||
WC_Tracks::record_event( 'tags_view' );
|
||||
}
|
||||
|
||||
// phpcs:disable WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification
|
||||
if (
|
||||
isset( $_GET['s'] )
|
||||
&& 0 < strlen( sanitize_text_field( wp_unslash( $_GET['s'] ) ) )
|
||||
) {
|
||||
// phpcs:enable
|
||||
|
||||
if ( 'product_cat' === $taxonomy ) {
|
||||
WC_Tracks::record_event( 'categories_search' );
|
||||
} elseif ( 'product_tag' === $taxonomy ) {
|
||||
WC_Tracks::record_event( 'tags_search' );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a Tracks event when a product is updated.
|
||||
*
|
||||
* @param int $product_id Product id.
|
||||
* @param object $post WordPress post.
|
||||
*/
|
||||
public function track_product_updated( $product_id, $post ) {
|
||||
if ( 'product' !== $post->post_type ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$properties = array(
|
||||
'product_id' => $product_id,
|
||||
);
|
||||
|
||||
WC_Tracks::record_event( 'product_edit', $properties );
|
||||
}
|
||||
|
||||
/**
|
||||
* 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', 'woocommerce' ) . "') {
|
||||
var initialStockValue = $( '#_stock' ).val();
|
||||
var hasRecordedEvent = false;
|
||||
|
||||
$( '#publish' ).on( 'click', function() {
|
||||
if ( hasRecordedEvent ) {
|
||||
return;
|
||||
}
|
||||
|
||||
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',
|
||||
manage_stock: $( '#_manage_stock' ).is( ':checked' ) ? 'Y' : 'N',
|
||||
stock_quantity_update: ( initialStockValue != currentStockValue ) ? 'Y' : 'N',
|
||||
};
|
||||
|
||||
window.wcTracks.recordEvent( 'product_update', properties );
|
||||
hasRecordedEvent = true;
|
||||
} );
|
||||
}
|
||||
"
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a Tracks event when a product is published.
|
||||
*
|
||||
* @param string $new_status New post_status.
|
||||
* @param string $old_status Previous post_status.
|
||||
* @param object $post WordPress post.
|
||||
*/
|
||||
public function track_product_published( $new_status, $old_status, $post ) {
|
||||
if (
|
||||
'product' !== $post->post_type ||
|
||||
'publish' !== $new_status ||
|
||||
'publish' === $old_status
|
||||
) {
|
||||
return;
|
||||
}
|
||||
|
||||
$properties = array(
|
||||
'product_id' => $post->ID,
|
||||
);
|
||||
|
||||
WC_Tracks::record_event( 'product_add_publish', $properties );
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a Tracks event when a product category is created.
|
||||
*
|
||||
* @param int $category_id Category ID.
|
||||
*/
|
||||
public function track_product_category_created( $category_id ) {
|
||||
// phpcs:disable WordPress.Security.NonceVerification.Missing
|
||||
// Only track category creation from the edit product screen or the
|
||||
// category management screen (which both occur via AJAX).
|
||||
if (
|
||||
! Constants::is_defined( 'DOING_AJAX' ) ||
|
||||
empty( $_POST['action'] ) ||
|
||||
(
|
||||
// Product Categories screen.
|
||||
'add-tag' !== $_POST['action'] &&
|
||||
// Edit Product screen.
|
||||
'add-product_cat' !== $_POST['action']
|
||||
)
|
||||
) {
|
||||
return;
|
||||
}
|
||||
|
||||
$category = get_term( $category_id, 'product_cat' );
|
||||
$properties = array(
|
||||
'category_id' => $category_id,
|
||||
'parent_id' => $category->parent,
|
||||
'page' => ( 'add-tag' === $_POST['action'] ) ? 'categories' : 'product',
|
||||
);
|
||||
// phpcs:enable
|
||||
|
||||
WC_Tracks::record_event( 'product_category_add', $properties );
|
||||
}
|
||||
}
|
118
includes/tracks/events/class-wc-settings-tracking.php
Normal file
118
includes/tracks/events/class-wc-settings-tracking.php
Normal file
@ -0,0 +1,118 @@
|
||||
<?php
|
||||
/**
|
||||
* WooCommerce Settings Tracking
|
||||
*
|
||||
* @package WooCommerce\Tracks
|
||||
*/
|
||||
|
||||
defined( 'ABSPATH' ) || exit;
|
||||
|
||||
/**
|
||||
* This class adds actions to track usage of WooCommerce Settings.
|
||||
*/
|
||||
class WC_Settings_Tracking {
|
||||
|
||||
/**
|
||||
* List of allowed WooCommerce settings to potentially track updates for.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $allowed_options = array();
|
||||
|
||||
/**
|
||||
* WooCommerce settings that have been updated (and will be tracked).
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $updated_options = array();
|
||||
|
||||
/**
|
||||
* Init tracking.
|
||||
*/
|
||||
public function init() {
|
||||
add_action( 'woocommerce_settings_page_init', array( $this, 'track_settings_page_view' ) );
|
||||
add_action( 'woocommerce_update_option', array( $this, 'add_option_to_list' ) );
|
||||
add_action( 'woocommerce_update_options', array( $this, 'send_settings_change_event' ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a WooCommerce option name to our allowed options list and attach
|
||||
* the `update_option` hook. Rather than inspecting every updated
|
||||
* option and pattern matching for "woocommerce", just build a dynamic
|
||||
* list for WooCommerce options that might get updated.
|
||||
*
|
||||
* See `woocommerce_update_option` hook.
|
||||
*
|
||||
* @param array $option WooCommerce option (config) that might get updated.
|
||||
*/
|
||||
public function add_option_to_list( $option ) {
|
||||
$this->allowed_options[] = $option['id'];
|
||||
|
||||
// Delay attaching this action since it could get fired a lot.
|
||||
if ( false === has_action( 'update_option', array( $this, 'track_setting_change' ) ) ) {
|
||||
add_action( 'update_option', array( $this, 'track_setting_change' ), 10, 3 );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Add WooCommerce option to a list of updated options.
|
||||
*
|
||||
* @param string $option_name Option being updated.
|
||||
* @param mixed $old_value Old value of option.
|
||||
* @param mixed $new_value New value of option.
|
||||
*/
|
||||
public function track_setting_change( $option_name, $old_value, $new_value ) {
|
||||
// Make sure this is a WooCommerce option.
|
||||
if ( ! in_array( $option_name, $this->allowed_options, true ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Check to make sure the new value is truly different.
|
||||
// `woocommerce_price_num_decimals` tends to trigger this
|
||||
// because form values aren't coerced (e.g. '2' vs. 2).
|
||||
if (
|
||||
is_scalar( $old_value ) &&
|
||||
is_scalar( $new_value ) &&
|
||||
(string) $old_value === (string) $new_value
|
||||
) {
|
||||
return;
|
||||
}
|
||||
|
||||
$this->updated_options[] = $option_name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a Tracks event for WooCommerce options that changed values.
|
||||
*/
|
||||
public function send_settings_change_event() {
|
||||
global $current_tab;
|
||||
|
||||
if ( empty( $this->updated_options ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$properties = array(
|
||||
'settings' => implode( ',', $this->updated_options ),
|
||||
);
|
||||
|
||||
if ( isset( $current_tab ) ) {
|
||||
$properties['tab'] = $current_tab;
|
||||
}
|
||||
|
||||
WC_Tracks::record_event( 'settings_change', $properties );
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a Tracks event for WooCommerce settings page views.
|
||||
*/
|
||||
public function track_settings_page_view() {
|
||||
global $current_tab, $current_section;
|
||||
|
||||
$properties = array(
|
||||
'tab' => $current_tab,
|
||||
'section' => empty( $current_section ) ? null : $current_section,
|
||||
);
|
||||
|
||||
WC_Tracks::record_event( 'settings_view', $properties );
|
||||
}
|
||||
}
|
48
includes/tracks/events/class-wc-status-tracking.php
Normal file
48
includes/tracks/events/class-wc-status-tracking.php
Normal file
@ -0,0 +1,48 @@
|
||||
<?php
|
||||
/**
|
||||
* WooCommerce Status Tracking
|
||||
*
|
||||
* @package WooCommerce\Tracks
|
||||
*/
|
||||
|
||||
defined( 'ABSPATH' ) || exit;
|
||||
|
||||
/**
|
||||
* This class adds actions to track usage of WooCommerce Orders.
|
||||
*/
|
||||
class WC_Status_Tracking {
|
||||
/**
|
||||
* Init tracking.
|
||||
*/
|
||||
public function init() {
|
||||
add_action( 'admin_init', array( $this, 'track_status_view' ), 10 );
|
||||
}
|
||||
|
||||
/**
|
||||
* Add Tracks events to the status page.
|
||||
*/
|
||||
public function track_status_view() {
|
||||
if ( isset( $_GET['page'] ) && 'wc-status' === sanitize_text_field( wp_unslash( $_GET['page'] ) ) ) {
|
||||
|
||||
$tab = isset( $_GET['tab'] ) ? sanitize_text_field( wp_unslash( $_GET['tab'] ) ) : 'status';
|
||||
|
||||
WC_Tracks::record_event(
|
||||
'status_view',
|
||||
array(
|
||||
'tab' => $tab,
|
||||
'tool_used' => isset( $_GET['action'] ) ? sanitize_text_field( wp_unslash( $_GET['action'] ) ) : null,
|
||||
)
|
||||
);
|
||||
|
||||
if ( 'status' === $tab ) {
|
||||
wc_enqueue_js(
|
||||
"
|
||||
$( 'a.debug-report' ).on( 'click', function() {
|
||||
window.wcTracks.recordEvent( 'status_view_reports' );
|
||||
} );
|
||||
"
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user