Completed
Push — add/delete-connection-owner-no... ( e4381b...c19c35 )
by Jeremy
13:45 queued 06:42
created

JITM::delete_user_update_connection_owner_notice()   C

Complexity

Conditions 13
Paths 15

Size

Total Lines 142

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 13
nc 15
nop 0
dl 0
loc 142
rs 5.2933
c 0
b 0
f 0

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
namespace Automattic\Jetpack;
4
5
use Automattic\Jetpack\Assets;
6
use Automattic\Jetpack\Connection\Manager as Jetpack_Connection;
7
use Automattic\Jetpack\Connection\Client;
8
use Automattic\Jetpack\Assets\Logo as Jetpack_Logo;
9
use Automattic\Jetpack\Tracking;
10
use Automattic\Jetpack\Connection\Manager;
11
12
/**
13
 * Jetpack just in time messaging through out the admin
14
 *
15
 * @since 5.6.0
16
 */
17
class JITM {
18
19
	const PACKAGE_VERSION = '1.0';
20
21
	/**
22
	 * Tracking object.
23
	 *
24
	 * @var Automattic\Jetpack\Tracking
25
	 *
26
	 * @access private
27
	 */
28
	private $tracking;
29
30
	/**
31
	 * JITM constructor.
32
	 */
33
	public function __construct() {
34
		$this->tracking = new Tracking();
0 ignored issues
show
Documentation Bug introduced by
It seems like new \Automattic\Jetpack\Tracking() of type object<Automattic\Jetpack\Tracking> is incompatible with the declared type object<Automattic\Jetpac...attic\Jetpack\Tracking> of property $tracking.

Our type inference engine has found an assignment to a property that is incompatible with the declared type of that property.

Either this assignment is in error or the assigned type should be added to the documentation/type hint for that property..

Loading history...
35
	}
36
37
	public function register() {
38
		/**
39
		 * Filter to turn off all just in time messages
40
		 *
41
		 * @since 3.7.0
42
		 * @since 5.4.0 Correct docblock to reflect default arg value
43
		 *
44
		 * @param bool false Whether to show just in time messages.
45
		 */
46
		if ( ! apply_filters( 'jetpack_just_in_time_msgs', false ) ) {
47
			return false;
48
		}
49
		add_action( 'current_screen', array( $this, 'prepare_jitms' ) );
50
		return true;
51
	}
52
53
	/**
54
	 * Get's the Jetpack emblem
55
	 *
56
	 * @return string The Jetpack emblem
57
	 */
58
	function get_emblem() {
59
		$jetpack_logo = new Jetpack_Logo();
60
		return '<div class="jp-emblem">' . $jetpack_logo->get_jp_emblem() . '</div>';
61
	}
62
63
	/**
64
	 * Prepare actions according to screen and post type.
65
	 *
66
	 * @since 3.8.2
67
	 *
68
	 * @uses Jetpack_Autoupdate::get_possible_failures()
69
	 *
70
	 * @param object $screen
71
	 */
72
	function prepare_jitms( $screen ) {
73
		if ( ! in_array(
74
			$screen->id,
75
			array(
76
				'jetpack_page_stats',
77
				'jetpack_page_akismet-key-config',
78
				'admin_page_jetpack_modules',
79
			)
80
		) ) {
81
			add_action( 'admin_enqueue_scripts', array( $this, 'jitm_enqueue_files' ) );
82
			add_action( 'admin_notices', array( $this, 'ajax_message' ) );
83
			add_action( 'edit_form_top', array( $this, 'ajax_message' ) );
84
85
			// Not really a JITM. Don't know where else to put this :)
86
			add_action( 'admin_notices', array( $this, 'delete_user_update_connection_owner_notice' ) );
87
		}
88
	}
89
90
	/**
91
	 * A special filter for WooCommerce, to set a message based on local state.
92
	 *
93
	 * @param $message string The current message
94
	 *
95
	 * @return array The new message
96
	 */
97
	static function jitm_woocommerce_services_msg( $content ) {
98
		if ( ! function_exists( 'wc_get_base_location' ) ) {
99
			return $content;
100
		}
101
102
		$base_location = wc_get_base_location();
103
104
		switch ( $base_location['country'] ) {
105
			case 'US':
106
				$content->message = esc_html__( 'New free service: Show USPS shipping rates on your store! Added bonus: print shipping labels without leaving WooCommerce.', 'jetpack' );
107
				break;
108
			case 'CA':
109
				$content->message = esc_html__( 'New free service: Show Canada Post shipping rates on your store!', 'jetpack' );
110
				break;
111
			default:
112
				$content->message = '';
113
		}
114
115
		return $content;
116
	}
117
118
	/**
119
	 * A special filter for WooCommerce Call To Action button
120
	 *
121
	 * @param $CTA string The existing CTA
122
	 *
123
	 * @return string The new CTA
124
	 */
125
	static function jitm_jetpack_woo_services_install( $CTA ) {
126
		return wp_nonce_url(
127
			add_query_arg(
128
				array(
129
					'wc-services-action' => 'install',
130
				),
131
				admin_url( 'admin.php?page=wc-settings' )
132
			),
133
			'wc-services-install'
134
		);
135
	}
136
137
	/**
138
	 * A special filter for WooCommerce Call To Action button
139
	 *
140
	 * @param $CTA string The existing CTA
141
	 *
142
	 * @return string The new CTA
143
	 */
144
	static function jitm_jetpack_woo_services_activate( $CTA ) {
145
		return wp_nonce_url(
146
			add_query_arg(
147
				array(
148
					'wc-services-action' => 'activate',
149
				),
150
				admin_url( 'admin.php?page=wc-settings' )
151
			),
152
			'wc-services-install'
153
		);
154
	}
155
156
	/**
157
	 * This is an entire admin notice dedicated to messaging and handling of the case where a user is trying to delete
158
	 * the connection owner.
159
	 */
160
	function delete_user_update_connection_owner_notice() {
161
		global $current_screen;
162
163
		if ( ! isset( $current_screen->base ) || 'users' !== $current_screen->base ) {
164
			return;
165
		}
166
167
		if ( ! isset( $_REQUEST['action'] ) || 'delete' !== $_REQUEST['action'] ) {
168
			return;
169
		}
170
171
		// Get connection owner or bail
172
		$connection_manager  = new Manager();
173
		$connection_owner_id = $connection_manager->get_connection_owner_id();
174
		if ( ! $connection_owner_id ) {
175
			return;
176
		}
177
		$connection_owner_userdata = get_userdata( $connection_owner_id );
178
179
		// Bail if we're not trying to delete connection owner.
180
		$user_ids_to_delete = array();
181
		if ( isset( $_REQUEST['users'] ) ) {
182
			$user_ids_to_delete = $_REQUEST['users'];
183
		} elseif ( isset( $_REQUEST['user'] ) ) {
184
			$user_ids_to_delete[] = $_REQUEST['user'];
185
		}
186
		$deleting_connection_owner = in_array( $connection_owner_id, (array) $user_ids_to_delete );
187
		if ( ! $deleting_connection_owner ) {
188
			return;
189
		}
190
191
		// Bail if they're trying to delete themselves to avoid confusion.
192
		if ( $connection_owner_id == get_current_user_id() ) {
193
			return;
194
		}
195
196
		$connection_manager = new Manager();
197
		$connected_admins   = $connection_manager->get_connected_users( 'jetpack_disconnect' );
198
199
		echo "<div class='notice notice-warning' id='jetpack-notice-switch-connection-owner'>";
200
		echo '<h2>' . esc_html__( 'Important notice about your Jetpack connection:', 'jetpack' ) . '</h2>';
201
		echo '<p>' . sprintf(
202
			esc_html__( 'Warning! You are about to delete the Jetpack connection owner (%s) for this site, which may cause some of your Jetpack features to stop working.', 'jetpack' ),
203
			is_a( $connection_owner_userdata, 'WP_User' ) ? esc_html( $connection_owner_userdata->data->user_login ) : ''
204
		) . '</p>';
205
206
		if ( ! empty( $connected_admins ) && count( $connected_admins ) > 1 ) {
207
			echo '<form id="jp-switch-connection-owner" action="" method="post">';
208
			echo "<label for='owner'>" . esc_html__( 'You can choose to transfer connection ownership to one of these already-connected admins:', 'jetpack' ) . ' </label>';
209
210
			$connected_admin_ids = array_map(
211
				function( $connected_admin ) {
212
						return $connected_admin->ID;
213
				},
214
				$connected_admins
215
			);
216
217
			wp_dropdown_users(
218
				array(
219
					'name'    => 'owner',
220
					'include' => array_diff( $connected_admin_ids, array( $connection_owner_id ) ),
221
					'show'    => 'display_name_with_login',
222
				)
223
			);
224
225
			echo '<p>';
226
			submit_button( esc_html__( 'Set new connection owner', 'jetpack' ), 'primary', 'jp-switch-connection-owner-submit', false );
227
			echo '</p>';
228
229
			echo "<div id='jp-switch-user-results'></div>";
230
			echo '</form>';
231
			?>
232
			<script type="text/javascript">
233
				jQuery( document ).ready( function( $ ) {
234
					$( '#jp-switch-connection-owner' ).on( 'submit', function( e ) {
235
						var formData = $( this ).serialize();
236
						var submitBtn = document.getElementById( 'jp-switch-connection-owner-submit' );
237
						var results = document.getElementById( 'jp-switch-user-results' );
238
239
						submitBtn.disabled = true;
240
241
						$.ajax( {
242
							type        : "POST",
243
							url         : "<?php echo get_rest_url() . 'jetpack/v4/connection/owner'; ?>",
244
							data        : formData,
245
							headers     : {
246
								'X-WP-Nonce': "<?php echo wp_create_nonce( 'wp_rest' ); ?>",
247
							},
248
							success: function() {
249
								results.innerHTML = "<?php esc_html_e( 'Success!', 'jetpack' ); ?>";
250
								setTimeout( function() {
251
									$( '#jetpack-notice-switch-connection-owner' ).hide( 'slow' );
252
								}, 1000 );
253
							}
254
						} ).done( function() {
255
							submitBtn.disabled = false;
256
						} );
257
258
						e.preventDefault();
259
						return false;
260
					} );
261
				} );
262
			</script>
263
			<?php
264
		} else {
265
			echo '<p>' . esc_html__( 'Every Jetpack site needs at least one connected admin for the features to work properly. Please connect to your WordPress.com account via the button below. Once you connect, you may refresh this page to see an option to change the connection owner.', 'jetpack' ) . '</p>';
266
			$connect_url = \Jetpack::init()->build_connect_url( false, false, 'connection_owner_notice' );
267
			echo "<a href='" . esc_url( $connect_url ) . "' target='_blank' rel='noopener noreferrer' class='button-primary'>" . esc_html__( 'Connect to WordPress.com', 'jetpack' ) . '</a>';
268
		}
269
270
		echo '<p>';
271
		printf(
272
			wp_kses(
273
				__( "<a href='%s' target='_blank' rel='noopener noreferrer'>Learn more</a> about the connection owner and what will break if you do not have one.", 'jetpack' ),
274
				array(
275
					'a' => array(
276
						'href'   => true,
277
						'target' => true,
278
						'rel'    => true,
279
					),
280
				)
281
			),
282
			'https://jetpack.com/support/primary-user/'
283
		);
284
		echo '</p>';
285
		echo '<p>';
286
		printf(
287
			wp_kses(
288
				__( 'As always, feel free to <a href="%s" target="_blank" rel="noopener noreferrer">contact our support team</a> if you have any questions.', 'jetpack' ),
289
				array(
290
					'a' => array(
291
						'href'   => true,
292
						'target' => true,
293
						'rel'    => true,
294
					),
295
				)
296
			),
297
			'https://jetpack.com/contact-support'
298
		);
299
		echo '</p>';
300
		echo '</div>';
301
	}
302
303
	/**
304
	 * Injects the dom to show a JITM inside of
305
	 */
306
	function ajax_message() {
307
		$message_path   = $this->get_message_path();
308
		$query_string   = _http_build_query( $_GET, '', ',' );
309
		$current_screen = wp_unslash( $_SERVER['REQUEST_URI'] );
310
		?>
311
		<div class="jetpack-jitm-message"
312
			 data-nonce="<?php echo wp_create_nonce( 'wp_rest' ); ?>"
313
			 data-message-path="<?php echo esc_attr( $message_path ); ?>"
314
			 data-query="<?php echo urlencode_deep( $query_string ); ?>"
315
			 data-redirect="<?php echo urlencode_deep( $current_screen ); ?>"
316
		></div>
317
		<?php
318
	}
319
320
	/**
321
	 * Get's the current message path for display of a JITM
322
	 *
323
	 * @return string The message path
324
	 */
325
	function get_message_path() {
326
		$screen = get_current_screen();
327
328
		return 'wp:' . $screen->id . ':' . current_filter();
329
	}
330
331
	/**
332
	 * Function to enqueue jitm css and js
333
	 */
334
	function jitm_enqueue_files() {
335
		$min = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ? '' : '.min';
336
		wp_register_style(
337
			'jetpack-jitm-css',
338
			plugins_url( "assets/jetpack-admin-jitm{$min}.css", __DIR__ ),
339
			false,
340
			self::PACKAGE_VERSION .
341
			'-201243242'
342
		);
343
		wp_style_add_data( 'jetpack-jitm-css', 'rtl', 'replace' );
344
		wp_style_add_data( 'jetpack-jitm-css', 'suffix', $min );
345
		wp_enqueue_style( 'jetpack-jitm-css' );
346
347
		wp_enqueue_script(
348
			'jetpack-jitm-new',
349
			Assets::get_file_url_for_environment( '_inc/build/jetpack-jitm.min.js', '_inc/jetpack-jitm.js' ),
350
			array( 'jquery' ),
351
			self::PACKAGE_VERSION, // TODO: Keep in sync with version specified in composer.json
352
			true
353
		);
354
		wp_localize_script(
355
			'jetpack-jitm-new',
356
			'jitm_config',
357
			array(
358
				'api_root'               => esc_url_raw( rest_url() ),
359
				'activate_module_text'   => esc_html__( 'Activate', 'jetpack' ),
360
				'activated_module_text'  => esc_html__( 'Activated', 'jetpack' ),
361
				'activating_module_text' => esc_html__( 'Activating', 'jetpack' ),
362
			)
363
		);
364
	}
365
366
	/**
367
	 * Dismisses a JITM feature class so that it will no longer be shown
368
	 *
369
	 * @param $id string The id of the JITM that was dismissed
370
	 * @param $feature_class string The feature class of the JITM that was dismissed
371
	 *
372
	 * @return bool Always true
373
	 */
374
	function dismiss( $id, $feature_class ) {
375
		$this->tracking->record_user_event(
376
			'jitm_dismiss_client',
377
			array(
378
				'jitm_id'       => $id,
379
				'feature_class' => $feature_class,
380
			)
381
		);
382
383
		$hide_jitm = \Jetpack_Options::get_option( 'hide_jitm' );
384
		if ( ! is_array( $hide_jitm ) ) {
385
			$hide_jitm = array();
386
		}
387
388
		if ( isset( $hide_jitm[ $feature_class ] ) ) {
389
			if ( ! is_array( $hide_jitm[ $feature_class ] ) ) {
390
				$hide_jitm[ $feature_class ] = array(
391
					'last_dismissal' => 0,
392
					'number'         => 0,
393
				);
394
			}
395
		} else {
396
			$hide_jitm[ $feature_class ] = array(
397
				'last_dismissal' => 0,
398
				'number'         => 0,
399
			);
400
		}
401
402
		$number = $hide_jitm[ $feature_class ]['number'];
403
404
		$hide_jitm[ $feature_class ] = array(
405
			'last_dismissal' => time(),
406
			'number'         => $number + 1,
407
		);
408
409
		\Jetpack_Options::update_option( 'hide_jitm', $hide_jitm );
410
411
		return true;
412
	}
413
414
	/**
415
	 * Asks the wpcom API for the current message to display keyed on query string and message path
416
	 *
417
	 * @param $message_path string The message path to ask for
418
	 * @param $query string The query string originally from the front end
419
	 *
420
	 * @return array The JITM's to show, or an empty array if there is nothing to show
421
	 */
422
	function get_messages( $message_path, $query ) {
423
		// custom filters go here
424
		add_filter( 'jitm_woocommerce_services_msg', array( 'Jetpack_JITM', 'jitm_woocommerce_services_msg' ) );
425
		add_filter( 'jitm_jetpack_woo_services_install', array( 'Jetpack_JITM', 'jitm_jetpack_woo_services_install' ) );
426
		add_filter(
427
			'jitm_jetpack_woo_services_activate',
428
			array(
429
				'Jetpack_JITM',
430
				'jitm_jetpack_woo_services_activate',
431
			)
432
		);
433
434
		$user = wp_get_current_user();
435
436
		// unauthenticated or invalid requests just bail
437
		if ( ! $user ) {
438
			return array();
439
		}
440
441
		$site_id = \Jetpack_Options::get_option( 'id' );
442
443
		// build our jitm request
444
		$path = add_query_arg(
445
			array(
446
				'external_user_id' => urlencode_deep( $user->ID ),
447
				'query_string'     => urlencode_deep( $query ),
448
				'mobile_browser'   => jetpack_is_mobile( 'smart' ) ? 1 : 0,
449
				'_locale'          => get_user_locale(),
450
			),
451
			sprintf( '/sites/%d/jitm/%s', $site_id, $message_path )
452
		);
453
454
		// attempt to get from cache
455
		$envelopes = get_transient( 'jetpack_jitm_' . substr( md5( $path ), 0, 31 ) );
456
457
		// if something is in the cache and it was put in the cache after the last sync we care about, use it
458
		$use_cache = false;
459
460
		/** This filter is documented in class.jetpack.php */
461
		if ( apply_filters( 'jetpack_just_in_time_msg_cache', false ) ) {
462
			$use_cache = true;
463
		}
464
465
		if ( $use_cache ) {
466
			$last_sync  = (int) get_transient( 'jetpack_last_plugin_sync' );
467
			$from_cache = $envelopes && $last_sync > 0 && $last_sync < $envelopes['last_response_time'];
468
		} else {
469
			$from_cache = false;
470
		}
471
472
		// otherwise, ask again
473
		if ( ! $from_cache ) {
474
			$wpcom_response = Client::wpcom_json_api_request_as_blog(
475
				$path,
476
				'2',
477
				array(
478
					'user_id'    => $user->ID,
479
					'user_roles' => implode( ',', $user->roles ),
480
				),
481
				null,
482
				'wpcom'
483
			);
484
485
			// silently fail...might be helpful to track it?
486
			if ( is_wp_error( $wpcom_response ) ) {
487
				return array();
488
			}
489
490
			$envelopes = json_decode( $wpcom_response['body'] );
491
492
			if ( ! is_array( $envelopes ) ) {
493
				return array();
494
			}
495
496
			$expiration = isset( $envelopes[0] ) ? $envelopes[0]->ttl : 300;
497
498
			// do not cache if expiration is 0 or we're not using the cache
499
			if ( 0 != $expiration && $use_cache ) {
500
				$envelopes['last_response_time'] = time();
501
502
				set_transient( 'jetpack_jitm_' . substr( md5( $path ), 0, 31 ), $envelopes, $expiration );
503
			}
504
		}
505
506
		$hidden_jitms = \Jetpack_Options::get_option( 'hide_jitm' );
507
		unset( $envelopes['last_response_time'] );
508
509
		/**
510
		 * Allow adding your own custom JITMs after a set of JITMs has been received.
511
		 *
512
		 * @since 6.9.0
513
		 *
514
		 * @param array $envelopes array of existing JITMs.
515
		 */
516
		$envelopes = apply_filters( 'jetpack_jitm_received_envelopes', $envelopes );
517
518
		foreach ( $envelopes as $idx => &$envelope ) {
519
520
			$dismissed_feature = isset( $hidden_jitms[ $envelope->feature_class ] ) && is_array( $hidden_jitms[ $envelope->feature_class ] ) ? $hidden_jitms[ $envelope->feature_class ] : null;
521
522
			// if the this feature class has been dismissed and the request has not passed the ttl, skip it as it's been dismissed
523
			if ( is_array( $dismissed_feature ) && ( time() - $dismissed_feature['last_dismissal'] < $envelope->expires || $dismissed_feature['number'] >= $envelope->max_dismissal ) ) {
524
				unset( $envelopes[ $idx ] );
525
				continue;
526
			}
527
528
			$this->tracking->record_user_event(
529
				'jitm_view_client',
530
				array(
531
					'jitm_id' => $envelope->id,
532
				)
533
			);
534
535
			$normalized_site_url = \Jetpack::build_raw_urls( get_home_url() );
536
537
			$url_params = array(
538
				'source' => "jitm-$envelope->id",
539
				'site'   => $normalized_site_url,
540
				'u'      => $user->ID,
541
			);
542
543
			if ( ! class_exists( 'Jetpack_Affiliate' ) ) {
544
				require_once JETPACK__PLUGIN_DIR . 'class.jetpack-affiliate.php';
545
			}
546
			// Get affiliate code and add it to the array of URL parameters
547
			if ( '' !== ( $aff = \Jetpack_Affiliate::init()->get_affiliate_code() ) ) {
548
				$url_params['aff'] = $aff;
549
			}
550
551
			$envelope->url = add_query_arg( $url_params, 'https://jetpack.com/redirect/' );
552
553
			$envelope->jitm_stats_url = \Jetpack::build_stats_url( array( 'x_jetpack-jitm' => $envelope->id ) );
554
555
			if ( $envelope->CTA->hook ) {
556
				$envelope->url = apply_filters( 'jitm_' . $envelope->CTA->hook, $envelope->url );
557
				unset( $envelope->CTA->hook );
558
			}
559
560
			if ( isset( $envelope->content->hook ) ) {
561
				$envelope->content = apply_filters( 'jitm_' . $envelope->content->hook, $envelope->content );
562
				unset( $envelope->content->hook );
563
			}
564
565
			// no point in showing an empty message
566
			if ( empty( $envelope->content->message ) ) {
567
				unset( $envelopes[ $idx ] );
568
				continue;
569
			}
570
571
			switch ( $envelope->content->icon ) {
572
				case 'jetpack':
573
					$jetpack_logo            = new Jetpack_Logo();
574
					$envelope->content->icon = '<div class="jp-emblem">' . $jetpack_logo->get_jp_emblem() . '</div>';
575
					break;
576
				case 'woocommerce':
577
					$envelope->content->icon = '<div class="jp-emblem"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Layer_1" x="0px" y="0px" viewBox="0 0 168 100" xml:space="preserve" enable-background="new 0 0 168 100" width="50" height="30"><style type="text/css">
578
					.st0{clip-path:url(#SVGID_2_);enable-background:new    ;}
579
					.st1{clip-path:url(#SVGID_4_);}
580
					.st2{clip-path:url(#SVGID_6_);}
581
					.st3{clip-path:url(#SVGID_8_);fill:#8F567F;}
582
					.st4{clip-path:url(#SVGID_10_);fill:#FFFFFE;}
583
					.st5{clip-path:url(#SVGID_12_);fill:#FFFFFE;}
584
					.st6{clip-path:url(#SVGID_14_);fill:#FFFFFE;}
585
				</style><g><defs><polygon id="SVGID_1_" points="83.8 100 0 100 0 0.3 83.8 0.3 167.6 0.3 167.6 100 "/></defs><clipPath id="SVGID_2_"><use xlink:href="#SVGID_1_" overflow="visible"/></clipPath><g class="st0"><g><defs><rect id="SVGID_3_" width="168" height="100"/></defs><clipPath id="SVGID_4_"><use xlink:href="#SVGID_3_" overflow="visible"/></clipPath><g class="st1"><defs><path id="SVGID_5_" d="M15.6 0.3H152c8.6 0 15.6 7 15.6 15.6v52c0 8.6-7 15.6-15.6 15.6h-48.9l6.7 16.4L80.2 83.6H15.6C7 83.6 0 76.6 0 67.9v-52C0 7.3 7 0.3 15.6 0.3"/></defs><clipPath id="SVGID_6_"><use xlink:href="#SVGID_5_" overflow="visible"/></clipPath><g class="st2"><defs><rect id="SVGID_7_" width="168" height="100"/></defs><clipPath id="SVGID_8_"><use xlink:href="#SVGID_7_" overflow="visible"/></clipPath><rect x="-10" y="-9.7" class="st3" width="187.6" height="119.7"/></g></g></g></g></g><g><defs><path id="SVGID_9_" d="M8.4 14.5c1-1.3 2.4-2 4.3-2.1 3.5-0.2 5.5 1.4 6 4.9 2.1 14.3 4.4 26.4 6.9 36.4l15-28.6c1.4-2.6 3.1-3.9 5.2-4.1 3-0.2 4.9 1.7 5.6 5.7 1.7 9.1 3.9 16.9 6.5 23.4 1.8-17.4 4.8-30 9-37.7 1-1.9 2.5-2.9 4.5-3 1.6-0.1 3 0.3 4.3 1.4 1.3 1 2 2.3 2.1 3.9 0.1 1.2-0.1 2.3-0.7 3.3 -2.7 5-4.9 13.2-6.6 24.7 -1.7 11.1-2.3 19.8-1.9 26.1 0.1 1.7-0.1 3.2-0.8 4.5 -0.8 1.5-2 2.4-3.7 2.5 -1.8 0.1-3.6-0.7-5.4-2.5C52.4 66.7 47.4 57 43.7 44.1c-4.4 8.8-7.7 15.3-9.9 19.7 -4 7.7-7.5 11.7-10.3 11.9 -1.9 0.1-3.5-1.4-4.8-4.7 -3.5-9-7.3-26.3-11.3-52C7.1 17.3 7.5 15.8 8.4 14.5"/></defs><clipPath id="SVGID_10_"><use xlink:href="#SVGID_9_" overflow="visible"/></clipPath><rect x="-2.7" y="-0.6" class="st4" width="90.6" height="86.4"/></g><g><defs><path id="SVGID_11_" d="M155.6 25.2c-2.5-4.3-6.1-6.9-11-7.9 -1.3-0.3-2.5-0.4-3.7-0.4 -6.6 0-11.9 3.4-16.1 10.2 -3.6 5.8-5.3 12.3-5.3 19.3 0 5.3 1.1 9.8 3.3 13.6 2.5 4.3 6.1 6.9 11 7.9 1.3 0.3 2.5 0.4 3.7 0.4 6.6 0 12-3.4 16.1-10.2 3.6-5.9 5.3-12.4 5.3-19.4C159 33.4 157.9 28.9 155.6 25.2zM147 44.2c-0.9 4.5-2.7 7.9-5.2 10.1 -2 1.8-3.9 2.5-5.5 2.2 -1.7-0.3-3-1.8-4-4.4 -0.8-2.1-1.2-4.2-1.2-6.2 0-1.7 0.2-3.4 0.5-5 0.6-2.8 1.8-5.5 3.6-8.1 2.3-3.3 4.7-4.8 7.1-4.2 1.7 0.3 3 1.8 4 4.4 0.8 2.1 1.2 4.2 1.2 6.2C147.5 40.9 147.3 42.6 147 44.2z"/></defs><clipPath id="SVGID_12_"><use xlink:href="#SVGID_11_" overflow="visible"/></clipPath><rect x="109.6" y="6.9" class="st5" width="59.4" height="71.4"/></g><g><defs><path id="SVGID_13_" d="M112.7 25.2c-2.5-4.3-6.1-6.9-11-7.9 -1.3-0.3-2.5-0.4-3.7-0.4 -6.6 0-11.9 3.4-16.1 10.2 -3.5 5.8-5.3 12.3-5.3 19.3 0 5.3 1.1 9.8 3.3 13.6 2.5 4.3 6.1 6.9 11 7.9 1.3 0.3 2.5 0.4 3.7 0.4 6.6 0 12-3.4 16.1-10.2 3.5-5.9 5.3-12.4 5.3-19.4C116 33.4 114.9 28.9 112.7 25.2zM104.1 44.2c-0.9 4.5-2.7 7.9-5.2 10.1 -2 1.8-3.9 2.5-5.5 2.2 -1.7-0.3-3-1.8-4-4.4 -0.8-2.1-1.2-4.2-1.2-6.2 0-1.7 0.2-3.4 0.5-5 0.6-2.8 1.8-5.5 3.6-8.1 2.3-3.3 4.7-4.8 7.1-4.2 1.7 0.3 3 1.8 4 4.4 0.8 2.1 1.2 4.2 1.2 6.2C104.6 40.9 104.4 42.6 104.1 44.2z"/></defs><clipPath id="SVGID_14_"><use xlink:href="#SVGID_13_" overflow="visible"/></clipPath><rect x="66.7" y="6.9" class="st6" width="59.4" height="71.4"/></g></svg></div>';
586
					break;
587
				default:
588
					$envelope->content->icon = '';
589
					break;
590
			}
591
592
			$jetpack = \Jetpack::init();
593
			$jetpack->stat( 'jitm', $envelope->id . '-viewed-' . JETPACK__VERSION );
594
			$jetpack->do_stats( 'server_side' );
595
		}
596
597
		return $envelopes;
598
	}
599
}
600