PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 16.1-beta.3
Jetpack – WP Security, Backup, Speed, & Growth v16.1-beta.3
16.1.2 16.2-a.1 16.1.1 16.1 16.1-beta 16.1-beta.2 16.1-beta.3 16.1-a.5 16.1-a.3 16.0.1 16.1-a.1 16.0 16.0-beta 16.0-a.7 16.0-a.5 15.9.1 16.0-a.3 16.0-a.1 15.9 15.9-beta 15.9-a.7 15.9-a.5 15.9-a.3 15.9-a.1 15.8 15.8-beta 15.8-a.7 15.8-a.5 5.2.5 5.3.4 5.4.4 5.5.5 5.6.5 5.7.5 5.8.4 5.9.4 6.0.4 6.1 6.1.1 6.1.2 6.1.3 6.1.4 6.1.5 6.2 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.3 6.3.1 6.3.2 6.3.3 6.3.4 6.3.5 6.3.6 6.3.7 6.4 6.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 6.5 6.5.1 6.5.2 6.5.3 6.5.4 6.6 6.6.1 6.6.2 6.6.3 6.6.4 6.6.5 6.7 6.7.1 6.7.2 6.7.3 6.7.4 6.8 6.8.1 6.8.2 6.8.3 6.8.4 6.8.5 6.9 6.9.1 6.9.2 6.9.3 6.9.4 7.0 7.0.1 7.0.2 7.0.3 7.0.4 7.0.5 7.1 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2 7.2.1 7.2.1.1 7.2.2 7.2.3 7.2.4 7.2.5 7.3 7.3.0.1 7.3.1 7.3.1.1 7.3.2 7.3.3 7.3.4 7.3.5 7.4 7.4.1 7.4.2 7.4.3 7.4.4 7.4.5 7.5 7.5.0.1 7.5.1 7.5.2 7.5.3 7.5.4 7.5.5 7.5.6 7.5.7 7.6 7.6.1 7.6.2 7.6.3 7.6.4 7.7 7.7.1 7.7.2 7.7.3 7.7.4 7.7.5 7.7.6 7.8 7.8.1 7.8.2 7.8.3 7.8.4 7.9 7.9.1 7.9.2 7.9.3 7.9.4 8.0 8.0.1 8.0.2 8.0.3 8.1 8.1.1 8.1.2 8.1.3 8.1.4 8.2 8.2.0.1 8.2.1 8.2.2 8.2.3 8.2.4 8.2.5 8.2.6 8.3 8.3.1 8.3.2 8.3.3 8.4 8.4.1 8.4.2 8.4.3 8.4.4 8.4.5 8.5 8.5.1 8.5.2 8.5.3 8.6 8.6.1 8.6.2 8.6.3 8.6.4 8.7 8.7.0.1 8.7.1 8.7.2 8.7.3 8.7.4 8.8 8.8.1 8.8.2 8.8.3 8.8.4 8.8.5 8.9 8.9.1 8.9.2 8.9.3 8.9.4 9.0 9.0.1 9.0.2 9.0.3 9.0.4 9.0.5 9.1 9.1.1 9.1.2 9.1.3 9.2 9.2.1 9.2.2 9.2.3 9.2.4 9.3 9.3.1 9.3.2 9.3.3 9.3.4 9.3.5 9.4 9.4.1 9.4.2 9.4.3 9.4.4 9.5 9.5.1 9.5.2 9.5.3 9.5.4 9.5.5 9.6 9.6.1 9.6.2 9.6.3 9.6.4 9.7 9.7.1 9.7.2 15.7-beta.2 9.7.3 15.7.1 9.8 15.8-a.1 9.8.1 15.8-a.3 9.8.2 2.0.9 9.8.3 2.1.7 9.9 2.2.10 9.9.1 2.3.10 9.9.2 2.4.7 9.9.3 2.5.5 2.6.6 2.7.5 2.8.5 2.9.6 3.0.6 3.1.5 3.2.5 3.3.6 3.4.6 3.5.6 3.6.4 3.7.5 3.8.5 3.9.10 4.0.7 4.1.4 4.2.5 4.3.5 4.4.5 4.5.3 4.6.3 4.7.4 4.8.5 4.9.3 5.0.3 5.1.4 trunk 10.0 10.0.1 10.0.2 10.1 10.1.1 10.1.2 10.2 10.2.1 10.2.2 10.2.3 10.3 10.3.1 10.3.2 10.4 10.4.1 10.4.2 10.5 10.5.1 10.5.2 10.5.3 10.6 10.6.1 10.6.2 10.7 10.7.1 10.7.2 10.8 10.8.1 10.8.2 10.9 10.9.1 10.9.2 10.9.3 11.0 11.0.1 11.0.2 11.1 11.1.1 11.1.2 11.1.3 11.1.4 11.2 11.2.1 11.2.2 11.3 11.3.1 11.3.2 11.3.3 11.3.4 11.4 11.4.1 11.4.2 11.5 11.5.1 11.5.2 11.5.3 11.6 11.6.1 11.6.2 11.7 11.7.1 11.7.2 11.7.3 11.8 11.8.3 11.8.4 11.8.5 11.8.6 11.9 11.9.1 11.9.2 11.9.3 12.0 12.0.1 12.0.2 12.1 12.1.1 12.1.2 12.2 12.2.1 12.2.2 12.3 12.3.1 12.4 12.4.1 12.5 12.5.1 12.6 12.6.1 12.6.2 12.6.3 12.7 12.7.1 12.7.2 12.8 12.8.1 12.8.2 12.9 12.9.1 12.9.2 12.9.3 12.9.4 13.0 13.0.1 13.1 13.1.1 13.1.2 13.1.3 13.1.4 13.2 13.2.1 13.2.2 13.2.3 13.3 13.3.1 13.3.2 13.4 13.4.1 13.4.2 13.4.3 13.4.4 13.5 13.5.1 13.6 13.6.1 13.7 13.7.1 13.8 13.8.1 13.8.2 13.9 13.9.1 14.0 14.1 14.2 14.2.1 14.3 14.4 14.4.1 14.5 14.6 14.7 14.8 14.9 14.9.1 15.0 15.0.1 15.0.2 15.1 15.1.1 15.2 15.3 15.3.1 15.4 15.5 15.6 15.7 15.7-a.1 15.7-a.3 15.7-a.5 15.7-a.7 15.7-beta
jetpack / modules / woocommerce-analytics / classes / class-jetpack-woocommerce-analytics-my-account.php
jetpack / modules / woocommerce-analytics / classes Last commit date
class-jetpack-woocommerce-analytics-checkout-flow.php 9 months ago class-jetpack-woocommerce-analytics-my-account.php 8 months ago class-jetpack-woocommerce-analytics-trait.php 8 months ago class-jetpack-woocommerce-analytics-universal.php 8 months ago
class-jetpack-woocommerce-analytics-my-account.php
362 lines
1 <?php
2 /**
3 * Jetpack_WooCommerce_Analytics_My_Account
4 *
5 * @deprecated 13.3
6 *
7 * @package automattic/jetpack
8 * @author Automattic
9 */
10
11 /**
12 * Bail if accessed directly
13 */
14 if ( ! defined( 'ABSPATH' ) ) {
15 exit( 0 );
16 }
17
18 /**
19 * Class Jetpack_WooCommerce_Analytics_My_Account
20 * Filters and Actions added to My Account pages to perform analytics
21 *
22 * @deprecated 13.3
23 */
24 class Jetpack_WooCommerce_Analytics_My_Account {
25
26 use Jetpack_WooCommerce_Analytics_Trait;
27
28 /**
29 * Jetpack_WooCommerce_Analytics_My_Account constructor.
30 *
31 * @deprecated 13.3
32 */
33 public function __construct() {
34
35 add_action( 'woocommerce_account_content', array( $this, 'track_tabs' ) );
36 add_action( 'woocommerce_account_content', array( $this, 'track_logouts' ) );
37 add_action( 'woocommerce_customer_save_address', array( $this, 'track_save_address' ), 10, 2 );
38 add_action( 'wp_head', array( $this, 'trigger_queued_events' ) );
39 add_action( 'wp', array( $this, 'track_add_payment_method' ) );
40 add_action( 'wp', array( $this, 'track_delete_payment_method' ) );
41 add_action( 'woocommerce_save_account_details', array( $this, 'track_save_account_details' ) );
42 add_filter( 'woocommerce_my_account_my_orders_actions', array( $this, 'add_initiator_prop_to_my_account_action_links' ) );
43 add_action( 'woocommerce_cancelled_order', array( $this, 'track_order_cancel_event' ), 10, 0 );
44 add_action( 'before_woocommerce_pay', array( $this, 'track_order_pay_event' ) );
45 add_action( 'woocommerce_before_account_orders', array( $this, 'add_initiator_prop_to_order_urls' ), 9 );
46 add_filter( 'query_vars', array( $this, 'add_initiator_param_to_query_vars' ) );
47 }
48
49 /**
50 * Track my account tabs, we only trigger an event if a tab is viewed.
51 *
52 * We also track other events here, like order number clicks, order action clicks,
53 * address clicks, payment method add and delete.
54 *
55 * @deprecated 13.3
56 */
57 public function track_tabs() {
58 global $wp;
59
60 // WooCommerce keeps a map of my-account endpoints keys and their custom permalinks.
61 $core_endpoints = WC()->query->get_query_vars();
62
63 if ( ! empty( $wp->query_vars ) ) {
64
65 foreach ( $wp->query_vars as $key => $value ) {
66 // we skip pagename.
67 if ( 'pagename' === $key ) {
68 continue;
69 }
70
71 // When no permalink is set, the first page is page_id, so we skip it.
72 if ( 'page_id' === $key ) {
73 continue;
74 }
75
76 // We don't want to track our own analytics params.
77 if ( '_wca_initiator' === $key ) {
78 continue;
79 }
80
81 if ( isset( $core_endpoints['view-order'] ) && $core_endpoints['view-order'] === $key && is_numeric( $value ) ) {
82 $initiator = get_query_var( '_wca_initiator' );
83 if ( 'number' === $initiator ) {
84 $this->record_event( 'woocommerceanalytics_my_account_order_number_click' );
85 continue;
86 }
87 if ( 'action' === $initiator ) {
88 $this->record_event( 'woocommerceanalytics_my_account_order_action_click', array( 'action' => 'view' ) );
89 continue;
90 }
91 }
92
93 if ( isset( $core_endpoints['edit-address'] ) && $core_endpoints['edit-address'] === $key && in_array( $value, array( 'billing', 'shipping' ), true ) ) {
94 $refer = wp_get_referer();
95 if ( $refer === wc_get_endpoint_url( 'edit-address', $value ) ) {
96 // It means we're likely coming from the same page after a failed save and don't want to retrigger the address click event.
97 continue;
98 }
99
100 $this->record_event( 'woocommerceanalytics_my_account_address_click', array( 'address' => $value ) );
101 continue;
102 }
103
104 if ( isset( $core_endpoints['add-payment-method'] ) && $core_endpoints['add-payment-method'] === $key ) {
105 $this->record_event( 'woocommerceanalytics_my_account_payment_add' );
106 continue;
107 }
108
109 if ( isset( $core_endpoints['edit-address'] ) && $core_endpoints['edit-address'] ) {
110 $refer = wp_get_referer();
111 if ( $refer === wc_get_endpoint_url( 'edit-address', 'billing' ) || $refer === wc_get_endpoint_url( 'edit-address', 'shipping' ) ) {
112 // It means we're likely coming from the edit page save and don't want to retrigger the page view event.
113 continue;
114 }
115 }
116 /**
117 * The main dashboard view has page as key, so we rename it.
118 */
119 if ( 'page' === $key ) {
120 $key = 'dashboard';
121 }
122
123 /**
124 * If a custom permalink is used for one of the pages, query_vars will have 2 keys, the custom permalink and the core endpoint key.
125 * To avoid triggering the event twice, we skip the core one and only track the custom one.
126 * Tracking the custom endpoint is safer than hoping the duplicated, redundant core endpoint is always present.
127 */
128 if ( isset( $core_endpoints[ $key ] ) && $core_endpoints[ $key ] !== $key ) {
129 continue;
130 }
131
132 /**
133 * $core_endpoints is an array of core_permalink => custom_permalink,
134 * query_vars gives us the custom_permalink, but we want to track it as core_permalink.
135 */
136 if ( array_search( $key, $core_endpoints, true ) ) {
137 $key = array_search( $key, $core_endpoints, true );
138 }
139
140 $this->record_event( 'woocommerceanalytics_my_account_page_view', array( 'tab' => $key ) );
141 }
142 }
143 }
144
145 /**
146 * Track address save events, this can only come from the my account page.
147 *
148 * @deprecated 13.3
149 *
150 * @param int $customer_id The customer id.
151 * @param string $load_address The address type (billing, shipping).
152 */
153 public function track_save_address( $customer_id, $load_address ) {
154 $this->queue_event( 'woocommerceanalytics_my_account_address_save', array( 'address' => $load_address ) );
155 }
156
157 /**
158 * Track payment method add events, this can only come from the my account page.
159 *
160 * @deprecated 13.3
161 */
162 public function track_add_payment_method() {
163 if ( isset( $_POST['woocommerce_add_payment_method'] ) && isset( $_POST['payment_method'] ) ) {
164
165 $nonce_value = wc_get_var( $_REQUEST['woocommerce-add-payment-method-nonce'], wc_get_var( $_REQUEST['_wpnonce'], '' ) ); // @codingStandardsIgnoreLine.
166
167 if ( ! wp_verify_nonce( $nonce_value, 'woocommerce-add-payment-method' ) ) {
168 return;
169 }
170
171 $this->queue_event( 'woocommerceanalytics_my_account_payment_save' );
172 return;
173 }
174 }
175
176 /**
177 * Track payment method delete events.
178 *
179 * @deprecated 13.3
180 */
181 public function track_delete_payment_method() {
182 global $wp;
183 if ( isset( $wp->query_vars['delete-payment-method'] ) ) {
184 $this->queue_event( 'woocommerceanalytics_my_account_payment_delete' );
185 return;
186 }
187 }
188
189 /**
190 * Track order cancel events.
191 *
192 * @deprecated 13.3
193 */
194 public function track_order_cancel_event() {
195 if ( isset( $_GET['_wca_initiator'] ) && ( isset( $_GET['_wpnonce'] ) && wp_verify_nonce( wp_unslash( $_GET['_wpnonce'] ), 'woocommerce-cancel_order' ) ) ) { // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
196 $this->queue_event( 'woocommerceanalytics_my_account_order_action_click', array( 'action' => 'cancel' ) );
197 }
198 }
199
200 /**
201 * Track order pay events.
202 *
203 * @deprecated 13.3
204 */
205 public function track_order_pay_event() {
206 if ( isset( $_GET['_wca_initiator'] ) ) { // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized,WordPress.Security.NonceVerification.Recommended
207 $this->record_event( 'woocommerceanalytics_my_account_order_action_click', array( 'action' => 'pay' ) );
208 }
209 }
210
211 /**
212 * Track account details save events, this can only come from the my account page.
213 *
214 * @deprecated 13.3
215 */
216 public function track_save_account_details() {
217 $this->queue_event( 'woocommerceanalytics_my_account_details_save' );
218 }
219
220 /**
221 * Track logout events.
222 *
223 * @deprecated 13.3
224 */
225 public function track_logouts() {
226 $common_props = wp_json_encode(
227 array_merge(
228 array(
229 '_en' => 'woocommerceanalytics_my_account_tab_click',
230 'tab' => 'logout',
231 ),
232 $this->get_common_properties()
233 ),
234 JSON_UNESCAPED_SLASHES | JSON_HEX_TAG | JSON_HEX_AMP
235 );
236
237 wc_enqueue_js(
238 "
239 jQuery(document).ready(function($) {
240 // Attach event listener to the logout link
241 jQuery('.woocommerce-MyAccount-navigation-link--customer-logout').on('click', function() {
242 _wca.push($common_props);
243 });
244 });
245 "
246 );
247 }
248
249 /**
250 * Add referrer prop to my account action links
251 *
252 * @deprecated 13.3
253 *
254 * @param array $actions My account action links.
255 * @return array
256 */
257 public function add_initiator_prop_to_my_account_action_links( $actions ) {
258 foreach ( $actions as $key => $action ) {
259 if ( ! isset( $action['url'] ) ) {
260 continue;
261 }
262
263 // Check if the action key is view, pay, or cancel.
264 if ( ! in_array( $key, array( 'view', 'pay', 'cancel' ), true ) ) {
265 continue;
266 }
267
268 $url = add_query_arg( array( '_wca_initiator' => 'action' ), $action['url'] );
269 $actions[ $key ]['url'] = $url;
270 }
271
272 return $actions;
273 }
274
275 /**
276 * Add an initiator prop to the order url.
277 *
278 * The get_view_order_url is used in a lot of places,
279 * so we want to limit it just to my account page.
280 *
281 * @deprecated 13.3
282 */
283 public function add_initiator_prop_to_order_urls() {
284 add_filter(
285 'woocommerce_get_view_order_url',
286 function ( $url ) {
287 return add_query_arg( array( '_wca_initiator' => 'number' ), $url );
288 },
289 10,
290 1
291 );
292
293 add_filter(
294 'woocommerce_get_endpoint_url',
295 function ( $url, $endpoint ) {
296 if ( 'edit-address' === $endpoint ) {
297 return add_query_arg( array( '_wca_initiator' => 'action' ), $url );
298 }
299 return $url;
300 },
301 10,
302 2
303 );
304 }
305
306 /**
307 * Add initiator to query vars
308 *
309 * @deprecated 13.3
310 *
311 * @param array $query_vars Query vars.
312 * @return array
313 */
314 public function add_initiator_param_to_query_vars( $query_vars ) {
315 $query_vars[] = '_wca_initiator';
316 return $query_vars;
317 }
318
319 /**
320 * Record all queued up events in session.
321 *
322 * This is called on every page load, and will record all events that were queued up in session.
323 *
324 * @deprecated 13.3
325 */
326 public function trigger_queued_events() {
327 if ( is_object( WC()->session ) ) {
328 $events = WC()->session->get( 'wca_queued_events', array() );
329
330 foreach ( $events as $event ) {
331 $this->record_event(
332 $event['event_name'],
333 $event['event_props']
334 );
335 }
336
337 // Clear data, now that these events have been recorded.
338 WC()->session->set( 'wca_queued_events', array() );
339
340 }
341 }
342
343 /**
344 * Queue an event in session to be recorded later on next page load.
345 *
346 * @deprecated 13.3
347 *
348 * @param string $event_name The event name.
349 * @param array $event_props The event properties.
350 */
351 protected function queue_event( $event_name, $event_props = array() ) {
352 if ( is_object( WC()->session ) ) {
353 $events = WC()->session->get( 'wca_queued_events', array() );
354 $events[] = array(
355 'event_name' => $event_name,
356 'event_props' => $event_props,
357 );
358 WC()->session->set( 'wca_queued_events', $events );
359 }
360 }
361 }
362