PluginProbe
MainWP Dashboard: Self-hosted WordPress Management for Agencies / 5.0
MainWP Dashboard: Self-hosted WordPress Management for Agencies v5.0
6.2 6.1.8 6.1.7 6.1.6 6.1.5 6.1.4 6.1.3 6.1.2 6.1.1 6.1 6.0.12 6.0.11 4.6.0.1 5.0 5.0.1 5.0.2 5.0.3 5.0.3.1 5.0.3.2 5.1 5.1.1 5.2 5.2.1 5.2.2 5.3 All 153 releases
mainwp / class / class-mainwp-sync.php

class-mainwp-sync.php in MainWP Dashboard: Self-hosted WordPress Management for Agencies 5.0, at class/class-mainwp-sync.php

672 lines 24.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * MainWP Sync Handler
4 *
5 * Handle all syncing between MainWP & Child Site Network.
6 *
7 * @package MainWP/Dashboard
8 */
9
10 namespace MainWP\Dashboard;
11
12 /**
13 * Class MainWP_Sync
14 *
15 * @package MainWP\Dashboard
16 */
17 class MainWP_Sync {
18
19
20 /**
21 * Method sync_website()
22 *
23 * Sync Child Site.
24 *
25 * @param object $website object.
26 * @param bool $clear_session to run the ending session or not.
27 *
28 * @return bool sync result.
29 */
30 public static function sync_website( $website, $clear_session = true ) {
31 if ( ! is_object( $website ) ) {
32 return false;
33 }
34 MainWP_DB::instance()->update_website_sync_values( $website->id, array( 'dtsSyncStart' => time() ) );
35 return self::sync_site( $website, false, true, $clear_session );
36 }
37
38 /**
39 * Method sync_site()
40 *
41 * @param mixed $pWebsite Null|userid.
42 * @param bool $pForceFetch Check if a fourced Sync.
43 * @param bool $pAllowDisconnect Check if allowed to disconect.
44 * @param bool $clear_session to run the ending session or not.
45 *
46 * @return bool sync_information_array
47 *
48 * @uses \MainWP\Dashboard\MainWP_DB_Common::get_user_extension_by_user_id()
49 * @uses \MainWP\Dashboard\MainWP_DB::query()
50 * @uses \MainWP\Dashboard\MainWP_DB::update_website_option()
51 * @uses \MainWP\Dashboard\MainWP_DB::fetch_object()
52 * @uses \MainWP\Dashboard\MainWP_DB::free_result()
53 * @uses \MainWP\Dashboard\MainWP_Exception
54 * @uses \MainWP\Dashboard\MainWP_System_Utility::get_primary_backup()
55 * @uses \MainWP\Dashboard\MainWP_Utility::end_session()
56 */
57 public static function sync_site( &$pWebsite = null, $pForceFetch = false, $pAllowDisconnect = true, $clear_session = true ) { // phpcs:ignore -- complexity method.
58
59 // to support demo data.
60 if ( MainWP_Demo_Handle::get_instance()->is_demo_website( $pWebsite ) ) {
61 return MainWP_Demo_Handle::get_instance()->handle_action_demo( $pWebsite, 'sync_site' );
62 }
63
64 if ( null === $pWebsite ) {
65 return false;
66 }
67 $userExtension = MainWP_DB_Common::instance()->get_user_extension_by_user_id( $pWebsite->userid );
68 if ( null === $userExtension ) {
69 return false;
70 }
71
72 if ( $clear_session ) {
73 MainWP_Utility::end_session();
74 }
75
76 try {
77
78 /**
79 * Filter: mainwp_clone_enabled
80 *
81 * Filters whether the Clone feature is enabled or disabled.
82 *
83 * @since Unknown
84 */
85 $cloneEnabled = apply_filters( 'mainwp_clone_enabled', false );
86 $cloneSites = array();
87
88 $disallowed_current_site = false;
89
90 if ( $cloneEnabled ) {
91 $disallowedCloneSites = get_option( 'mainwp_clone_disallowedsites' );
92 if ( false === $disallowedCloneSites ) {
93 $disallowedCloneSites = array();
94 }
95 $websites = MainWP_DB::instance()->query( MainWP_DB::instance()->get_sql_websites_for_current_user() );
96 if ( $websites ) {
97 while ( $websites && ( $website = MainWP_DB::fetch_object( $websites ) ) ) {
98 if ( in_array( $website->id, $disallowedCloneSites ) ) {
99 continue;
100 }
101 if ( (int) $website->id === (int) $pWebsite->id ) {
102 continue;
103 }
104
105 $cloneSites[ $website->id ] = array(
106 'name' => $website->name,
107 'url' => $website->url,
108 'extauth' => $website->extauth,
109 'size' => $website->totalsize,
110 'connect_admin' => $website->adminname,
111 );
112 }
113 MainWP_DB::free_result( $websites );
114 }
115 $disallowed_current_site = in_array( $pWebsite->id, $disallowedCloneSites ) ? true : false;
116 }
117
118 $primaryBackup = MainWP_System_Utility::get_primary_backup();
119
120 $othersData = apply_filters_deprecated( 'mainwp-sync-others-data', array( array(), $pWebsite ), '4.0.7.2', 'mainwp_sync_others_data' ); // @deprecated Use 'mainwp_sync_others_data' instead.
121
122 /**
123 * Filter: mainwp_sync_others_data
124 *
125 * Filters additional data in the sync request. Allows extensions or 3rd party plugins to hook data to the sync request.
126 *
127 * @param object $pWebsite Object contaning child site data.
128 *
129 * @since Unknown
130 *
131 * @uses \MainWP\Dashboard\MainWP_Connect::fetch_url_authed()
132 */
133 $othersData = apply_filters( 'mainwp_sync_others_data', $othersData, $pWebsite );
134
135 $saved_days_number = apply_filters( 'mainwp_site_actions_saved_days_number', 30 );
136
137 $postdata = array(
138 'optimize' => 1 === (int) get_option( 'mainwp_optimize', 1 ) ? 1 : 0,
139 'cloneSites' => ( ! $cloneEnabled || $disallowed_current_site ? 0 : rawurlencode( wp_json_encode( $cloneSites ) ) ),
140 'othersData' => wp_json_encode( $othersData ),
141 'server' => get_admin_url(),
142 'numberdaysOutdatePluginTheme' => get_option( 'mainwp_numberdays_Outdate_Plugin_Theme', 365 ),
143 'primaryBackup' => $primaryBackup,
144 'siteId' => $pWebsite->id,
145 'child_actions_saved_days_number' => intval( $saved_days_number ),
146 'pingnonce' => MainWP_Utility::instance()->create_site_nonce( 'pingnonce', $pWebsite->id ),
147 );
148
149 $information = MainWP_Connect::fetch_url_authed(
150 $pWebsite,
151 'stats',
152 $postdata,
153 true,
154 $pForceFetch
155 );
156 $return = self::sync_information_array( $pWebsite, $information, '', 1, false, $pAllowDisconnect );
157 MainWP_Logger::instance()->log_execution_time( 'sync :: [siteid=' . $pWebsite->id . ']' );
158 return $return;
159 } catch ( MainWP_Exception $e ) {
160 $sync_errors = '';
161 $check_result = 1;
162
163 if ( $e->getMessage() === 'HTTPERROR' ) {
164 $sync_errors = esc_html__( 'HTTP error', 'mainwp' ) . ( ! empty( $e->get_message_extra() ) ? ' - ' . $e->get_message_extra() : '' );
165 $check_result = - 1;
166 } elseif ( $e->getMessage() === 'NOMAINWP' ) {
167 $sync_errors = sprintf( esc_html__( 'MainWP Child plugin not detected or could not be reached! Ensure the MainWP Child plugin is installed and activated on the child site, and there are no security rules blocking requests. If you continue experiencing this issue, check the %1$sMainWP Community%2$s for help.', 'mainwp' ), '<a href="https://managers.mainwp.com/c/community-support/5" target="_blank">', '</a> <i class="external alternate icon"></i>' );
168 $check_result = 1;
169 }
170
171 MainWP_Logger::instance()->log_execution_time( 'sync :: [siteid=' . $pWebsite->id . ']' );
172 return self::sync_information_array( $pWebsite, $information, $sync_errors, $check_result, true, $pAllowDisconnect );
173 }
174 }
175
176 /**
177 * Method sync_information_array()
178 *
179 * Grab all Child Site Information.
180 *
181 * @param object $pWebsite The website object.
182 * @param array $information Array contaning information returned from child site.
183 * @param string $sync_errors Check for Sync Errors.
184 * @param int $check_result Check if offline.
185 * @param bool $error True|False.
186 * @param bool $pAllowDisconnect True|False.
187 *
188 * @return bool true|false True on success, false on failure.
189 *
190 * @uses \MainWP\Dashboard\MainWP_DB::update_website_option()
191 * @uses \MainWP\Dashboard\MainWP_DB::update_website_sync_values()
192 * @uses \MainWP\Dashboard\MainWP_DB::update_website_values()
193 * @uses \MainWP\Dashboard\MainWP_Logger::warning_for_website()
194 * @uses \MainWP\Dashboard\MainWP_Monitoring_Handler::get_health_noticed_status_value()
195 * @uses \MainWP\Dashboard\MainWP_Utility::ctype_digit()
196 * @uses \MainWP\Dashboard\MainWP_Utility::get_site_health()
197 */
198 public static function sync_information_array( &$pWebsite, &$information, $sync_errors = '', $check_result = 1, $error = false, $pAllowDisconnect = true ) { // phpcs:ignore -- Current complexity is the only way to achieve desired results, pull request solutions appreciated.
199 $emptyArray = wp_json_encode( array() );
200 $websiteValues = array(
201 'directories' => $emptyArray,
202 'plugin_upgrades' => $emptyArray,
203 'theme_upgrades' => $emptyArray,
204 'translation_upgrades' => $emptyArray,
205 'securityIssues' => $emptyArray,
206 'themes' => $emptyArray,
207 'plugins' => $emptyArray,
208 'users' => $emptyArray,
209 'categories' => $emptyArray,
210 'offline_check_result' => $check_result,
211 );
212 $websiteSyncValues = array(
213 'sync_errors' => $sync_errors,
214 'version' => 0,
215 );
216
217 $_error = $sync_errors;
218
219 $done = false;
220
221 $current_siteid = 0;
222 if ( is_string( $pWebsite ) || is_int( $pWebsite ) ) {
223 $current_siteid = intval( $pWebsite );
224 } elseif ( is_object( $pWebsite ) && ( ! property_exists( $pWebsite, 'plugin_updates' ) || ! property_exists( $pWebsite, 'theme_updates' ) ) ) {
225 $current_siteid = $pWebsite->id;
226 }
227
228 // to get full data.
229 if ( $current_siteid ) {
230 $pWebsite = MainWP_DB::instance()->get_website_by_id( $current_siteid );
231 }
232
233 /**
234 * Filter: mainwp_before_save_sync_result
235 *
236 * Filters data returned from child site before saving to the database.
237 *
238 * @param object $pWebsite Object containing child site data.
239 *
240 * @since 3.4
241 */
242 $information = apply_filters( 'mainwp_before_save_sync_result', $information, $pWebsite );
243
244 if ( isset( $information['siteurl'] ) ) {
245 $websiteValues['siteurl'] = $information['siteurl'];
246 $done = true;
247 }
248
249 if ( isset( $information['version'] ) ) {
250 $websiteSyncValues['version'] = $information['version'];
251 $done = true;
252 }
253
254 $phpversion = '';
255 if ( isset( $information['site_info'] ) && ! empty( $information['site_info'] ) ) {
256 if ( is_array( $information['site_info'] ) && isset( $information['site_info']['phpversion'] ) ) {
257 $phpversion = $information['site_info']['phpversion'];
258 }
259 if ( is_array( $information['site_info'] ) && isset( $information['site_info']['ip'] ) ) {
260 $websiteValues['ip'] = sanitize_text_field( wp_unslash( $information['site_info']['ip'] ) );
261 }
262 MainWP_DB::instance()->update_website_option( $pWebsite, 'site_info', wp_json_encode( $information['site_info'] ) );
263 $done = true;
264 } else {
265 MainWP_DB::instance()->update_website_option( $pWebsite, 'site_info', $emptyArray );
266 }
267 if ( ! empty( $phpversion ) ) {
268 MainWP_DB::instance()->update_website_option( $pWebsite, 'phpversion', $phpversion );
269 }
270 if ( isset( $information['directories'] ) && is_array( $information['directories'] ) ) {
271 $websiteValues['directories'] = wp_json_encode( $information['directories'] );
272 $done = true;
273 } elseif ( isset( $information['directories'] ) ) {
274 $websiteValues['directories'] = $information['directories'];
275 $done = true;
276 }
277
278 if ( isset( $information['wp_updates'] ) && ! empty( $information['wp_updates'] ) ) {
279 MainWP_DB::instance()->update_website_option(
280 $pWebsite,
281 'wp_upgrades',
282 wp_json_encode(
283 array(
284 'current' => $information['wpversion'],
285 'new' => $information['wp_updates'],
286 )
287 )
288 );
289 $done = true;
290 } else {
291 MainWP_DB::instance()->update_website_option( $pWebsite, 'wp_upgrades', $emptyArray );
292 }
293
294 if ( isset( $information['plugin_updates'] ) ) {
295 $update_values = array();
296 if ( is_array( $information['plugin_updates'] ) ) {
297 foreach ( $information['plugin_updates'] as $file => $update ) {
298 $update_values[ $file ] = $update;
299 }
300 }
301 $websiteValues['plugin_upgrades'] = wp_json_encode( $update_values );
302 $done = true;
303 }
304
305 if ( isset( $information['theme_updates'] ) ) {
306 $update_values = array();
307 if ( is_array( $information['theme_updates'] ) ) {
308 foreach ( $information['theme_updates'] as $file => $update ) {
309 $update_values[ $file ] = $update;
310 }
311 }
312 $websiteValues['theme_upgrades'] = wp_json_encode( $update_values );
313 $done = true;
314 }
315
316 if ( isset( $information['translation_updates'] ) ) {
317 $websiteValues['translation_upgrades'] = wp_json_encode( $information['translation_updates'] );
318 $done = true;
319 }
320
321 if ( isset( $information['premium_updates'] ) ) {
322 MainWP_DB::instance()->update_website_option( $pWebsite, 'premium_upgrades', wp_json_encode( $information['premium_updates'] ) );
323 $done = true;
324 } else {
325 MainWP_DB::instance()->update_website_option( $pWebsite, 'premium_upgrades', $emptyArray );
326 }
327
328 if ( isset( $information['securityStats'] ) ) {
329 $total_securityIssues = 0;
330 $securityStats = $information['securityStats'];
331 if ( is_array( $securityStats ) ) {
332 /** This filter is documented in ../pages/page-mainwp-security-issues.php */
333 $filterStats = apply_filters( 'mainwp_security_issues_stats', false, $securityStats, $pWebsite );
334 if ( false !== $filterStats && is_array( $filterStats ) ) {
335 $securityStats = array_merge( $securityStats, $filterStats );
336 }
337
338 $unset_scripts = apply_filters( 'mainwp_unset_security_scripts_stylesheets', true );
339 if ( $unset_scripts ) {
340 if ( isset( $securityStats['versions'] ) ) {
341 unset( $securityStats['versions'] );
342 }
343 if ( isset( $securityStats['registered_versions'] ) ) {
344 unset( $securityStats['registered_versions'] );
345 }
346 }
347
348 $tmp_issues = array_filter(
349 $securityStats,
350 function ( $v ) {
351 return 'N' === $v;
352 },
353 ARRAY_FILTER_USE_BOTH
354 );
355 $total_securityIssues = count( $tmp_issues );
356 $securityStats = wp_json_encode( $securityStats );
357 } else {
358 $securityStats = $emptyArray;
359 }
360 $websiteValues['securityIssues'] = $total_securityIssues;
361 MainWP_DB::instance()->update_website_option( $pWebsite, 'security_stats', $securityStats );
362 $done = true;
363 } elseif ( isset( $information['securityIssues'] ) && MainWP_Utility::ctype_digit( $information['securityIssues'] ) && $information['securityIssues'] >= 0 ) {
364 $websiteValues['securityIssues'] = $information['securityIssues'];
365 $done = true;
366 }
367
368 if ( isset( $information['recent_comments'] ) ) {
369 MainWP_DB::instance()->update_website_option( $pWebsite, 'recent_comments', wp_json_encode( $information['recent_comments'] ) );
370 $done = true;
371 } else {
372 MainWP_DB::instance()->update_website_option( $pWebsite, 'recent_comments', $emptyArray );
373 }
374
375 if ( isset( $information['recent_posts'] ) ) {
376 MainWP_DB::instance()->update_website_option( $pWebsite, 'recent_posts', wp_json_encode( $information['recent_posts'] ) );
377 $done = true;
378 } else {
379 MainWP_DB::instance()->update_website_option( $pWebsite, 'recent_posts', $emptyArray );
380 }
381
382 if ( isset( $information['recent_pages'] ) ) {
383 MainWP_DB::instance()->update_website_option( $pWebsite, 'recent_pages', wp_json_encode( $information['recent_pages'] ) );
384 $done = true;
385 } else {
386 MainWP_DB::instance()->update_website_option( $pWebsite, 'recent_pages', $emptyArray );
387 }
388
389 if ( isset( $information['themes'] ) ) {
390 $websiteValues['themes'] = wp_json_encode( $information['themes'] );
391 $done = true;
392 }
393
394 if ( isset( $information['plugins'] ) ) {
395 $websiteValues['plugins'] = wp_json_encode( $information['plugins'] );
396 $done = true;
397 }
398
399 if ( isset( $information['users'] ) ) {
400 $websiteValues['users'] = wp_json_encode( $information['users'] );
401 $done = true;
402 }
403
404 if ( isset( $information['categories'] ) ) {
405 $websiteValues['categories'] = wp_json_encode( $information['categories'] );
406 $done = true;
407 }
408
409 if ( isset( $information['totalsize'] ) ) {
410 $websiteSyncValues['totalsize'] = $information['totalsize'];
411 $done = true;
412 }
413
414 if ( isset( $information['dbsize'] ) ) {
415 $websiteSyncValues['dbsize'] = $information['dbsize'];
416 $done = true;
417 }
418
419 if ( isset( $information['extauth'] ) ) {
420 $websiteSyncValues['extauth'] = $information['extauth'];
421 $done = true;
422 }
423
424 if ( isset( $information['wpe'] ) ) {
425 $websiteValues['wpe'] = $information['wpe'];
426 $done = true;
427 }
428
429 if ( isset( $information['wphost'] ) ) {
430 MainWP_DB::instance()->update_website_option( $pWebsite, 'wphost', $information['wphost'] );
431 }
432
433 if ( isset( $information['last_post_gmt'] ) ) {
434 $websiteSyncValues['last_post_gmt'] = $information['last_post_gmt'];
435 $done = true;
436 }
437
438 if ( isset( $information['health_site_status'] ) ) {
439 $health_status = $information['health_site_status'];
440 $hstatus = MainWP_Utility::get_site_health( $health_status );
441 $custom_health_value = $hstatus['val'] - $hstatus['critical'] * 100; // computes custom health value to support sorting by sites health and sites health threshold.
442 $websiteSyncValues['health_value'] = $custom_health_value;
443 $done = true;
444 MainWP_DB::instance()->update_website_option( $pWebsite, 'health_site_status', wp_json_encode( $health_status ) );
445 $new_noticed = MainWP_Monitoring_Handler::get_health_noticed_status_value( $pWebsite, $custom_health_value );
446 if ( null !== $new_noticed ) {
447 MainWP_DB::instance()->update_website_sync_values(
448 $pWebsite->id,
449 array(
450 'health_site_noticed' => $new_noticed,
451 )
452 );
453 }
454
455 $hval = $hstatus['val'];
456 $critical = $hstatus['critical'];
457 $health_status = 0;
458 if ( 80 <= $hval && empty( $critical ) ) {
459 $health_status = 0; // Good.
460 } else {
461 $health_status = 1; // Should be improved'.
462 }
463 $websiteSyncValues['health_status'] = $health_status;
464 } else {
465 MainWP_DB::instance()->update_website_option( $pWebsite, 'health_site_status', $emptyArray );
466 }
467
468 if ( isset( $information['mainwpdir'] ) ) {
469 $websiteValues['mainwpdir'] = $information['mainwpdir'];
470 $done = true;
471 }
472
473 if ( isset( $information['uniqueId'] ) ) {
474 $websiteValues['uniqueId'] = $information['uniqueId'];
475 $done = true;
476 }
477
478 if ( isset( $information['clone_adminname'] ) ) {
479 $websiteValues['adminname'] = $information['clone_adminname'];
480 $done = true;
481 }
482
483 if ( isset( $information['admin_nicename'] ) ) {
484 MainWP_DB::instance()->update_website_option( $pWebsite, 'admin_nicename', trim( $information['admin_nicename'] ) );
485 $done = true;
486 }
487
488 if ( isset( $information['admin_useremail'] ) ) {
489 MainWP_DB::instance()->update_website_option( $pWebsite, 'admin_useremail', trim( $information['admin_useremail'] ) );
490 $done = true;
491 }
492
493 if ( isset( $information['plugins_outdate_info'] ) ) {
494 MainWP_DB::instance()->update_website_option( $pWebsite, 'plugins_outdate_info', wp_json_encode( $information['plugins_outdate_info'] ) );
495 $done = true;
496 } else {
497 MainWP_DB::instance()->update_website_option( $pWebsite, 'plugins_outdate_info', $emptyArray );
498 }
499
500 if ( isset( $information['themes_outdate_info'] ) ) {
501 MainWP_DB::instance()->update_website_option( $pWebsite, 'themes_outdate_info', wp_json_encode( $information['themes_outdate_info'] ) );
502 $done = true;
503 } else {
504 MainWP_DB::instance()->update_website_option( $pWebsite, 'themes_outdate_info', $emptyArray );
505 }
506
507 if ( isset( $information['primaryLasttimeBackup'] ) ) {
508 MainWP_DB::instance()->update_website_option( $pWebsite, 'primary_lasttime_backup', $information['primaryLasttimeBackup'] );
509 $done = true;
510 }
511
512 if ( isset( $information['child_site_actions_data'] ) ) {
513 if ( is_array( $information['child_site_actions_data'] ) && isset( $information['child_site_actions_data']['connected_admin'] ) ) {
514 unset( $information['child_site_actions_data']['connected_admin'] );
515 }
516 MainWP_DB_Site_Actions::instance()->sync_site_actions( $pWebsite->id, $information['child_site_actions_data'] );
517 $done = true;
518 }
519
520 if ( ! $done ) {
521 if ( isset( $information['wpversion'] ) ) {
522 $done = true;
523 } elseif ( isset( $information['error'] ) ) {
524 MainWP_Logger::instance()->warning_for_website( $pWebsite, 'SYNC ERROR', '[' . esc_html( $information['error'] ) . ']' );
525 $error = true;
526 $done = true;
527 $_error = esc_html__( 'ERROR: ', 'mainwp' ) . esc_html( $information['error'] );
528 $websiteSyncValues['sync_errors'] = $_error;
529 } elseif ( ! empty( $sync_errors ) ) {
530 MainWP_Logger::instance()->warning_for_website( $pWebsite, 'SYNC ERROR', '[' . $sync_errors . ']' );
531 $_error = $sync_errors;
532 $error = true;
533 if ( ! $pAllowDisconnect ) {
534 $sync_errors = '';
535 }
536
537 $websiteSyncValues['sync_errors'] = $sync_errors;
538 } else {
539 MainWP_Logger::instance()->warning_for_website( $pWebsite, 'SYNC ERROR', '[Undefined error]' );
540 $error = true;
541 if ( $pAllowDisconnect ) {
542 $sync_errors = esc_html__( 'Undefined error! Please, reinstall the MainWP Child plugin on the child site.', 'mainwp' );
543 $websiteSyncValues['sync_errors'] = $sync_errors;
544 $_error = $sync_errors;
545 }
546 }
547 }
548
549 $act_success = false;
550 if ( $done ) {
551 $act_success = true;
552 $websiteSyncValues['dtsSync'] = time();
553 }
554 MainWP_DB::instance()->update_website_sync_values( $pWebsite->id, $websiteSyncValues );
555 MainWP_DB::instance()->update_website_values( $pWebsite->id, $websiteValues );
556
557 // Sync action.
558 if ( ! $error ) {
559 do_action_deprecated( 'mainwp-site-synced', array( $pWebsite, $information ), '4.0.7.2', 'mainwp_site_synced' ); // @deprecated Use 'mainwp_site_synced' instead.
560
561 /**
562 * Action: mainwp_site_synced
563 *
564 * Fires upon successful site synchronization.
565 *
566 * @param object $pWebsite Object containing child site info.
567 * @param array $information Array containing information returned from child site.
568 *
569 * @since 3.4
570 */
571 do_action( 'mainwp_site_synced', $pWebsite, $information );
572 }
573
574 $post_data = array();
575
576 /**
577 * Action: mainwp_site_sync
578 *
579 * Fires upon successful site synchronization.
580 *
581 * @param object $pWebsite Object containing child site info.
582 * @param array $information Array containing information returned from child site.
583 * @param bool $act_success action success or failed.
584 * @param string $_error Sync error message if existed.
585 * @param array $post_data Addition post data.
586 *
587 * @since 3.4
588 */
589 do_action( 'mainwp_site_sync', $pWebsite, $information, $act_success, $_error, $post_data );
590
591 return ( ! $error );
592 }
593
594 /**
595 * Method get_wp_icon()
596 *
597 * Get site's icon.
598 *
599 * @param mixed $siteId site's id.
600 *
601 * @return array result error or success
602 * @throws \Exception Error message.
603 *
604 * @uses \MainWP\Dashboard\MainWP_Connect::fetch_url_authed()
605 * @uses \MainWP\Dashboard\MainWP_Connect::get_file_content()
606 * @uses \MainWP\Dashboard\MainWP_DB::get_website_by_id()
607 * @uses \MainWP\Dashboard\MainWP_DB_Common::update_website_option()
608 * @uses \MainWP\Dashboard\MainWP_Exception
609 * @uses \MainWP\Dashboard\MainWP_Logger::debug()
610 * @uses \MainWP\Dashboard\MainWP_System_Utility::can_edit_website()
611 * @uses \MainWP\Dashboard\MainWP_System_Utility::get_wp_file_system()
612 * @uses \MainWP\Dashboard\MainWP_System_Utility::get_mainwp_dir()
613 * @uses \MainWP\Dashboard\MainWP_Utility::ctype_digit()
614 */
615 public static function get_wp_icon( $siteId = null ) {
616 if ( MainWP_Utility::ctype_digit( $siteId ) ) {
617 $website = MainWP_DB::instance()->get_website_by_id( $siteId );
618 if ( MainWP_System_Utility::can_edit_website( $website ) ) {
619 $error = '';
620 try {
621 $information = MainWP_Connect::fetch_url_authed( $website, 'get_site_icon' );
622 } catch ( MainWP_Exception $e ) {
623 $error = $e->getMessage();
624 }
625
626 if ( ! empty( $error ) ) {
627 return array( 'error' => $error );
628 } elseif ( isset( $information['faviIconUrl'] ) && ! empty( $information['faviIconUrl'] ) ) {
629 MainWP_Logger::instance()->debug( 'Downloading icon :: ' . esc_html( $information['faviIconUrl'] ) );
630 $content = MainWP_Connect::get_file_content( $information['faviIconUrl'] );
631 if ( ! empty( $content ) ) {
632
633 $hasWPFileSystem = MainWP_System_Utility::get_wp_file_system();
634
635 /**
636 * WordPress files system object.
637 *
638 * @global object
639 */
640 global $wp_filesystem;
641
642 $dirs = MainWP_System_Utility::get_mainwp_dir( 'icons', true );
643 $iconsDir = $dirs[0];
644 $filename = basename( $information['faviIconUrl'] );
645 $filename = strtok( $filename, '?' );
646 if ( $filename ) {
647 $filename = 'favi-' . $siteId . '-' . $filename;
648 $size = false;
649 if ( MainWP_Utility::check_image_file_name( $filename ) ) {
650 $size = $wp_filesystem->put_contents( $iconsDir . $filename, $content ); // phpcs:ignore --
651 }
652 if ( $size ) {
653 MainWP_Logger::instance()->debug( 'Icon size :: ' . $size );
654 MainWP_DB::instance()->update_website_option( $website, 'favi_icon', $filename );
655 return array( 'result' => 'success' );
656 } else {
657 return array( 'error' => 'Save icon file failed.' );
658 }
659 }
660 return array( 'undefined_error' => true );
661 } else {
662 return array( 'error' => esc_html__( 'Download icon file failed', 'mainwp' ) );
663 }
664 } else {
665 return array( 'undefined_error' => true );
666 }
667 }
668 }
669 return array( 'result' => 'NOSITE' );
670 }
671 }
672