PluginProbe
Optimole – Optimize Images | Convert WebP & AVIF | CDN & Lazy Load | Image Optimization / trunk
Optimole – Optimize Images | Convert WebP & AVIF | CDN & Lazy Load | Image Optimization vtrunk
4.2.14 4.2.13 4.2.12 4.2.11 4.2.10 4.2.9 4.2.8 4.2.7 4.2.6 4.2.5 2.5.5 2.5.6 2.5.7 3.0.0 3.0.1 3.1.0 3.1.1 3.1.2 3.1.3 3.10.0 3.11.0 3.11.1 3.11.2 3.11.3 3.12.0 All 135 releases
← All changes | vendor/codeinwp/themeisle-sdk/src/Modules/Logger.php +142 -27 3.11.3 → trunk View file →
@@ -28,9 +28,14 @@
28 28 * Endpoint where to collect logs.
29 29 */
30 30 const TRACKING_ENDPOINT = 'https://api.themeisle.com/tracking/log';
31 31
32 + /**
33 + * Endpoint where to collect telemetry.
34 + */
35 + const TELEMETRY_ENDPOINT = 'https://api.themeisle.com/tracking/events';
32 36
37 +
33 38 /**
34 39 * Check if we should load the module for this product.
35 40 *
36 41 * @param Product $product Product to load the module for.
@@ -37,9 +42,8 @@
37 42 *
38 43 * @return bool Should we load ?
39 44 */
40 45 public function can_load( $product ) {
41 -
42 46 return apply_filters( $product->get_slug() . '_sdk_enable_logger', true );
43 47 }
44 48
45 49 /**
@@ -50,11 +54,10 @@
50 54 * @return Logger Module object.
51 55 */
52 56 public function load( $product ) {
53 57 $this->product = $product;
54 - $this->setup_notification();
55 - $this->setup_actions();
56 -
58 + add_action( 'wp_loaded', array( $this, 'setup_actions' ) );
59 + add_action( 'admin_init', array( $this, 'setup_notification' ) );
57 60 return $this;
58 61 }
59 62
60 63 /**
@@ -60,14 +63,12 @@
60 63 /**
61 64 * Setup notification on admin.
62 65 */
63 66 public function setup_notification() {
64 - if ( ! $this->product->is_wordpress_available() ) {
67 + if ( $this->is_logger_active() ) {
65 68 return;
66 69 }
67 -
68 70 add_filter( 'themeisle_sdk_registered_notifications', [ $this, 'add_notification' ] );
69 -
70 71 }
71 72
72 73 /**
73 74 * Setup tracking actions.
@@ -75,14 +76,25 @@
75 76 public function setup_actions() {
76 77 if ( ! $this->is_logger_active() ) {
77 78 return;
78 79 }
80 + add_action(
81 + 'admin_enqueue_scripts',
82 + function() {
83 + if ( ! apply_filters( 'themeisle_sdk_enable_telemetry', false ) ) {
84 + return;
85 + }
86 +
87 + $this->load_telemetry();
88 + },
89 + PHP_INT_MAX
90 + );
91 +
79 92 $action_key = $this->product->get_key() . '_log_activity';
80 93 if ( ! wp_next_scheduled( $action_key ) ) {
81 94 wp_schedule_single_event( time() + ( wp_rand( 1, 24 ) * 3600 ), $action_key );
82 95 }
83 96 add_action( $action_key, array( $this, 'send_log' ) );
84 -
85 97 }
86 98
87 99 /**
88 100 * Check if the logger is active.
@@ -89,26 +101,42 @@
89 101 *
90 102 * @return bool Is logger active?
91 103 */
92 104 private function is_logger_active() {
105 + return self::is_logging_active( $this->product );
106 + }
107 +
108 + /**
109 + * Check if the logging consent is granted for a product.
110 + *
111 + * Shared with the other telemetry modules (e.g. the crash reporter) so the
112 + * consent semantics live in a single place.
113 + *
114 + * @param \ThemeisleSDK\Product $product Product to check.
115 + *
116 + * @return bool Is logging active for the product?
117 + */
118 + public static function is_logging_active( $product ) {
119 + if ( apply_filters( 'themeisle_sdk_disable_telemetry', false ) ) {
120 + return false;
121 + }
93 122 $default = 'no';
94 123
95 - if ( ! $this->product->is_wordpress_available() ) {
124 + if ( ! $product->is_wordpress_available() ) {
96 125 $default = 'yes';
97 126 } else {
98 - $pro_slug = $this->product->get_pro_slug();
99 -
100 - if ( ! empty( $pro_slug ) ) {
101 - $all_products = Loader::get_products();
102 - if ( isset( $all_products[ $pro_slug ] ) ) {
127 + $all_products = Loader::get_products();
128 + foreach ( $all_products as $registered_product ) {
129 + if ( $registered_product->requires_license() ) {
103 130 $default = 'yes';
131 + break;
104 132 }
105 133 }
106 134 }
107 135
108 - return ( get_option( $this->product->get_key() . '_logger_flag', $default ) === 'yes' );
136 +
137 + return ( get_option( $product->get_key() . '_logger_flag', $default ) === 'yes' );
109 138 }
110 -
111 139 /**
112 140 * Add notification to queue.
113 141 *
114 142 * @param array $all_notifications Previous notification.
@@ -116,9 +144,9 @@
116 144 * @return array All notifications.
117 145 */
118 146 public function add_notification( $all_notifications ) {
119 147
120 - $message = apply_filters( $this->product->get_key() . '_logger_heading', 'Do you enjoy <b>{product}</b>? Become a contributor by opting in to our anonymous data tracking. We guarantee no sensitive data is collected.' );
148 + $message = apply_filters( $this->product->get_key() . '_logger_heading', Loader::$labels['logger']['notice'] );
121 149
122 150 $message = str_replace(
123 151 array( '{product}' ),
124 152 $this->product->get_friendly_name(),
@@ -123,10 +151,10 @@
123 151 array( '{product}' ),
124 152 $this->product->get_friendly_name(),
125 153 $message
126 154 );
127 - $button_submit = apply_filters( $this->product->get_key() . '_logger_button_submit', 'Sure, I would love to help.' );
128 - $button_cancel = apply_filters( $this->product->get_key() . '_logger_button_cancel', 'No, thanks.' );
155 + $button_submit = apply_filters( $this->product->get_key() . '_logger_button_submit', Loader::$labels['logger']['cta_y'] );
156 + $button_cancel = apply_filters( $this->product->get_key() . '_logger_button_cancel', Loader::$labels['logger']['cta_n'] );
129 157
130 158 $all_notifications[] = [
131 159 'id' => $this->product->get_key() . '_logger_flag',
132 160 'message' => $message,
@@ -163,17 +191,104 @@
163 191 'method' => 'POST',
164 192 'timeout' => 3,
165 193 'redirection' => 5,
166 194 'body' => array(
167 - 'site' => get_site_url(),
168 - 'slug' => $this->product->get_slug(),
169 - 'version' => $this->product->get_version(),
170 - 'wp_version' => $wp_version,
171 - 'locale' => get_locale(),
172 - 'data' => apply_filters( $this->product->get_key() . '_logger_data', array() ),
173 - 'environment' => $environment,
174 - 'license' => apply_filters( $this->product->get_key() . '_license_status', '' ),
195 + 'site' => get_site_url(),
196 + 'slug' => $this->product->get_slug(),
197 + 'version' => $this->product->get_version(),
198 + 'wp_version' => $wp_version,
199 + 'install_time' => $this->product->get_install_time(),
200 + 'locale' => get_locale(),
201 + 'data' => apply_filters( $this->product->get_key() . '_logger_data', array() ),
202 + 'environment' => $environment,
203 + 'license' => apply_filters( $this->product->get_key() . '_license_status', '' ),
175 204 ),
176 205 )
177 206 );
207 + }
208 +
209 + /**
210 + * Load telemetry.
211 + *
212 + * @return void
213 + */
214 + public function load_telemetry() {
215 + // See which products have telemetry enabled.
216 + try {
217 + $products_with_telemetry = array();
218 + $all_products = Loader::get_products();
219 + $all_products[ $this->product->get_slug() ] = $this->product; // Add current product to the list of products to check for telemetry.
220 +
221 + // Register telemetry params for eligible products.
222 + foreach ( $all_products as $product_slug => $product ) {
223 +
224 + // Ignore PRO products.
225 + if ( false !== strstr( $product_slug, 'pro' ) ) {
226 + continue;
227 + }
228 +
229 + $pro_slug = $product->get_pro_slug();
230 + $logger_key = $product->get_key() . '_logger_flag';
231 +
232 + // If the product is not available in the WordPress store, or it's PRO version is installed, activate the logger if it was not initialized -- Pro users are opted in by default.
233 + if ( ! $product->is_wordpress_available() || ( ! empty( $pro_slug ) && isset( $all_products[ $pro_slug ] ) ) ) {
234 + $logger_flag = get_option( $logger_key );
235 +
236 + if ( false === $logger_flag ) {
237 + update_option( $logger_key, 'yes' );
238 + }
239 + }
240 +
241 + if ( 'yes' === get_option( $product->get_key() . '_logger_flag', 'no' ) ) {
242 +
243 + $main_slug = explode( '-', $product_slug );
244 + $main_slug = $main_slug[0];
245 + $track_hash = Licenser::create_license_hash( str_replace( '-', '_', ! empty( $pro_slug ) ? $pro_slug : $product_slug ) );
246 +
247 + // Check if product was already tracked.
248 + $active_telemetry = false;
249 + foreach ( $products_with_telemetry as $product_with_telemetry ) {
250 + if ( $product_with_telemetry['slug'] === $main_slug ) {
251 + $active_telemetry = true;
252 + break;
253 + }
254 + }
255 +
256 + if ( $active_telemetry ) {
257 + continue;
258 + }
259 +
260 + $products_with_telemetry[] = array(
261 + 'slug' => $main_slug,
262 + 'trackHash' => $track_hash ? $track_hash : 'free',
263 + 'consent' => true,
264 + );
265 + }
266 + }
267 +
268 + $products_with_telemetry = apply_filters( 'themeisle_sdk_telemetry_products', $products_with_telemetry );
269 +
270 + if ( 0 === count( $products_with_telemetry ) ) {
271 + return;
272 + }
273 +
274 + $tracking_handler = apply_filters( 'themeisle_sdk_dependency_script_handler', 'tracking' );
275 + if ( ! empty( $tracking_handler ) ) {
276 + do_action( 'themeisle_sdk_dependency_enqueue_script', 'tracking' );
277 + wp_localize_script(
278 + $tracking_handler,
279 + 'tiTelemetry',
280 + array(
281 + 'products' => $products_with_telemetry,
282 + 'endpoint' => self::TELEMETRY_ENDPOINT,
283 + )
284 + );
285 + }
286 + } catch ( \Exception $e ) {
287 + if ( defined( 'WP_DEBUG' ) && WP_DEBUG && defined( 'WP_DEBUG_LOG' ) && WP_DEBUG_LOG ) {
288 + error_log( $e->getMessage() ); // phpcs:ignore
289 + }
290 + } finally {
291 + return;
292 + }
178 293 }
179 294 }