Completed
Push — add/sync-rest-2 ( a7dbc1...6b7ec7 )
by
unknown
08:39
created

Jetpack_Sync::actions_to_sync()   D

Complexity

Conditions 10
Paths 14

Size

Total Lines 31
Code Lines 24

Duplication

Lines 0
Ratio 0 %

Importance

Changes 4
Bugs 0 Features 0
Metric Value
c 4
b 0
f 0
dl 0
loc 31
rs 4.8196
cc 10
eloc 24
nc 14
nop 0

How to fix   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
require_once 'class.jetpack-sync-posts.php';
4
require_once 'class.jetpack-sync-meta.php';
5
require_once 'class.jetpack-sync-comments.php';
6
require_once 'class.jetpack-sync-options.php';
7
require_once 'class.jetpack-sync-network-options.php';
8
require_once 'class.jetpack-sync-functions.php';
9
require_once 'class.jetpack-sync-constants.php';
10
require_once 'class.jetpack-sync-users.php';
11
require_once 'class.jetpack-sync-updates.php';
12
require_once 'class.jetpack-sync-reindex.php';
13
require_once 'class.jetpack-sync-themes.php';
14
if ( is_multisite() ) {
15
	require_once 'class.jetpack-sync-network-options.php';
16
}
17
18
class Jetpack_Sync {
19
	static $do_shutdown = false;
0 ignored issues
show
Coding Style introduced by
The visibility should be declared for property $do_shutdown.

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...
20
21
	static $cron_name = 'jetpack_sync_next_beat';
0 ignored issues
show
Coding Style introduced by
The visibility should be declared for property $cron_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...
22
23
	static $actions = array();
0 ignored issues
show
Coding Style introduced by
The visibility should be declared for property $actions.

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...
24
25
	static function init() {
26
		Jetpack_Sync_Posts::init();
27
		Jetpack_Sync_Meta::init();
28
		Jetpack_Sync_Comments::init();
29
		Jetpack_Sync_Options::init();
30
		Jetpack_Sync_Users::init();
31
		Jetpack_Sync_Network_Options::init();
32
		Jetpack_Sync_Updates::init();
33
		Jetpack_Sync_Reindex::init();
34
35
		// On jetpack version bump
36
		add_action( 'updating_jetpack_version', array( __CLASS__, 'schedule_full_sync' ) );
37
		// On jetpack registration
38
		add_action( 'jetpack_site_registered', array( __CLASS__, 'schedule_full_sync' ) );
39
		// Add on cron
40
		add_action( self::$cron_name, array( __CLASS__, 'cron_exec' ) );
41
	}
42
43
	static function schedule_sync() {
44
		if ( ! self::$do_shutdown ) {
45
			self::$do_shutdown = true;
46
			if ( function_exists( 'ignore_user_abort' ) ) {
47
				ignore_user_abort( true );
48
			}
49
			add_action( 'shutdown', array( __CLASS__, 'sync_partial_on_shutdown' ), 9 );
50
		}
51
	}
52
53
	static function cron_exec() {
54
		Jetpack::xmlrpc_async_call( 'jetpack.sync2', self::get_data_to_sync() );
55
	}
56
57
	static function schedule_next_cron() {
58
		if ( ! wp_next_scheduled( self::$cron_name ) ) {
59
			$next_minute = time() + 60;
60
			wp_schedule_single_event( $next_minute, self::$cron_name );
61
		}
62
	}
63
64
	static function remove_cron() {
65
		$timestamp = wp_next_scheduled( self::$cron_name );
66
		wp_unschedule_event( $timestamp, self::$cron_name );
67
	}
68
69
	static function slice_ids( $ids, $max, $option_name ) {
70
		$lock_name    = $option_name . '_lock';
71
		$is_locked    = get_option( $lock_name );
72
		$post_ids_que = get_option( $option_name );
73
74
		if ( ! empty( $post_ids_que ) ) {
75
			$ids = array_unique( array_merge( $ids, $post_ids_que ) );
76
		}
77
		$pid = getmypid();
78
		if ( ! $is_locked || $pid === $is_locked ) {
79
			update_option( $lock_name, $pid );
80
81
			if ( sizeof( $ids ) <= $max ) {
82
				delete_option( $option_name );
83
				delete_option( $lock_name );
84
85
				return $ids;
86
			}
87
			$to_save = array_splice( $ids, $max );
88
			update_option( $option_name, $to_save );
89
			delete_option( $lock_name );
90
91
			Jetpack_Sync::schedule_next_cron();
92
		} else {
0 ignored issues
show
Unused Code introduced by
This else statement is empty and can be removed.

This check looks for the else branches of if statements that have no statements or where all statements have been commented out. This may be the result of changes for debugging or the code may simply be obsolete.

These else branches can be removed.

if (rand(1, 6) > 3) {
print "Check failed";
} else {
    //print "Check succeeded";
}

could be turned into

if (rand(1, 6) > 3) {
    print "Check failed";
}

This is much more concise to read.

Loading history...
93
94
		}
95
96
		return $ids;
97
	}
98
99
	static function schedule_full_sync() {
100
		add_action( 'shutdown', array( __CLASS__, 'sync_full_on_shutdown' ), 9 );
101
	}
102
103
	static function sync_partial_on_shutdown() {
104
		if ( ! self::should_sync() ) {
105
			return;
106
		}
107
		$to_sync = self::get_data_to_sync();
108
		Jetpack::xmlrpc_async_call( 'jetpack.sync2', $to_sync );
109
	}
110
111
	static function sync_full_on_shutdown() {
112
		if ( ! self::should_sync() ) {
113
			return;
114
		}
115
		Jetpack::xmlrpc_async_call( 'jetpack.sync2', self::get_all_data_() );
0 ignored issues
show
Bug introduced by
The method get_all_data_() does not exist on Jetpack_Sync. Did you maybe mean get_all_data()?

This check marks calls to methods that do not seem to exist on an object.

This is most likely the result of a method being renamed without all references to it being renamed likewise.

Loading history...
116
	}
117
118
	static function should_sync() {
119
		if ( defined( 'WP_IMPORTING' ) && WP_IMPORTING ) {
120
			return false;
121
		}
122
		if ( Jetpack::is_development_mode() || Jetpack::is_staging_site() ) {
123
			return false;
124
		}
125
126
		return true;
127
	}
128
129
	static function sync_action() {
130
		self::$actions[ current_action() ][] = func_get_args();
131
		Jetpack_Sync::schedule_sync();
132
	}
133
134
	static function actions_to_sync() {
135
		$actions = array();
136
		foreach ( self::$actions as $action => $calls ) {
137
			foreach ( $calls as $args ) {
138
				switch ( $action ) {
139
					case 'save_post' :
140
						$args = array( $args[0], Jetpack_Sync_Posts::get_post( $args[0] ), $args[2] );
141
						break;
142
					case 'transition_post_status' :
143
						list( $new_status, $old_status, $post ) = $args;
144
						if ( $new_status === $old_status ) {
145
							$args = null;
146
							break;
147
						}
148
						$args = array( $args[0], $args[1], Jetpack_Sync_Posts::get_post( $post->ID ) );
149
						break;
150
					case 'set_object_terms' :
151
						list( $object_id, $terms, $tt_ids, $taxonomy, $append, $old_tt_ids ) = $args;
0 ignored issues
show
Unused Code introduced by
The assignment to $object_id is unused. Consider omitting it like so list($first,,$third).

This checks looks for assignemnts to variables using the list(...) function, where not all assigned variables are subsequently used.

Consider the following code example.

<?php

function returnThreeValues() {
    return array('a', 'b', 'c');
}

list($a, $b, $c) = returnThreeValues();

print $a . " - " . $c;

Only the variables $a and $c are used. There was no need to assign $b.

Instead, the list call could have been.

list($a,, $c) = returnThreeValues();
Loading history...
Unused Code introduced by
The assignment to $terms is unused. Consider omitting it like so list($first,,$third).

This checks looks for assignemnts to variables using the list(...) function, where not all assigned variables are subsequently used.

Consider the following code example.

<?php

function returnThreeValues() {
    return array('a', 'b', 'c');
}

list($a, $b, $c) = returnThreeValues();

print $a . " - " . $c;

Only the variables $a and $c are used. There was no need to assign $b.

Instead, the list call could have been.

list($a,, $c) = returnThreeValues();
Loading history...
Unused Code introduced by
The assignment to $taxonomy is unused. Consider omitting it like so list($first,,$third).

This checks looks for assignemnts to variables using the list(...) function, where not all assigned variables are subsequently used.

Consider the following code example.

<?php

function returnThreeValues() {
    return array('a', 'b', 'c');
}

list($a, $b, $c) = returnThreeValues();

print $a . " - " . $c;

Only the variables $a and $c are used. There was no need to assign $b.

Instead, the list call could have been.

list($a,, $c) = returnThreeValues();
Loading history...
Unused Code introduced by
The assignment to $append is unused. Consider omitting it like so list($first,,$third).

This checks looks for assignemnts to variables using the list(...) function, where not all assigned variables are subsequently used.

Consider the following code example.

<?php

function returnThreeValues() {
    return array('a', 'b', 'c');
}

list($a, $b, $c) = returnThreeValues();

print $a . " - " . $c;

Only the variables $a and $c are used. There was no need to assign $b.

Instead, the list call could have been.

list($a,, $c) = returnThreeValues();
Loading history...
152
						if ( empty( array_diff( $tt_ids, $old_tt_ids ) ) && empty( array_diff( $old_tt_ids, $tt_ids ) ) ) {
153
							$args = null;
154
							break;
155
						}
156
						break;
157
				}
158
				if ( is_null( $args ) ) {
159
					$actions[ $action ][] = $args;
160
				}
161
			}
162
		}
163
		return $actions;
164
	}
165
166
	static function get_data_to_sync() {
167
		$send['options']        = Jetpack_Sync_Options::get_to_sync();
0 ignored issues
show
Coding Style Comprehensibility introduced by
$send was never initialized. Although not strictly required by PHP, it is generally a good practice to add $send = array(); before regardless.

Adding an explicit array definition is generally preferable to implicit array definition as it guarantees a stable state of the code.

Let’s take a look at an example:

foreach ($collection as $item) {
    $myArray['foo'] = $item->getFoo();

    if ($item->hasBar()) {
        $myArray['bar'] = $item->getBar();
    }

    // do something with $myArray
}

As you can see in this example, the array $myArray is initialized the first time when the foreach loop is entered. You can also see that the value of the bar key is only written conditionally; thus, its value might result from a previous iteration.

This might or might not be intended. To make your intention clear, your code more readible and to avoid accidental bugs, we recommend to add an explicit initialization $myArray = array() either outside or inside the foreach loop.

Loading history...
168
		$send['options_delete'] = Jetpack_Sync_Options::get_to_delete();
169
		$send['constants']      = self::sync_if_has_changed( Jetpack_Sync_Constants::$check_sum_id, Jetpack_Sync_Constants::get_all() );
0 ignored issues
show
Bug introduced by
The property check_sum_id cannot be accessed from this context as it is declared private in class Jetpack_Sync_Constants.

This check looks for access to properties that are not accessible from the current context.

If you need to make a property accessible to another context you can either raise its visibility level or provide an accessible getter in the defining class.

Loading history...
170
171
		$send['actions'] = self::actions_to_sync();
172
173
		$send['post_meta']        = Jetpack_Sync_Meta::meta_to_sync( 'post' );
174
		$send['post_meta_delete'] = Jetpack_Sync_Meta::meta_to_delete( 'post' );
175
176
		$send['comments']            = Jetpack_Sync_Comments::comments_to_sync();
177
		$send['delete_comments']     = Jetpack_Sync_Comments::comments_to_delete();
178
		$send['comment_meta']        = Jetpack_Sync_Meta::meta_to_sync( 'comment' );
179
		$send['comment_meta_delete'] = Jetpack_Sync_Meta::meta_to_delete( 'comment' );
180
181
		$send['updates'] = Jetpack_Sync_Updates::get_to_sync();
182
		$send['themes']  = Jetpack_Sync_Themes::get_to_sync();
183
184
		if ( false === ( $do_check = get_transient( 'jetpack_sync_functions' ) ) ) {
185
			$send['functions'] = self::sync_if_has_changed( Jetpack_Sync_Functions::$check_sum_id, Jetpack_Sync_Functions::get_all() );
0 ignored issues
show
Bug introduced by
The property check_sum_id cannot be accessed from this context as it is declared private in class Jetpack_Sync_Functions.

This check looks for access to properties that are not accessible from the current context.

If you need to make a property accessible to another context you can either raise its visibility level or provide an accessible getter in the defining class.

Loading history...
186
			set_transient( 'jetpack_sync_functions', true, MINUTE_IN_SECONDS );
187
		}
188
		if ( is_multisite() ) {
189
			$send['network_options']        = Jetpack_Sync_Network_Options::get_to_sync();
190
			$send['network_options_delete'] = Jetpack_Sync_Network_Options::get_to_delete();
191
		}
192
193
		return array_filter( $send );
194
	}
195
196
197
	static function array_diff_assoc_recursive( $array1, $array2 ) {
198
		$difference = array();
199
		foreach ( $array1 as $key => $value ) {
200
			if ( is_array( $value ) ) {
201
				if ( ! isset( $array2[ $key ] ) || ! is_array( $array2[ $key ] ) ) {
202
					$difference[ $key ] = $value;
203
				} else {
204
					$new_diff = array_diff_assoc_recursive( $value, $array2[ $key ] );
205
					if ( ! empty( $new_diff ) ) {
206
						$difference[ $key ] = $new_diff;
207
					}
208
				}
209
			} else if ( ! array_key_exists( $key, $array2 ) || $array2[ $key ] !== $value ) {
210
				$difference[ $key ] = $value;
211
			}
212
		}
213
		return $difference;
214
	}
215
216
	static function get_all_data() {
217
		$send['options']   = Jetpack_Sync_Options::get_all();
0 ignored issues
show
Coding Style Comprehensibility introduced by
$send was never initialized. Although not strictly required by PHP, it is generally a good practice to add $send = array(); before regardless.

Adding an explicit array definition is generally preferable to implicit array definition as it guarantees a stable state of the code.

Let’s take a look at an example:

foreach ($collection as $item) {
    $myArray['foo'] = $item->getFoo();

    if ($item->hasBar()) {
        $myArray['bar'] = $item->getBar();
    }

    // do something with $myArray
}

As you can see in this example, the array $myArray is initialized the first time when the foreach loop is entered. You can also see that the value of the bar key is only written conditionally; thus, its value might result from a previous iteration.

This might or might not be intended. To make your intention clear, your code more readible and to avoid accidental bugs, we recommend to add an explicit initialization $myArray = array() either outside or inside the foreach loop.

Loading history...
218
		$send['constants'] = Jetpack_Sync_Constants::get_all();
219
		$send['functions'] = Jetpack_Sync_Functions::get_all();
220
		$send['updates']   = Jetpack_Sync_Updates::get_all();
221
		$send['themes']    = Jetpack_Sync_Themes::get_all();
222
		if ( is_multisite() ) {
223
			$send['network_options'] = Jetpack_Sync_Network_Options::get_all();
224
		}
225
226
		return $send;
227
	}
228
229
	static function sync_if_has_changed( $check_sum_id, $values ) {
230
		$current_check_sum = self::get_check_sum( $values );
231
		if ( Jetpack_Options::get_option( $check_sum_id ) !== $current_check_sum ) {
232
			Jetpack_Options::update_option( $check_sum_id, $current_check_sum );
233
234
			return $values;
235
		}
236
237
		return null;
238
	}
239
240
	static function get_check_sum( $values ) {
241
		return crc32( json_encode( $values ) );
242
	}
243
244
}
245
246
Jetpack_Sync::init();
247