Completed
Push — add/sync-rest-2 ( d8d9e1...b5bd8a )
by
unknown
64:16 queued 55:22
created

Jetpack_Sync_Client::post_ids_to_posts()   B

Complexity

Conditions 4
Paths 6

Size

Total Lines 27
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
dl 0
loc 27
rs 8.5806
c 1
b 0
f 0
cc 4
eloc 17
nc 6
nop 1
1
<?php
2
require_once dirname( __FILE__ ) . '/class.jetpack-sync-deflate-codec.php';
3
require_once dirname( __FILE__ ) . '/class.jetpack-sync-queue.php';
4
require_once dirname( __FILE__ ) . '/class.jetpack-sync-functions.php';
5
require_once dirname( __FILE__ ) . '/class.jetpack-sync-full.php';
6
7
class Jetpack_Sync_Client {
8
	static $default_options_whitelist = array( 
0 ignored issues
show
Coding Style introduced by
The visibility should be declared for property $default_options_whitelist.

The PSR-2 coding standard requires that all properties in a class have their visibility explicitly declared. If you declare a property using

class A {
    var $property;
}

the property is implicitly global.

To learn more about the PSR-2, please see the PHP-FIG site on the PSR-2.

Loading history...
9
		'stylesheet', 
10
		'/^theme_mods_.*$/',
11
		'blogname',
12
		'home',
13
		'siteurl',
14
		'blogdescription',
15
		'blog_charset',
16
		'permalink_structure',
17
		'category_base',
18
		'tag_base',
19
		'comment_moderation',
20
		'default_comment_status',
21
		'thread_comments',
22
		'thread_comments_depth',
23
		'jetpack_site_icon_url',
24
		'social_notifications_like',
25
		'page_on_front',
26
		'rss_use_excerpt',
27
		'subscription_options',
28
		'stb_enabled',
29
		'stc_enabled',
30
		'comment_registration',
31
		'require_name_email',
32
		'show_avatars',
33
		'avatar_default',
34
		'avatar_rating',
35
		'highlander_comment_form_prompt',
36
		'jetpack_comment_form_color_scheme',
37
		'stats_options',
38
		'gmt_offset',
39
		'timezone_string',
40
		'jetpack_sync_non_public_post_stati',
41
		'jetpack_options',
42
		'site_icon', // (int) - ID of core's Site Icon attachment ID
43
		'default_post_format',
44
		'default_category',
45
		'large_size_w',
46
		'large_size_h',
47
		'thumbnail_size_w',
48
		'thumbnail_size_h',
49
		'medium_size_w',
50
		'medium_size_h',
51
		'thumbnail_crop',
52
		'image_default_link_type',
53
		'site_logo',
54
		'sharing-options',
55
		'sharing-services',
56
		'post_count',
57
		'default_ping_status',
58
		'sticky_posts',
59
		'disabled_likes',
60
		'blog_public',
61
		'default_pingback_flag',
62
		'require_name_email',
63
		'close_comments_for_old_posts',
64
		'close_comments_days_old',
65
		'thread_comments',
66
		'thread_comments_depth',
67
		'page_comments',
68
		'comments_per_page',
69
		'default_comments_page',
70
		'comment_order',
71
		'comments_notify',
72
		'moderation_notify',
73
		'social_notifications_like',
74
		'social_notifications_reblog',
75
		'social_notifications_subscribe',
76
		'comment_whitelist',
77
		'comment_max_links',
78
		'moderation_keys',
79
		'blacklist_keys',
80
		'lang_id',
81
		'wga',
82
		'disabled_likes',
83
		'disabled_reblogs',
84
		'jetpack_comment_likes_enabled',
85
		'twitter_via',
86
		'twitter-cards-site-tag' );
87
88
	static $default_constants_whitelist = array(
0 ignored issues
show
Coding Style introduced by
The visibility should be declared for property $default_constants_whitelist.

The PSR-2 coding standard requires that all properties in a class have their visibility explicitly declared. If you declare a property using

class A {
    var $property;
}

the property is implicitly global.

To learn more about the PSR-2, please see the PHP-FIG site on the PSR-2.

Loading history...
89
		'EMPTY_TRASH_DAYS',
90
		'WP_POST_REVISIONS',
91
		'AUTOMATIC_UPDATER_DISABLED',
92
		'ABSPATH',
93
		'WP_CONTENT_DIR',
94
		'FS_METHOD',
95
		'DISALLOW_FILE_EDIT',
96
		'DISALLOW_FILE_MODS',
97
		'WP_AUTO_UPDATE_CORE',
98
		'WP_HTTP_BLOCK_EXTERNAL',
99
		'WP_ACCESSIBLE_HOSTS',
100
		'JETPACK__VERSION'
101
	);
102
103
	static $default_callable_whitelist = array(
0 ignored issues
show
Coding Style introduced by
The visibility should be declared for property $default_callable_whitelist.

The PSR-2 coding standard requires that all properties in a class have their visibility explicitly declared. If you declare a property using

class A {
    var $property;
}

the property is implicitly global.

To learn more about the PSR-2, please see the PHP-FIG site on the PSR-2.

Loading history...
104
		'wp_max_upload_size' => 'wp_max_upload_size',
105
		'is_main_network' => array( 'Jetpack', 'is_multi_network' ),
106
		'is_multi_site' => 'is_multisite',
107
		'main_network_site' => 'network_site_url',
108
		'single_user_site' => array( 'Jetpack', 'is_single_user_site' ),
109
		'has_file_system_write_access' => array( 'Jetpack_Sync_Functions', 'file_system_write_access' ),
110
		'is_version_controlled' => array( 'Jetpack_Sync_Functions', 'is_version_controlled' ),
111
		'modules' => array( 'Jetpack_Sync_Functions', 'get_modules' )
112
	);
113
114
	static $default_multisite_callable_whitelist = array(
0 ignored issues
show
Coding Style introduced by
The visibility should be declared for property $default_multisite_callable_whitelist.

The PSR-2 coding standard requires that all properties in a class have their visibility explicitly declared. If you declare a property using

class A {
    var $property;
}

the property is implicitly global.

To learn more about the PSR-2, please see the PHP-FIG site on the PSR-2.

Loading history...
115
		'network_name'                        => array( 'Jetpack', 'network_name' ),
116
		'network_allow_new_registrations'     => array( 'Jetpack', 'network_allow_new_registrations' ),
117
		'network_add_new_users'               => array( 'Jetpack', 'network_add_new_users' ),
118
		'network_site_upload_space'           => array( 'Jetpack', 'network_site_upload_space' ),
119
		'network_upload_file_types'           => array( 'Jetpack', 'network_upload_file_types' ),
120
		'network_enable_administration_menus' => array( 'Jetpack', 'network_enable_administration_menus' ),
121
	);
122
123
	// TODO: move this to server? - these are theme support values
0 ignored issues
show
Coding Style Best Practice introduced by
Comments for TODO tasks are often forgotten in the code; it might be better to use a dedicated issue tracker.
Loading history...
124
	// that should be synced as jetpack_current_theme_supports_foo option values
125
	static $default_theme_support_whitelist = array(
0 ignored issues
show
Coding Style introduced by
The visibility should be declared for property $default_theme_support_whitelist.

The PSR-2 coding standard requires that all properties in a class have their visibility explicitly declared. If you declare a property using

class A {
    var $property;
}

the property is implicitly global.

To learn more about the PSR-2, please see the PHP-FIG site on the PSR-2.

Loading history...
126
		'post-thumbnails',          
127
		'post-formats',
128
		'custom-header',
129
		'custom-background',
130
		'custom-logo',
131
		'menus',
132
		'automatic-feed-links',
133
		'editor-style',
134
		'widgets',
135
		'html5',
136
		'title-tag',
137
		'jetpack-social-menu',
138
		'jetpack-responsive-videos',
139
		'infinite-scroll',
140
		'site-logo',
141
	);
142
143
	static $default_network_options_whitelist = array( 'site_name' );
0 ignored issues
show
Coding Style introduced by
The visibility should be declared for property $default_network_options_whitelist.

The PSR-2 coding standard requires that all properties in a class have their visibility explicitly declared. If you declare a property using

class A {
    var $property;
}

the property is implicitly global.

To learn more about the PSR-2, please see the PHP-FIG site on the PSR-2.

Loading history...
144
	static $constants_checksum_option_name = 'jetpack_constants_sync_checksum';
0 ignored issues
show
Coding Style introduced by
The visibility should be declared for property $constants_checksum_option_name.

The PSR-2 coding standard requires that all properties in a class have their visibility explicitly declared. If you declare a property using

class A {
    var $property;
}

the property is implicitly global.

To learn more about the PSR-2, please see the PHP-FIG site on the PSR-2.

Loading history...
145
	static $functions_checksum_option_name = 'jetpack_functions_sync_checksum';
0 ignored issues
show
Coding Style introduced by
The visibility should be declared for property $functions_checksum_option_name.

The PSR-2 coding standard requires that all properties in a class have their visibility explicitly declared. If you declare a property using

class A {
    var $property;
}

the property is implicitly global.

To learn more about the PSR-2, please see the PHP-FIG site on the PSR-2.

Loading history...
146
	static $default_send_buffer_size = 20;
0 ignored issues
show
Coding Style introduced by
The visibility should be declared for property $default_send_buffer_size.

The PSR-2 coding standard requires that all properties in a class have their visibility explicitly declared. If you declare a property using

class A {
    var $property;
}

the property is implicitly global.

To learn more about the PSR-2, please see the PHP-FIG site on the PSR-2.

Loading history...
147
	static $default_taxonomy_whitelist = array();
0 ignored issues
show
Coding Style introduced by
The visibility should be declared for property $default_taxonomy_whitelist.

The PSR-2 coding standard requires that all properties in a class have their visibility explicitly declared. If you declare a property using

class A {
    var $property;
}

the property is implicitly global.

To learn more about the PSR-2, please see the PHP-FIG site on the PSR-2.

Loading history...
148
149
	private $sync_queue;
150
	private $full_sync_client;
151
	private $codec;
152
	private $options_whitelist;
153
	private $constants_whitelist;
154
	private $meta_types = array( 'post' );
155
	private $callable_whitelist;
156
	private $network_options_whitelist;
157
	private $taxonomy_whitelist;
158
159
	// singleton functions
160
	private static $instance;
161
162
	public static function getInstance() {
163
		if ( null === self::$instance ) {
164
			self::$instance = new self();
165
		}
166
167
		return self::$instance;
168
	}
169
170
	// this is necessary because you can't use "new" when you declare instance properties >:(
171
	protected function __construct() {
172
		$this->set_defaults();
173
		$this->init();
174
	}
175
176
	private function init() {
177
178
		$handler = array( $this, 'action_handler' );
179
180
		// constants
181
		add_action( 'jetpack_sync_current_constants', $handler, 10 );
182
183
		// functions
184
		add_action( 'jetpack_sync_current_callables', $handler, 10 );
185
186
		// posts
187
		add_action( 'wp_insert_post', $handler, 10, 3 );
188
		add_action( 'deleted_post', $handler, 10 );
189
190
		// comments
191
		add_action( 'wp_insert_comment', $handler, 10, 2 );
192
		add_action( 'deleted_comment', $handler, 10 );
193
		add_action( 'trashed_comment', $handler, 10 );
194
		add_action( 'spammed_comment', $handler, 10 );
195
196
		// even though it's messy, we implement these hooks because 
197
		// the edit_comment hook doesn't include the data
198
		// so this saves us a DB read for every comment event
199
		foreach ( array( '', 'trackback', 'pingback' ) as $comment_type ) {
200
			foreach ( array( 'unapproved', 'approved' ) as $comment_status ) {
201
				add_action( "comment_{$comment_status}_{$comment_type}", $handler, 10, 2 );
202
			}
203
		}
204
205
		// options
206
		add_action( 'added_option', $handler, 10, 2 );
207
		add_action( 'updated_option', $handler, 10, 3 );
208
		add_action( 'deleted_option', $handler, 10, 1 );
209
210
		// Sync Core Icon: Detect changes in Core's Site Icon and make it syncable.
211
		add_action( 'add_option_site_icon',    array( $this, 'jetpack_sync_core_icon' ) );
212
		add_action( 'update_option_site_icon', array( $this, 'jetpack_sync_core_icon' ) );
213
		add_action( 'delete_option_site_icon', array( $this, 'jetpack_sync_core_icon' ) );
214
215
		// wordpress version
216
		add_action( 'upgrader_process_complete', array( $this, 'send_wp_version' ), 10, 2 );
217
		add_action( 'jetpack_sync_wp_version', $handler );
218
		// themes
219
		add_action( 'switch_theme', array( $this, 'send_theme_info' ) );
220
		add_action( 'jetpack_sync_current_theme_support', $handler, 10 ); // custom hook, see meta-hooks below
221
222
		// post-meta, and in the future - other meta?
223
		foreach ( $this->meta_types as $meta_type ) {
224
			// we need to make sure we don't commit before we receive these,
225
			// because they're invoked after meta changes are saved to the DB
226
			add_action( "added_{$meta_type}_meta", $handler, 99, 4 );
227
			add_action( "updated_{$meta_type}_meta", $handler, 99, 4 );
228
			add_action( "deleted_{$meta_type}_meta", $handler, 99, 4 );
229
		}
230
231
		// synthetic actions for full sync
232
		add_action( 'jetpack_full_sync_start', $handler );
233
		add_action( 'jetpack_full_sync_end', $handler );
234
		add_action( 'jetpack_full_sync_option', $handler, 10, 2 );
235
		
236
		add_action( 'jetpack_full_sync_posts', $handler ); // also sends post meta and terms 
237
		add_action( 'jetpack_full_sync_comments', $handler ); // also send comments meta
238
239
		/**
240
		 * Other hooks - fire synthetic hooks for all the properties we need to sync,
241
		 * e.g. when a theme changes
242
		 */
243
244
		// themes
245
		add_action( 'set_site_transient_update_plugins', $handler, 10, 1 );
246
		add_action( 'set_site_transient_update_themes', $handler, 10, 1 );
247
		add_action( 'set_site_transient_update_core', $handler, 10, 1 );
248
249
		// multi site network options
250
		if ( $this->is_multisite ) {
0 ignored issues
show
Bug introduced by
The property is_multisite does not exist. Did you maybe forget to declare it?

In PHP it is possible to write to properties without declaring them. For example, the following is perfectly valid PHP code:

class MyClass { }

$x = new MyClass();
$x->foo = true;

Generally, it is a good practice to explictly declare properties to avoid accidental typos and provide IDE auto-completion:

class MyClass {
    public $foo;
}

$x = new MyClass();
$x->foo = true;
Loading history...
251
			add_action( 'add_site_option', $handler, 10, 2 );
252
			add_action( 'update_site_option', $handler, 10, 3 );
253
			add_action( 'delete_site_option', $handler, 10, 1 );
254
		}
255
256
		/**
257
		 * Sync all pending actions with server
258
		 */
259
		add_action( 'jetpack_sync_actions', array( $this, 'do_sync' ) );
260
261
		// terms
262
		add_action( 'created_term', array( $this, 'save_term_handler' ), 10, 3 );
263
		add_action( 'edited_term', array( $this, 'save_term_handler' ), 10, 3 );
264
		add_action( 'jetapack_sync_save_term', $handler, 10, 4 );
265
		add_action( 'delete_term', $handler, 10, 5 );
266
267
		// users
268
		add_action( 'user_register', array( $this, 'save_user_handler' ) );
269
		add_action( 'profile_update', array( $this, 'save_user_handler' ), 10, 2 );
270
		add_action( 'jetapack_sync_save_user', $handler, 10, 2 );
271
		add_action( 'deleted_user', $handler, 10 ,2 );
272
	}
273
274
	// TODO: Refactor to use one set whitelist function, with one is_whitelisted.
0 ignored issues
show
Coding Style Best Practice introduced by
Comments for TODO tasks are often forgotten in the code; it might be better to use a dedicated issue tracker.
Loading history...
275
	function set_options_whitelist( $options ) {
276
		$this->options_whitelist = $options;
277
	}
278
279
	function set_constants_whitelist( $constants ) {
280
		$this->constants_whitelist = $constants;
281
	}
282
283
	function get_callable_whitelist( $functions ) {
0 ignored issues
show
Unused Code introduced by
The parameter $functions is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
284
		return $this->callable_whitelist;
285
	}
286
287
	function set_callable_whitelist( $functions ) {
288
		$this->callable_whitelist = $functions;
289
	}
290
291
	function set_network_options_whitelist( $options ) {
292
		$this->network_options_whitelist = $options;
293
	}
294
295
	function set_send_buffer_size( $size ) {
296
		$this->sync_queue->set_checkout_size( $size );
297
	}
298
299
	function set_taxonomy_whitelist( $taxonomies ) {
300
		$this->taxonomy_whitelist = $taxonomies;
301
	}
302
303
	function is_whitelisted_option( $option ) {
304
		foreach ( $this->options_whitelist as $whitelisted_option ) {
305
			if ( $whitelisted_option[0] === '/' && preg_match( $whitelisted_option, $option ) ) {
306
				return true;
307
			} elseif ( $whitelisted_option === $option ) {
308
				return true;
309
			}
310
		}
311
312
		return false;
313
	}
314
315
	function is_whitelisted_network_option( $option ) {
316
		return $this->is_multisite && in_array( $option, $this->network_options_whitelist );
317
	}
318
319
	function set_codec( iJetpack_Sync_Codec $codec ) {
320
		$this->codec = $codec;
321
	}
322
323
	function set_full_sync_client( $full_sync_client ) {
324
		if ( $this->full_sync_client ) {
325
			remove_action( 'jetpack_sync_full', array( $this->full_sync_client, 'start' ) );
326
		}
327
328
		$this->full_sync_client = $full_sync_client;
329
330
		/**
331
		 * Sync all objects in the database with the server
332
		 */
333
		add_action( 'jetpack_sync_full', array( $this->full_sync_client, 'start' ) );
334
	}
335
336
	function get_full_sync_client() {
337
		return $this->full_sync_client;
338
	}
339
340
	function action_handler() {
341
		// TODO: it's really silly to have this function here - it should be
0 ignored issues
show
Coding Style Best Practice introduced by
Comments for TODO tasks are often forgotten in the code; it might be better to use a dedicated issue tracker.
Loading history...
342
		// wherever we initialize the action listeners or we're just wasting cycles
343
		if ( Jetpack::is_development_mode() || Jetpack::is_staging_site() ) {
344
			return false;
345
		}
346
347
		$current_filter = current_filter();
348
		$args           = func_get_args();
349
350
		if ( $current_filter === 'wp_insert_post' && $args[1]->post_type === 'revision' ) {
351
			return;
352
		}
353
354
		if ( in_array( $current_filter, array( 'deleted_option', 'added_option', 'updated_option' ) )
355
		     &&
356
		     ! $this->is_whitelisted_option( $args[0] )
357
		) {
358
			return;
359
		}
360
361
		if ( in_array( $current_filter, array( 'delete_site_option', 'add_site_option', 'update_site_option' ) )
362
		     &&
363
		     ! $this->is_whitelisted_network_option( $args[0] )
364
		) {
365
			return;
366
		}
367
368
		// don't sync private meta
369
		if ( preg_match( '/^(added|updated|deleted)_.*_meta$/', $current_filter ) && $args[2][0] === '_' ) {
370
			return;
371
		}
372
373
		$this->sync_queue->add( array(
374
			$current_filter,
375
			apply_filters( "jetack_sync_before_send_$current_filter", $args )
376
		) );
377
	}
378
379
	function send_theme_info() {
380
		global $_wp_theme_features;
381
		do_action( 'jetpack_sync_current_theme_support', $_wp_theme_features );
382
	}
383
384
	function send_wp_version( $update, $meta_data ) {
385
		if ( 'update' === $meta_data['action'] && 'core' === $meta_data['type'] ) {
386
			global $wp_version;
387
			do_action( 'jetpack_sync_wp_version', $wp_version );
388
		}
389
	}
390
391
	function save_term_handler( $term_id, $tt_id, $taxonomy ) {
392
		$term_object = WP_Term::get_instance( $term_id, $taxonomy );
393
		do_action( 'jetapack_sync_save_term', $term_id, $tt_id, $taxonomy, $term_object );
394
	}
395
396
	function save_user_handler( $user_id, $old_user_data = null ) {
397
		$user = get_user_by( 'id', $user_id );
398
		unset( $user->data->user_pass );
399
		if ( $old_user_data !== null ) {
400
			unset( $old_user_data->data->user_pass );
401
			if ( serialize( $old_user_data->data ) === serialize( $user->data ) ) {
402
				return;
403
			}
404
		}
405
		do_action( 'jetapack_sync_save_user', $user_id, $user );
406
	}
407
408
	function do_sync() {
409
		if ( defined( 'WP_IMPORTING' ) && WP_IMPORTING ) {
410
			$this->schedule_sync( "+1 minute" );
411
412
			return false;
413
		}
414
415
		$this->maybe_sync_constants();
416
		$this->maybe_sync_callables();
417
418
		$buffer = $this->sync_queue->checkout();
419
420
		if ( ! $buffer ) {
421
			// buffer has no items
422
			return;
423
		}
424
425
		if ( is_wp_error( $buffer ) ) {
426
			error_log( "Error fetching buffer: " . $buffer->get_error_message() );
0 ignored issues
show
Bug introduced by
The method get_error_message() does not seem to exist on object<Jetpack_Sync_Queue_Buffer>.

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
427
428
			return;
429
		}
430
431
		$data = $this->codec->encode( $buffer->get_items() );
432
433
		/**
434
		 * Fires when data is ready to send to the server.
435
		 * Return false or WP_Error to abort the sync (e.g. if there's an error)
436
		 * The items will be automatically re-sent later
437
		 *
438
		 * @since 4.1
439
		 *
440
		 * @param array $data The action buffer
441
		 */
442
		$result = apply_filters( 'jetpack_sync_client_send_data', $data );
443
444
		if ( ! $result || is_wp_error( $result ) ) {
445
			$this->sync_queue->checkin( $buffer );
446
			// try again in 1 minute
447
			$this->schedule_sync( "+1 minute" );
448
		} else {
449
450
			// scan the sent data to see if a full sync started or finished
451
			if ( $this->buffer_includes_action( $buffer, 'jp_full_sync_start' ) ) {
452
				do_action( 'jp_full_sync_start_sent' );
453
				$this->full_sync_client->set_status_sending_started();
454
			}
455
456
			if ( $this->buffer_includes_action( $buffer, 'jp_full_sync_end' ) ) {
457
				do_action( 'jp_full_sync_end_sent' );
458
				$this->full_sync_client->set_status_sending_finished();
459
			}
460
461
			$this->sync_queue->close( $buffer );
462
			// check if there are any more events in the buffer
463
			// if so, schedule a cron job to happen soon
464
			if ( $this->sync_queue->has_any_items() ) {
465
				$this->schedule_sync( "+1 minute" );
466
			}
467
		}
468
	}
469
470
	private function buffer_includes_action( $buffer, $action_name ) {
471
		foreach( $buffer->get_items() as $item ) {
472
			if ( $item[0] === $action_name ) {
473
				return true;
474
			}
475
		}
476
		return false;
477
	}
478
479
	private function schedule_sync( $when ) {
480
		wp_schedule_single_event( strtotime( $when ), 'jetpack_sync_actions' );
481
	}
482
483
	function force_sync_constants() {
484
		delete_option( self::$constants_checksum_option_name );
485
		$this->maybe_sync_constants();
486
	}
487
488 View Code Duplication
	private function maybe_sync_constants() {
489
		$constants = $this->get_all_constants();
490
		if ( empty( $constants ) ) {
491
			return;
492
		}
493
		$constants_check_sum = $this->get_check_sum( $constants );
494
		if ( $constants_check_sum !== (int) get_option( self::$constants_checksum_option_name ) ) {
495
			do_action( 'jetpack_sync_current_constants', $constants );
496
			update_option( self::$constants_checksum_option_name, $constants_check_sum );
497
		}
498
	}
499
500
	private function get_all_constants() {
501
		return array_combine(
502
			$this->constants_whitelist,
503
			array_map( array( $this, 'get_constant' ), $this->constants_whitelist )
504
		);
505
	}
506
507
	private function get_constant( $constant ) {
508
		if ( defined( $constant ) ) {
509
			return constant( $constant );
510
		}
511
512
		return null;
513
	}
514
515
	public function force_sync_callables() {
516
		delete_option( self::$functions_checksum_option_name );
517
		$this->maybe_sync_callables();
518
	}
519
520 View Code Duplication
	private function maybe_sync_callables() {
521
		$callables = $this->get_all_callables();
522
		if ( empty( $callables ) ) {
523
			return;
524
		}
525
		$callables_check_sum = $this->get_check_sum( $callables );
526
		if ( $callables_check_sum !== (int) get_option( self::$functions_checksum_option_name ) ) {
527
			do_action( 'jetpack_sync_current_callables', $callables );
528
			update_option( self::$functions_checksum_option_name, $callables_check_sum );
529
		}
530
	}
531
532
	private function get_all_callables() {
533
		return array_combine(
534
			array_keys( $this->callable_whitelist ),
535
			array_map( array( $this, 'get_callable' ), array_values( $this->callable_whitelist ) )
536
		);
537
	}
538
539
	private function get_callable( $callable ) {
540
		return call_user_func( $callable );
541
	}
542
543
	private function get_check_sum( $values ) {
544
		return crc32( serialize( $values ) );
545
	}
546
547
	function jetpack_sync_core_icon() {
548
		if ( function_exists( 'get_site_icon_url' ) ) {
549
			$url = get_site_icon_url();
550
		} else {
551
			return;
552
		}
553
554
		require_once( JETPACK__PLUGIN_DIR . 'modules/site-icon/site-icon-functions.php' );
555
		// If there's a core icon, maybe update the option.  If not, fall back to Jetpack's.
556
		if ( ! empty( $url ) && $url !== jetpack_site_icon_url() ) {
557
			// This is the option that is synced with dotcom
558
			Jetpack_Options::update_option( 'site_icon_url', $url );
559
		} else if ( empty( $url ) && did_action( 'delete_option_site_icon' ) ) {
560
			Jetpack_Options::delete_option( 'site_icon_url' );
561
		}
562
	}
563
564
	function get_sync_queue() {
565
		return $this->sync_queue;
566
	}
567
568
	function reset_sync_queue() {
569
		$this->sync_queue->reset();
570
	}
571
572
	function set_defaults() {
573
		$this->sync_queue = new Jetpack_Sync_Queue( 'sync', self::$default_send_buffer_size );
574
		$this->set_full_sync_client( Jetpack_Sync_Full::getInstance() );
575
		$this->codec                     = new Jetpack_Sync_Deflate_Codec();
576
		$this->constants_whitelist       = self::$default_constants_whitelist;
577
		$this->options_whitelist         = self::$default_options_whitelist;
578
		$this->network_options_whitelist = self::$default_network_options_whitelist;
579
		$this->taxonomy_whitelist        = self::$default_taxonomy_whitelist;
580
		$this->is_multisite              = is_multisite();
581
582
		if ( $this->is_multisite ) {
583
			$this->callable_whitelist = array_merge( self::$default_callable_whitelist, self::$default_multisite_callable_whitelist );
584
		} else {
585
			$this->callable_whitelist = self::$default_callable_whitelist;
586
		}
587
	}
588
589
	function reset_data() {
590
		delete_option( self::$constants_checksum_option_name );
591
		$this->reset_sync_queue();
592
	}
593
}