PluginProbe ʕ •ᴥ•ʔ
Weight Based Shipping Table Rate for WooCommerce – Flexible Shipping / 6.12.0
Weight Based Shipping Table Rate for WooCommerce – Flexible Shipping v6.12.0
6.12.1 6.12.0 6.11.0 6.10.0 6.9.1 6.9.0 6.8.1 6.8.0 6.7.4 6.7.3 6.7.2 6.7.0 4.21.7 4.22.0 4.22.1 4.23.0 4.23.1 4.23.2 4.23.3 4.24.0 4.24.1 4.24.10 4.24.11 4.24.12 4.24.13 4.24.14 4.24.15 4.24.16 4.24.17 4.24.18 4.24.19 4.24.2 4.24.4 4.24.6 4.24.7 4.24.8 4.24.9 4.25.0 4.25.1 4.25.2 4.25.4 4.25.5 4.25.6 4.25.7 4.25.8 4.3.0 4.3.1 4.4.0 4.4.1 4.5.0 4.5.1 4.6.0 4.6.1 4.7.0 4.7.1 4.7.2 4.8.0 4.8.1 4.8.3 4.8.4 4.8.5 4.9.0 5.0.0 5.0.1 5.0.2 5.0.3 5.0.4 5.0.5 5.0.6 5.0.7 5.0.8 5.0.9 5.1.0 5.1.1 5.1.2 5.1.3 5.2.0 5.3.0 5.3.1 5.3.3 5.3.4 5.3.5 6.0.0 6.1.0 6.1.1 6.1.2 6.2.0 6.2.1 6.2.2 6.2.3 6.2.4 6.3.0 trunk 6.4.0 1.4 6.4.1 1.4.1 6.4.2 1.5 6.4.3 1.6 6.4.5 1.6.1 6.5.0 1.6.2 6.5.1 1.7 6.5.2 1.8 6.5.3 1.9 6.5.4 1.9.1 6.5.5 1.9.10 6.5.6 1.9.11 6.5.7 1.9.12 6.5.8 1.9.2 6.6.0 1.9.3 6.6.1 1.9.4 6.6.2 1.9.5 1.9.6 1.9.7 1.9.8 1.9.9 2.0 2.0.1 2.1 2.1.1 2.1.10 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.1.9 3.0.6 3.0.7 3.1 3.1.1 3.1.10 3.1.11 3.1.12 3.1.2 3.1.3 3.1.4 3.1.5 3.1.6 3.1.7 3.1.8 3.1.9 3.10.0 3.11.0 3.11.1 3.11.2 3.11.3 3.11.4 3.12.0 3.13.0 3.14.0 3.14.1 3.14.2 3.14.3 3.14.4 3.15.0 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.2.0 3.3.1 3.3.10 3.3.11 3.3.12 3.3.13 3.3.14 3.3.2 3.3.3 3.3.4 3.3.5 3.3.6 3.3.7 3.3.8 3.3.9 3.4.0 3.5.0 3.5.1 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.7.0 3.8.0 3.9.0 3.9.1 3.9.10 3.9.11 3.9.12 3.9.13 3.9.15 3.9.16 3.9.17 3.9.18 3.9.19 3.9.2 3.9.20 3.9.21 3.9.3 3.9.4 3.9.5 3.9.6 3.9.7 3.9.9 4.0.0 4.0.1 4.0.10 4.0.2 4.0.3 4.0.4 4.0.5 4.0.6 4.0.7 4.0.8 4.0.9 4.1.0 4.1.1 4.1.2 4.1.3 4.1.4 4.10.0 4.10.1 4.11.0 4.11.1 4.11.2 4.11.3 4.11.4 4.11.5 4.11.6 4.11.7 4.11.8 4.11.9 4.12.0 4.13.0 4.13.1 4.13.2 4.13.3 4.14.0 4.14.1 4.14.2 4.15.0 4.16.0 4.16.1 4.16.2 4.17.0 4.18.0 4.18.1 4.18.2 4.18.3 4.18.4 4.18.5 4.18.6 4.19.0 4.19.1 4.2.0 4.20.0 4.20.1 4.20.2 4.20.3 4.21.0 4.21.1 4.21.2 4.21.3 4.21.4 4.21.5
flexible-shipping / src / WPDesk / FS / Info / DashboardTrackingReceiver.php
flexible-shipping / src / WPDesk / FS / Info Last commit date
Metabox 1 week ago views 1 week ago Dashboard.php 1 week ago DashboardTracker.php 1 week ago DashboardTrackingData.php 1 week ago DashboardTrackingReceiver.php 1 week ago FSIE.php 1 week ago FSPro.php 1 week ago FSWalkthrough.php 1 week ago FSWalkthroughPL.php 1 week ago Metabox.php 1 week ago Video.php 1 week ago WooCommerceABC.php 1 week ago WooCommerceABCPL.php 1 week ago
DashboardTrackingReceiver.php
140 lines
1 <?php
2 /**
3 * Dashboard tracking transport.
4 *
5 * @package WPDesk\FS\Info
6 */
7
8 declare( strict_types=1 );
9
10 namespace WPDesk\FS\Info;
11
12 use FSVendor\WPDesk\PluginBuilder\Plugin\Hookable;
13
14 /**
15 * Receives dashboard counter increments from Heartbeat and AJAX.
16 */
17 final class DashboardTrackingReceiver implements Hookable {
18
19 const AJAX_ACTION = 'flexible_shipping_dashboard_tracking';
20 const PACKET_KEY = 'flexible_shipping_dashboard';
21
22 const MAX_VISIBLE_TIME_SECONDS = 300;
23 const SCREEN_ID = 'woocommerce_page_wc-settings';
24 const SECTION_ID = 'flexible_shipping_info';
25
26 /**
27 * @var DashboardTrackingData
28 */
29 private DashboardTrackingData $tracking_data;
30
31 public function __construct( DashboardTrackingData $tracking_data ) {
32 $this->tracking_data = $tracking_data;
33 }
34
35 public function hooks(): void {
36 add_filter( 'heartbeat_received', [ $this, 'receive_heartbeat' ], 10, 3 );
37 add_action( 'wp_ajax_' . self::AJAX_ACTION, [ $this, 'receive_ajax' ] );
38 }
39
40 /**
41 * @param array<string, mixed> $response Heartbeat response.
42 * @param array<string, mixed> $data Heartbeat request data.
43 * @param string $screen_id Current screen ID.
44 *
45 * @return array<string, mixed>
46 */
47 public function receive_heartbeat( array $response, array $data, string $screen_id ): array {
48 if ( self::SCREEN_ID === $screen_id && $this->request_is_allowed() && isset( $data[ self::PACKET_KEY ] ) ) {
49 $this->save_packet( $data[ self::PACKET_KEY ] );
50 }
51
52 return $response;
53 }
54
55 /**
56 * @internal
57 */
58 public function receive_ajax(): void {
59 check_ajax_referer( self::AJAX_ACTION );
60
61 if ( ! $this->request_is_allowed() ) {
62 wp_send_json_error();
63 return;
64 }
65
66 $packet = json_decode( sanitize_text_field( wp_unslash( $_POST['events'] ?? '' ) ), true );
67 if ( ! $this->save_packet( $packet ) ) {
68 wp_send_json_error();
69 return;
70 }
71
72 wp_send_json_success();
73 }
74
75 /**
76 * @param mixed $packet Packet to validate and save.
77 */
78 private function save_packet( $packet ): bool {
79 if ( ! is_array( $packet ) || [] === $packet ) {
80 return false;
81 }
82
83 $allowed = $this->allowed_fields();
84 foreach ( $packet as $field => $increment ) {
85 if ( ! in_array( $field, $allowed, true ) || ! is_int( $increment ) || $increment < 0 ) {
86 return false;
87 }
88 }
89
90 if ( ( $packet['visible_time_seconds'] ?? 0 ) > self::MAX_VISIBLE_TIME_SECONDS ) {
91 return false;
92 }
93
94 $this->tracking_data->increase(
95 $packet,
96 wpdesk_is_plugin_active( 'flexible-shipping-pro/flexible-shipping-pro.php' )
97 );
98
99 return true;
100 }
101
102 private function request_is_allowed(): bool {
103 if ( ! current_user_can( 'manage_woocommerce' ) ) {
104 return false;
105 }
106
107 $query = parse_url( (string) wp_get_referer(), PHP_URL_QUERY );
108 parse_str( is_string( $query ) ? $query : '', $parameters );
109
110 return self::SECTION_ID === ( $parameters['section'] ?? '' );
111 }
112
113 /**
114 * @return string[]
115 */
116 private function allowed_fields(): array {
117 return [
118 'views_count',
119 'visible_time_seconds',
120 'navigation_click_count',
121 'reached_end_count',
122 'create_method_click_count',
123 'extensions_click_count',
124 'onboarding.step_1_reached_count',
125 'onboarding.step_2_reached_count',
126 'onboarding.step_3_reached_count',
127 'onboarding.step_4_reached_count',
128 'onboarding.step_5_reached_count',
129 'onboarding.step_6_reached_count',
130 'onboarding.completed_count',
131 'onboarding.restart_count',
132 'onboarding.add_zone_click_count',
133 'onboarding.add_method_click_count',
134 'onboarding.open_cart_click_count',
135 'onboarding.activate_license_click_count',
136 'onboarding.check_extensions_click_count',
137 ];
138 }
139 }
140