PluginProbe
Jetpack – WP Security, Backup, Speed, & Growth / 7.2.4
Jetpack – WP Security, Backup, Speed, & Growth v7.2.4
12.0.3 12.1.3 12.2.3 12.3.2 12.4.2 12.5.2 12.6.4 12.7.3 12.8.3 12.9.5 13.0.2 13.1.5 13.2.4 13.3.3 13.4.5 13.5.2 13.6.2 13.7.2 13.8.3 13.9.2 14.0.1 14.1.1 14.2.2 14.3.1 14.4.2 All 500 releases
jetpack / sync / class.jetpack-sync-module-updates.php
class.jetpack-sync-module-updates.php
322 lines 9.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 class Jetpack_Sync_Module_Updates extends Jetpack_Sync_Module {
4
5 const UPDATES_CHECKSUM_OPTION_NAME = 'jetpack_updates_sync_checksum';
6
7 private $old_wp_version = null;
8 private $updates = array();
9
10 public function set_defaults() {
11 $this->updates = array();
12 }
13
14 function name() {
15 return 'updates';
16 }
17
18 public function init_listeners( $callable ) {
19 global $wp_version;
20 $this->old_wp_version = $wp_version;
21 add_action( 'set_site_transient_update_plugins', array( $this, 'validate_update_change' ), 10, 3 );
22 add_action( 'set_site_transient_update_themes', array( $this, 'validate_update_change' ), 10, 3 );
23 add_action( 'set_site_transient_update_core', array( $this, 'validate_update_change' ), 10, 3 );
24
25 add_action( 'jetpack_update_plugins_change', $callable );
26 add_action( 'jetpack_update_themes_change', $callable );
27 add_action( 'jetpack_update_core_change', $callable );
28
29 add_filter(
30 'jetpack_sync_before_enqueue_jetpack_update_plugins_change',
31 array(
32 $this,
33 'filter_update_keys',
34 ),
35 10,
36 2
37 );
38 add_filter(
39 'jetpack_sync_before_enqueue_upgrader_process_complete',
40 array(
41 $this,
42 'filter_upgrader_process_complete',
43 ),
44 10,
45 2
46 );
47
48 add_action( 'automatic_updates_complete', $callable );
49
50 if ( is_multisite() ) {
51 add_filter( 'pre_update_site_option_wpmu_upgrade_site', array( $this, 'update_core_network_event' ), 10, 2 );
52 add_action( 'jetpack_sync_core_update_network', $callable, 10, 3 );
53 }
54
55 // Send data when update completes
56 add_action( '_core_updated_successfully', array( $this, 'update_core' ) );
57 add_action( 'jetpack_sync_core_reinstalled_successfully', $callable );
58 add_action( 'jetpack_sync_core_autoupdated_successfully', $callable, 10, 2 );
59 add_action( 'jetpack_sync_core_updated_successfully', $callable, 10, 2 );
60
61 }
62
63 public function init_full_sync_listeners( $callable ) {
64 add_action( 'jetpack_full_sync_updates', $callable );
65 }
66
67 public function init_before_send() {
68 add_filter( 'jetpack_sync_before_send_jetpack_full_sync_updates', array( $this, 'expand_updates' ) );
69 add_filter( 'jetpack_sync_before_send_jetpack_update_themes_change', array( $this, 'expand_themes' ) );
70 }
71
72 public function update_core_network_event( $wp_db_version, $old_wp_db_version ) {
73 global $wp_version;
74 /**
75 * Sync event for when core wp network updates to a new db version
76 *
77 * @since 5.0.0
78 *
79 * @param int $wp_db_version the latest wp_db_version
80 * @param int $old_wp_db_version previous wp_db_version
81 * @param string $wp_version the latest wp_version
82 */
83 do_action( 'jetpack_sync_core_update_network', $wp_db_version, $old_wp_db_version, $wp_version );
84 return $wp_db_version;
85 }
86
87 public function update_core( $new_wp_version ) {
88 global $pagenow;
89
90 if ( isset( $_GET['action'] ) && 'do-core-reinstall' === $_GET['action'] ) {
91 /**
92 * Sync event that fires when core reinstall was successful
93 *
94 * @since 5.0.0
95 *
96 * @param string $new_wp_version the updated WordPress version
97 */
98 do_action( 'jetpack_sync_core_reinstalled_successfully', $new_wp_version );
99 return;
100 }
101
102 // Core was autoudpated
103 if (
104 'update-core.php' !== $pagenow &&
105 ! Jetpack_Constants::is_true( 'REST_API_REQUEST' ) // wp.com rest api calls should never be marked as a core autoupdate
106 ) {
107 /**
108 * Sync event that fires when core autoupdate was successful
109 *
110 * @since 5.0.0
111 *
112 * @param string $new_wp_version the updated WordPress version
113 * @param string $old_wp_version the previous WordPress version
114 */
115 do_action( 'jetpack_sync_core_autoupdated_successfully', $new_wp_version, $this->old_wp_version );
116 return;
117 }
118 /**
119 * Sync event that fires when core update was successful
120 *
121 * @since 5.0.0
122 *
123 * @param string $new_wp_version the updated WordPress version
124 * @param string $old_wp_version the previous WordPress version
125 */
126 do_action( 'jetpack_sync_core_updated_successfully', $new_wp_version, $this->old_wp_version );
127 return;
128
129 }
130
131 public function get_update_checksum( $update, $transient ) {
132 $updates = array();
133 $no_updated = array();
134 switch ( $transient ) {
135 case 'update_plugins':
136 if ( ! empty( $update->response ) && is_array( $update->response ) ) {
137 foreach ( $update->response as $plugin_slug => $response ) {
138 if ( ! empty( $plugin_slug ) && isset( $response->new_version ) ) {
139 $updates[] = array( $plugin_slug => $response->new_version );
140 }
141 }
142 }
143 if ( ! empty( $update->no_update ) ) {
144 $no_updated = array_keys( $update->no_update );
145 }
146
147 if ( ! isset( $no_updated['jetpack/jetpack.php'] ) && isset( $updates['jetpack/jetpack.php'] ) ) {
148 return false;
149 }
150
151 break;
152 case 'update_themes':
153 if ( ! empty( $update->response ) && is_array( $update->response ) ) {
154 foreach ( $update->response as $theme_slug => $response ) {
155 if ( ! empty( $theme_slug ) && isset( $response['new_version'] ) ) {
156 $updates[] = array( $theme_slug => $response['new_version'] );
157 }
158 }
159 }
160
161 if ( ! empty( $update->checked ) ) {
162 $no_updated = $update->checked;
163 }
164
165 break;
166 case 'update_core':
167 if ( ! empty( $update->updates ) && is_array( $update->updates ) ) {
168 foreach ( $update->updates as $response ) {
169 if ( ! empty( $response->response ) && $response->response === 'latest' ) {
170 continue;
171 }
172 if ( ! empty( $response->response ) && isset( $response->packages->full ) ) {
173 $updates[] = array( $response->response => $response->packages->full );
174 }
175 }
176 }
177
178 if ( ! empty( $update->version_checked ) ) {
179 $no_updated = $update->version_checked;
180 }
181
182 if ( empty( $updates ) ) {
183 return false;
184 }
185 break;
186
187 }
188 if ( empty( $updates ) && empty( $no_updated ) ) {
189 return false;
190 }
191 return $this->get_check_sum( array( $no_updated, $updates ) );
192 }
193
194 public function validate_update_change( $value, $expiration, $transient ) {
195 $new_checksum = $this->get_update_checksum( $value, $transient );
196
197 if ( false === $new_checksum ) {
198 return;
199 }
200
201 $checksums = get_option( self::UPDATES_CHECKSUM_OPTION_NAME, array() );
202
203 if ( isset( $checksums[ $transient ] ) && $checksums[ $transient ] === $new_checksum ) {
204 return;
205 }
206
207 $checksums[ $transient ] = $new_checksum;
208
209 update_option( self::UPDATES_CHECKSUM_OPTION_NAME, $checksums );
210 if ( 'update_core' === $transient ) {
211 /**
212 * jetpack_update_core_change
213 *
214 * @since 5.1.0
215 *
216 * @param array containing info that tells us what needs updating
217 */
218 do_action( 'jetpack_update_core_change', $value );
219 return;
220 }
221 if ( empty( $this->updates ) ) {
222 // lets add the shutdown method once and only when the updates move from empty to filled with something
223 add_action( 'shutdown', array( $this, 'sync_last_event' ), 9 );
224 }
225 if ( ! isset( $this->updates[ $transient ] ) ) {
226 $this->updates[ $transient ] = array();
227 }
228 $this->updates[ $transient ][] = $value;
229 }
230
231 public function sync_last_event() {
232 foreach ( $this->updates as $transient => $values ) {
233 $value = end( $values ); // only send over the last value
234 /**
235 * jetpack_{$transient}_change
236 * jetpack_update_plugins_change
237 * jetpack_update_themes_change
238 *
239 * @since 5.1.0
240 *
241 * @param array containing info that tells us what needs updating
242 */
243 do_action( "jetpack_{$transient}_change", $value );
244 }
245
246 }
247
248 public function enqueue_full_sync_actions( $config, $max_items_to_enqueue, $state ) {
249 /**
250 * Tells the client to sync all updates to the server
251 *
252 * @since 4.2.0
253 *
254 * @param boolean Whether to expand updates (should always be true)
255 */
256 do_action( 'jetpack_full_sync_updates', true );
257
258 // The number of actions enqueued, and next module state (true == done)
259 return array( 1, true );
260 }
261
262 public function estimate_full_sync_actions( $config ) {
263 return 1;
264 }
265
266 function get_full_sync_actions() {
267 return array( 'jetpack_full_sync_updates' );
268 }
269
270 public function get_all_updates() {
271 return array(
272 'core' => get_site_transient( 'update_core' ),
273 'plugins' => get_site_transient( 'update_plugins' ),
274 'themes' => get_site_transient( 'update_themes' ),
275 );
276 }
277
278 // removes unnecessary keys from synced updates data
279 function filter_update_keys( $args ) {
280 $updates = $args[0];
281
282 if ( isset( $updates->no_update ) ) {
283 unset( $updates->no_update );
284 }
285
286 return $args;
287 }
288
289 function filter_upgrader_process_complete( $args ) {
290 array_shift( $args );
291
292 return $args;
293 }
294
295 public function expand_updates( $args ) {
296 if ( $args[0] ) {
297 return $this->get_all_updates();
298 }
299
300 return $args;
301 }
302
303 public function expand_themes( $args ) {
304 if ( ! isset( $args[0], $args[0]->response ) ) {
305 return $args;
306 }
307 if ( ! is_array( $args[0]->response ) ) {
308 trigger_error( 'Warning: Not an Array as expected but -> ' . wp_json_encode( $args[0]->response ) . ' instead', E_USER_WARNING );
309 return $args;
310 }
311 foreach ( $args[0]->response as $stylesheet => &$theme_data ) {
312 $theme = wp_get_theme( $stylesheet );
313 $theme_data['name'] = $theme->name;
314 }
315 return $args;
316 }
317
318 public function reset_data() {
319 delete_option( self::UPDATES_CHECKSUM_OPTION_NAME );
320 }
321 }
322