PluginProbe ʕ •ᴥ•ʔ
Jetpack – WP Security, Backup, Speed, & Growth / 7.0.3
Jetpack – WP Security, Backup, Speed, & Growth v7.0.3
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 / class.jetpack-idc.php
jetpack Last commit date
3rd-party 7 years ago _inc 6 years ago bin 7 years ago css 7 years ago images 6 years ago json-endpoints 7 years ago languages 7 years ago modules 5 years ago sal 7 years ago scss 7 years ago sync 7 years ago views 7 years ago .svnignore 12 years ago CODE-OF-CONDUCT.md 9 years ago changelog.txt 7 years ago class.frame-nonce-preview.php 9 years ago class.jetpack-admin.php 7 years ago class.jetpack-affiliate.php 7 years ago class.jetpack-autoupdate.php 8 years ago class.jetpack-bbpress-json-api-compat.php 9 years ago class.jetpack-cli.php 7 years ago class.jetpack-client-server.php 8 years ago class.jetpack-client.php 7 years ago class.jetpack-connection-banner.php 7 years ago class.jetpack-constants.php 8 years ago class.jetpack-data.php 7 years ago class.jetpack-debugger.php 7 years ago class.jetpack-error.php 10 years ago class.jetpack-gutenberg.php 7 years ago class.jetpack-heartbeat.php 7 years ago class.jetpack-idc.php 8 years ago class.jetpack-ixr-client.php 10 years ago class.jetpack-jitm.php 7 years ago class.jetpack-modules-list-table.php 8 years ago class.jetpack-network-sites-list-table.php 9 years ago class.jetpack-network.php 7 years ago class.jetpack-options.php 7 years ago class.jetpack-post-images.php 7 years ago class.jetpack-signature.php 7 years ago class.jetpack-tracks.php 8 years ago class.jetpack-twitter-cards.php 7 years ago class.jetpack-user-agent.php 8 years ago class.jetpack-xmlrpc-server.php 7 years ago class.jetpack.php 7 years ago class.json-api-endpoints.php 7 years ago class.json-api.php 7 years ago class.photon.php 7 years ago composer.json 7 years ago functions.compat.php 7 years ago functions.gallery.php 8 years ago functions.global.php 7 years ago functions.opengraph.php 7 years ago functions.photon.php 8 years ago jetpack.php 5 years ago json-api-config.php 10 years ago json-endpoints.php 7 years ago locales.php 7 years ago readme.txt 5 years ago require-lib.php 7 years ago uninstall.php 8 years ago wpml-config.xml 10 years ago
class.jetpack-idc.php
701 lines
1 <?php
2
3 /**
4 * This class will handle everything involved with fixing an Identity Crisis.
5 *
6 * @since 4.4.0
7 */
8 class Jetpack_IDC {
9
10 /**
11 * @var Jetpack_IDC
12 **/
13 private static $instance = null;
14
15 /**
16 * The wpcom value of the home URL
17 * @var string
18 */
19 static $wpcom_home_url;
20
21 /**
22 * Has safe mode been confirmed?
23 * @var bool
24 */
25 static $is_safe_mode_confirmed;
26
27 /**
28 * The current screen, which is set if the current user is a non-admin and this is an admin page.
29 * @var WP_Screen
30 */
31 static $current_screen;
32
33 /**
34 * The link to the support document used to explain Safe Mode to users
35 * @var string
36 */
37 const SAFE_MODE_DOC_LINK = 'https://jetpack.com/support/safe-mode';
38
39 static function init() {
40 if ( is_null( self::$instance ) ) {
41 self::$instance = new Jetpack_IDC;
42 }
43
44 return self::$instance;
45 }
46
47 private function __construct() {
48 add_action( 'jetpack_sync_processed_actions', array( $this, 'maybe_clear_migrate_option' ) );
49
50 if ( false === $urls_in_crisis = Jetpack::check_identity_crisis() ) {
51 return;
52 }
53
54 self::$wpcom_home_url = $urls_in_crisis['wpcom_home'];
55 add_action( 'init', array( $this, 'wordpress_init' ) );
56 }
57
58 /**
59 * This method loops through the array of processed items from sync and checks if one of the items was the
60 * home_url or site_url callable. If so, then we delete the jetpack_migrate_for_idc option.
61 *
62 * @param $processed_items array Array of processed items that were synced to WordPress.com
63 */
64 function maybe_clear_migrate_option( $processed_items ) {
65 foreach ( (array) $processed_items as $item ) {
66
67 // First, is this item a jetpack_sync_callable action? If so, then proceed.
68 $callable_args = ( is_array( $item ) && isset( $item[0], $item[1] ) && 'jetpack_sync_callable' === $item[0] )
69 ? $item[1]
70 : null;
71
72 // Second, if $callable_args is set, check if the callable was home_url or site_url. If so,
73 // clear the migrate option.
74 if (
75 isset( $callable_args, $callable_args[0] )
76 && ( 'home_url' === $callable_args[0] || 'site_url' === $callable_args[1] )
77 ) {
78 Jetpack_Options::delete_option( 'migrate_for_idc' );
79 break;
80 }
81 }
82 }
83
84 function wordpress_init() {
85 if ( ! current_user_can( 'jetpack_disconnect' ) && is_admin() ) {
86 add_action( 'admin_notices', array( $this, 'display_non_admin_idc_notice' ) );
87 add_action( 'admin_enqueue_scripts', array( $this,'enqueue_idc_notice_files' ) );
88 add_action( 'current_screen', array( $this, 'non_admins_current_screen_check' ) );
89 return;
90 }
91
92 if (
93 isset( $_GET['jetpack_idc_clear_confirmation'], $_GET['_wpnonce'] ) &&
94 wp_verify_nonce( $_GET['_wpnonce'], 'jetpack_idc_clear_confirmation' )
95 ) {
96 Jetpack_Options::delete_option( 'safe_mode_confirmed' );
97 self::$is_safe_mode_confirmed = false;
98 } else {
99 self::$is_safe_mode_confirmed = (bool) Jetpack_Options::get_option( 'safe_mode_confirmed' );
100 }
101
102 // 121 Priority so that it's the most inner Jetpack item in the admin bar.
103 add_action( 'admin_bar_menu', array( $this, 'display_admin_bar_button' ), 121 );
104 add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_admin_bar_css' ) );
105
106 if ( is_admin() && ! self::$is_safe_mode_confirmed ) {
107 add_action( 'admin_notices', array( $this, 'display_idc_notice' ) );
108 add_action( 'admin_enqueue_scripts', array( $this,'enqueue_idc_notice_files' ) );
109 }
110 }
111
112 function non_admins_current_screen_check( $current_screen ) {
113 self::$current_screen = $current_screen;
114 if ( isset( $current_screen->id ) && 'toplevel_page_jetpack' == $current_screen->id ) {
115 return null;
116 }
117
118 // If the user has dismissed the notice, and we're not currently on a Jetpack page,
119 // then do not show the non-admin notice.
120 if ( isset( $_COOKIE, $_COOKIE['jetpack_idc_dismiss_notice'] ) ) {
121 remove_action( 'admin_notices', array( $this, 'display_non_admin_idc_notice' ) );
122 remove_action( 'admin_enqueue_scripts', array( $this,'enqueue_idc_notice_files' ) );
123 }
124 }
125
126 function display_admin_bar_button() {
127 global $wp_admin_bar;
128
129 $href = is_admin()
130 ? add_query_arg( 'jetpack_idc_clear_confirmation', '1' )
131 : add_query_arg( 'jetpack_idc_clear_confirmation', '1', admin_url() );
132
133 $href = wp_nonce_url( $href, 'jetpack_idc_clear_confirmation' );
134
135 $title = sprintf(
136 '<span class="jp-idc-admin-bar">%s %s</span>',
137 '<span class="dashicons dashicons-warning"></span>',
138 esc_html__( 'Jetpack Safe Mode', 'jetpack' )
139 );
140
141 $menu = array(
142 'id' => 'jetpack-idc',
143 'title' => $title,
144 'href' => esc_url( $href ),
145 'parent' => 'top-secondary',
146 );
147
148 if ( ! self::$is_safe_mode_confirmed ) {
149 $menu['meta'] = array(
150 'class' => 'hide'
151 );
152 }
153
154 $wp_admin_bar->add_node( $menu );
155 }
156
157 static function prepare_url_for_display( $url ) {
158 return untrailingslashit( Jetpack::normalize_url_protocol_agnostic( $url ) );
159 }
160
161 /**
162 * Clears all IDC specific options. This method is used on disconnect and reconnect.
163 */
164 static function clear_all_idc_options() {
165 // If the site is currently in IDC, let's also clear the VaultPress connection options.
166 // We have to check if the site is in IDC, otherwise we'd be clearing the VaultPress
167 // connection any time the Jetpack connection is cycled.
168 if ( Jetpack::validate_sync_error_idc_option() ) {
169 delete_option( 'vaultpress' );
170 delete_option( 'vaultpress_auto_register' );
171 }
172
173 Jetpack_Options::delete_option(
174 array(
175 'sync_error_idc',
176 'safe_mode_confirmed',
177 'migrate_for_idc',
178 )
179 );
180 }
181
182 /**
183 * Does the current admin page have help tabs?
184 *
185 * @return bool
186 */
187 function admin_page_has_help_tabs() {
188 if ( ! function_exists( 'get_current_screen' ) ) {
189 return false;
190 }
191
192 $current_screen = get_current_screen();
193 $tabs = $current_screen->get_help_tabs();
194
195 return ! empty( $tabs );
196 }
197
198 function display_non_admin_idc_notice() {
199 $classes = 'jp-idc-notice inline is-non-admin notice notice-warning';
200 if ( isset( self::$current_screen ) && 'toplevel_page_jetpack' != self::$current_screen->id ) {
201 $classes .= ' is-dismissible';
202 }
203
204 if ( $this->admin_page_has_help_tabs() ) {
205 $classes .= ' has-help-tabs';
206 }
207 ?>
208
209 <div class="<?php echo $classes; ?>">
210 <?php $this->render_notice_header(); ?>
211 <div class="jp-idc-notice__content-header">
212 <h3 class="jp-idc-notice__content-header__lead">
213 <?php echo $this->get_non_admin_notice_text(); ?>
214 </h3>
215
216 <p class="jp-idc-notice__content-header__explanation">
217 <?php echo $this->get_non_admin_contact_admin_text(); ?>
218 </p>
219 </div>
220 </div>
221 <?php }
222
223 /**
224 * First "step" of the IDC mitigation. Will provide some messaging and two options/buttons.
225 * "Confirm Staging" - Dismiss the notice and continue on with our lives in staging mode.
226 * "Fix Jetpack Connection" - Will disconnect the site and start the mitigation...
227 */
228 function display_idc_notice() {
229 $classes = 'jp-idc-notice inline notice notice-warning';
230 if ( $this->admin_page_has_help_tabs() ) {
231 $classes .= ' has-help-tabs';
232 }
233 ?>
234 <div class="<?php echo $classes; ?>">
235 <?php $this->render_notice_header(); ?>
236 <?php $this->render_notice_first_step(); ?>
237 <?php $this->render_notice_second_step(); ?>
238 </div>
239 <?php }
240
241 function enqueue_admin_bar_css() {
242 wp_enqueue_style(
243 'jetpack-idc-admin-bar-css',
244 plugins_url( 'css/jetpack-idc-admin-bar.css', JETPACK__PLUGIN_FILE ),
245 array( 'dashicons' ),
246 JETPACK__VERSION
247 );
248 }
249
250 /**
251 * Enqueue scripts for the notice
252 */
253 function enqueue_idc_notice_files() {
254
255 wp_enqueue_script(
256 'jetpack-idc-js',
257 Jetpack::get_file_url_for_environment( '_inc/build/idc-notice.min.js', '_inc/idc-notice.js' ),
258 array( 'jquery' ),
259 JETPACK__VERSION,
260 true
261 );
262
263 wp_localize_script(
264 'jetpack-idc-js',
265 'idcL10n',
266 array(
267 'apiRoot' => esc_url_raw( rest_url() ),
268 'nonce' => wp_create_nonce( 'wp_rest' ),
269 'tracksUserData' => Jetpack_Tracks_Client::get_connected_user_tracks_identity(),
270 'currentUrl' => remove_query_arg( '_wpnonce', remove_query_arg( 'jetpack_idc_clear_confirmation' ) ),
271 'tracksEventData' => array(
272 'isAdmin' => current_user_can( 'jetpack_disconnect' ),
273 'currentScreen' => self::$current_screen ? self::$current_screen->id : false,
274 ),
275 )
276 );
277
278 if ( ! wp_style_is( 'jetpack-dops-style' ) ) {
279 wp_register_style(
280 'jetpack-dops-style',
281 plugins_url( '_inc/build/admin.dops-style.css', JETPACK__PLUGIN_FILE ),
282 array(),
283 JETPACK__VERSION
284 );
285 }
286
287 wp_enqueue_style(
288 'jetpack-idc-css',
289 plugins_url( 'css/jetpack-idc.css', JETPACK__PLUGIN_FILE ),
290 array( 'jetpack-dops-style' ),
291 JETPACK__VERSION
292 );
293
294 // Required for Tracks
295 wp_enqueue_script(
296 'jp-tracks',
297 '//stats.wp.com/w.js',
298 array(),
299 gmdate( 'YW' ),
300 true
301 );
302
303 wp_enqueue_script(
304 'jp-tracks-functions',
305 plugins_url( '_inc/lib/tracks/tracks-callables.js', JETPACK__PLUGIN_FILE ),
306 array(),
307 JETPACK__VERSION,
308 false
309 );
310 }
311
312 function render_notice_header() { ?>
313 <div class="jp-idc-notice__header">
314 <div class="jp-idc-notice__header__emblem">
315 <?php echo Jetpack::get_jp_emblem(); ?>
316 </div>
317 <p class="jp-idc-notice__header__text">
318 <?php esc_html_e( 'Jetpack Safe Mode', 'jetpack' ); ?>
319 </p>
320 </div>
321
322 <div class="jp-idc-notice__separator"></div>
323 <?php }
324
325 /**
326 * Is a container for the error notices.
327 * Will be shown/controlled by jQuery in idc-notice.js
328 */
329 function render_error_notice() { ?>
330 <div class="jp-idc-error__notice dops-notice is-error">
331 <svg class="gridicon gridicons-notice dops-notice__icon" height="24" width="24" viewBox="0 0 24 24">
332 <g>
333 <path d="M12 2C6.477 2 2 6.477 2 12s4.477 10 10 10 10-4.477 10-10S17.523 2 12 2zm1 15h-2v-2h2v2zm0-4h-2l-.5-6h3l-.5 6z"></path>
334 </g>
335 </svg>
336 <div class="dops-notice__content">
337 <span class="dops-notice__text">
338 <?php esc_html_e( 'Something went wrong:', 'jetpack' ); ?>
339 <span class="jp-idc-error__desc"></span>
340 </span>
341 <a class="dops-notice__action" href="javascript:void(0);">
342 <span id="jp-idc-error__action">
343 <?php esc_html_e( 'Try Again', 'jetpack' ); ?>
344 </span>
345 </a>
346 </div>
347 </div>
348 <?php }
349
350 function render_notice_first_step() { ?>
351 <div class="jp-idc-notice__first-step">
352 <div class="jp-idc-notice__content-header">
353 <h3 class="jp-idc-notice__content-header__lead">
354 <?php echo $this->get_first_step_header_lead(); ?>
355 </h3>
356
357 <p class="jp-idc-notice__content-header__explanation">
358 <?php echo $this->get_first_step_header_explanation(); ?>
359 </p>
360 </div>
361
362 <?php $this->render_error_notice(); ?>
363
364 <div class="jp-idc-notice__actions">
365 <div class="jp-idc-notice__action">
366 <p class="jp-idc-notice__action__explanation">
367 <?php echo $this->get_confirm_safe_mode_action_explanation(); ?>
368 </p>
369 <button id="jp-idc-confirm-safe-mode-action" class="dops-button">
370 <?php echo $this->get_confirm_safe_mode_button_text(); ?>
371 </button>
372 </div>
373
374 <div class="jp-idc-notice__action">
375 <p class="jp-idc-notice__action__explanation">
376 <?php echo $this->get_first_step_fix_connection_action_explanation(); ?>
377 </p>
378 <button id="jp-idc-fix-connection-action" class="dops-button">
379 <?php echo $this->get_first_step_fix_connection_button_text(); ?>
380 </button>
381 </div>
382 </div>
383 </div>
384 <?php }
385
386 function render_notice_second_step() { ?>
387 <div class="jp-idc-notice__second-step">
388 <div class="jp-idc-notice__content-header">
389 <h3 class="jp-idc-notice__content-header__lead">
390 <?php echo $this->get_second_step_header_lead(); ?>
391 </h3>
392 </div>
393
394 <?php $this->render_error_notice(); ?>
395
396 <div class="jp-idc-notice__actions">
397 <div class="jp-idc-notice__action">
398 <p class="jp-idc-notice__action__explanation">
399 <?php echo $this->get_migrate_site_action_explanation(); ?>
400 </p>
401 <button id="jp-idc-migrate-action" class="dops-button">
402 <?php echo $this->get_migrate_site_button_text(); ?>
403 </button>
404 </div>
405
406 <div class="jp-idc-notice__action">
407 <p class="jp-idc-notice__action__explanation">
408 <?php echo $this->get_start_fresh_action_explanation(); ?>
409 </p>
410 <button id="jp-idc-reconnect-site-action" class="dops-button">
411 <?php echo $this->get_start_fresh_button_text(); ?>
412 </button>
413 </div>
414
415 </div>
416
417 <p class="jp-idc-notice__unsure-prompt">
418 <?php echo $this->get_unsure_prompt(); ?>
419 </p>
420 </div>
421 <?php }
422
423 function get_first_step_header_lead() {
424 $html = wp_kses(
425 sprintf(
426 __(
427 'Jetpack has been placed into <a href="%1$s">Safe mode</a> because we noticed this is an exact copy of <a href="%2$s">%3$s</a>.',
428 'jetpack'
429 ),
430 esc_url( self::SAFE_MODE_DOC_LINK ),
431 esc_url( self::$wpcom_home_url ),
432 self::prepare_url_for_display( esc_url_raw( self::$wpcom_home_url ) )
433 ),
434 array( 'a' => array( 'href' => array() ) )
435 );
436
437 /**
438 * Allows overriding of the default header text in the first step of the Safe Mode notice.
439 *
440 * @since 4.4.0
441 *
442 * @param string $html The HTML to be displayed
443 */
444 return apply_filters( 'jetpack_idc_first_step_header_lead', $html );
445 }
446
447 function get_first_step_header_explanation() {
448 $html = wp_kses(
449 sprintf(
450 __(
451 'Please confirm Safe Mode or fix the Jetpack connection. Select one of the options below or <a href="%1$s">learn
452 more about Safe Mode</a>.',
453 'jetpack'
454 ),
455 esc_url( self::SAFE_MODE_DOC_LINK )
456 ),
457 array( 'a' => array( 'href' => array() ) )
458 );
459
460 /**
461 * Allows overriding of the default header explanation text in the first step of the Safe Mode notice.
462 *
463 * @since 4.4.0
464 *
465 * @param string $html The HTML to be displayed
466 */
467 return apply_filters( 'jetpack_idc_first_step_header_explanation', $html );
468 }
469
470 function get_confirm_safe_mode_action_explanation() {
471 $html = wp_kses(
472 sprintf(
473 __(
474 'Is this website a temporary duplicate of <a href="%1$s">%2$s</a> for the purposes
475 of testing, staging or development? If so, we recommend keeping it in Safe Mode.',
476 'jetpack'
477 ),
478 esc_url( untrailingslashit( self::$wpcom_home_url ) ),
479 self::prepare_url_for_display( esc_url( self::$wpcom_home_url ) )
480 ),
481 array( 'a' => array( 'href' => array() ) )
482 );
483
484 /**
485 * Allows overriding of the default text used to explain the confirm safe mode action.
486 *
487 * @since 4.4.0
488 *
489 * @param string $html The HTML to be displayed
490 */
491 return apply_filters( 'jetpack_idc_confirm_safe_mode_explanation', $html );
492 }
493
494 function get_confirm_safe_mode_button_text() {
495 $string = esc_html__( 'Confirm Safe Mode', 'jetpack' );
496
497 /**
498 * Allows overriding of the default text used for the confirm safe mode action button.
499 *
500 * @since 4.4.0
501 *
502 * @param string $string The string to be displayed
503 */
504 return apply_filters( 'jetpack_idc_confirm_safe_mode_button_text', $string );
505 }
506
507 function get_first_step_fix_connection_action_explanation() {
508 $html = wp_kses(
509 sprintf(
510 __(
511 'If this is a separate and new website, or the new home of <a href="%1$s">%2$s</a>,
512 we recommend turning Safe Mode off, and re-establishing your connection to WordPress.com.',
513 'jetpack'
514 ),
515 esc_url( untrailingslashit( self::$wpcom_home_url ) ),
516 self::prepare_url_for_display( esc_url( self::$wpcom_home_url ) )
517 ),
518 array( 'a' => array( 'href' => array() ) )
519 );
520
521 /**
522 * Allows overriding of the default text used to explain the fix Jetpack connection action.
523 *
524 * @since 4.4.0
525 *
526 * @param string $html The HTML to be displayed
527 */
528 return apply_filters( 'jetpack_idc_first_fix_connection_explanation', $html );
529 }
530
531 function get_first_step_fix_connection_button_text() {
532 $string = esc_html__( "Fix Jetpack's Connection", 'jetpack' );
533
534 /**
535 * Allows overriding of the default text used for the fix Jetpack connection action button.
536 *
537 * @since 4.4.0
538 *
539 * @param string $string The string to be displayed
540 */
541 return apply_filters( 'jetpack_idc_first_step_fix_connection_button_text', $string );
542 }
543
544 function get_second_step_header_lead() {
545 $string = sprintf(
546 esc_html__(
547 'Is %1$s the new home of %2$s?',
548 'jetpack'
549 ),
550 untrailingslashit( Jetpack::normalize_url_protocol_agnostic( get_home_url() ) ),
551 untrailingslashit( Jetpack::normalize_url_protocol_agnostic( esc_url_raw( self::$wpcom_home_url ) ) )
552 );
553
554 /**
555 * Allows overriding of the default header text in the second step of the Safe Mode notice.
556 *
557 * @since 4.4.0
558 *
559 * @param string $html The HTML to be displayed
560 */
561 return apply_filters( 'jetpack_idc_second_step_header_lead', $string );
562 }
563
564 function get_migrate_site_action_explanation() {
565 $html = wp_kses(
566 sprintf(
567 __(
568 'Yes. <a href="%1$s">%2$s</a> is replacing <a href="%3$s">%4$s</a>. I would like to
569 migrate my stats and subscribers from <a href="%3$s">%4$s</a> to <a href="%1$s">%2$s</a>.',
570 'jetpack'
571 ),
572 esc_url( get_home_url() ),
573 self::prepare_url_for_display( get_home_url() ),
574 esc_url( self::$wpcom_home_url ),
575 untrailingslashit( Jetpack::normalize_url_protocol_agnostic( esc_url_raw( self::$wpcom_home_url ) ) )
576 ),
577 array( 'a' => array( 'href' => array() ) )
578 );
579
580 /**
581 * Allows overriding of the default text for explaining the migrate site action.
582 *
583 * @since 4.4.0
584 *
585 * @param string $html The HTML to be displayed
586 */
587 return apply_filters( 'jetpack_idc_migrate_site_explanation', $html );
588 }
589
590 function get_migrate_site_button_text() {
591 $string = esc_html__( 'Migrate Stats &amp; Subscribers', 'jetpack' );
592
593 /**
594 * Allows overriding of the default text used for the migrate site action button.
595 *
596 * @since 4.4.0
597 *
598 * @param string $string The string to be displayed
599 */
600 return apply_filters( 'jetpack_idc_migrate_site_button_text', $string );
601 }
602
603 function get_start_fresh_action_explanation() {
604 $html = wp_kses(
605 sprintf(
606 __(
607 'No. <a href="%1$s">%2$s</a> is a new and different website that\'s separate from
608 <a href="%3$s">%4$s</a>. It requires a new connection to WordPress.com for new stats and subscribers.',
609 'jetpack'
610 ),
611 esc_url( get_home_url() ),
612 self::prepare_url_for_display( get_home_url() ),
613 esc_url( self::$wpcom_home_url ),
614 untrailingslashit( Jetpack::normalize_url_protocol_agnostic( esc_url_raw( self::$wpcom_home_url ) ) )
615 ),
616 array( 'a' => array( 'href' => array() ) )
617 );
618
619 /**
620 * Allows overriding of the default text for explaining the start fresh action.
621 *
622 * @since 4.4.0
623 *
624 * @param string $html The HTML to be displayed
625 */
626 return apply_filters( 'jetpack_idc_start_fresh_explanation', $html );
627 }
628
629 function get_start_fresh_button_text() {
630 $string = esc_html__( 'Start Fresh &amp; Create New Connection', 'jetpack' );
631
632 /**
633 * Allows overriding of the default text used for the start fresh action button.
634 *
635 * @since 4.4.0
636 *
637 * @param string $string The string to be displayed
638 */
639 return apply_filters( 'jetpack_idc_start_fresh_button_text', $string );
640 }
641
642 function get_unsure_prompt() {
643 $html = wp_kses(
644 sprintf(
645 __(
646 'Unsure what to do? <a href="%1$s">Read more about Jetpack Safe Mode</a>',
647 'jetpack'
648 ),
649 esc_url( self::SAFE_MODE_DOC_LINK )
650 ),
651 array( 'a' => array( 'href' => array() ) )
652 );
653
654 /**
655 * Allows overriding of the default text using in the "Unsure what to do?" prompt.
656 *
657 * @since 4.4.0
658 *
659 * @param string $html The HTML to be displayed
660 */
661 return apply_filters( 'jetpack_idc_unsure_prompt', $html );
662 }
663
664 function get_non_admin_notice_text() {
665 $html = wp_kses(
666 sprintf(
667 __(
668 'Jetpack has been placed into Safe Mode. Learn more about <a href="%1$s">Safe Mode</a>.',
669 'jetpack'
670 ),
671 esc_url( self::SAFE_MODE_DOC_LINK )
672 ),
673 array( 'a' => array( 'href' => array() ) )
674 );
675
676 /**
677 * Allows overriding of the default text that is displayed to non-admin on the Jetpack admin page.
678 *
679 * @since 4.4.0
680 *
681 * @param string $html The HTML to be displayed
682 */
683 return apply_filters( 'jetpack_idc_non_admin_notice_text', $html );
684 }
685
686 function get_non_admin_contact_admin_text() {
687 $string = esc_html__( 'An administrator of this site can take Jetpack out of Safe Mode.', 'jetpack' );
688
689 /**
690 * Allows overriding of the default text that is displayed to non-admins prompting them to contact an admin.
691 *
692 * @since 4.4.0
693 *
694 * @param string $string The string to be displayed
695 */
696 return apply_filters( 'jetpack_idc_non_admin_contact_admin_text', $string );
697 }
698 }
699
700 Jetpack_IDC::init();
701