PluginProbe
MainWP Dashboard: Self-hosted WordPress Management for Agencies / 5.1
MainWP Dashboard: Self-hosted WordPress Management for Agencies v5.1
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.1, at class/class-mainwp-sync.php

675 lines 30.0 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 { // phpcs:ignore Generic.Classes.OpeningBraceSameLine.ContentAfterBrace -- NOSONAR.
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 static::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 -- NOSONAR - 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. NOSONAR - not IP.
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 = static::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 = MainWP_Error_Helper::get_error_not_detected_connect();
168 $check_result = 1;
169 }
170
171 MainWP_Logger::instance()->log_execution_time( 'sync :: [siteid=' . $pWebsite->id . ']' );
172 return static::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 -- NOSONAR -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_list'] ) ) {
405 $websiteValues['categories'] = wp_json_encode( $information['categories_list'] );
406 $done = true;
407 } elseif ( isset( $information['categories'] ) ) { // support old child version.
408 $websiteValues['categories'] = wp_json_encode( $information['categories'] );
409 $done = true;
410 }
411
412 if ( isset( $information['totalsize'] ) ) {
413 $websiteSyncValues['totalsize'] = $information['totalsize'];
414 $done = true;
415 }
416
417 if ( isset( $information['dbsize'] ) ) {
418 $websiteSyncValues['dbsize'] = $information['dbsize'];
419 $done = true;
420 }
421
422 if ( isset( $information['extauth'] ) ) {
423 $websiteSyncValues['extauth'] = $information['extauth'];
424 $done = true;
425 }
426
427 if ( isset( $information['wpe'] ) ) {
428 $websiteValues['wpe'] = $information['wpe'];
429 $done = true;
430 }
431
432 if ( isset( $information['wphost'] ) ) {
433 MainWP_DB::instance()->update_website_option( $pWebsite, 'wphost', $information['wphost'] );
434 }
435
436 if ( isset( $information['last_post_gmt'] ) ) {
437 $websiteSyncValues['last_post_gmt'] = $information['last_post_gmt'];
438 $done = true;
439 }
440
441 if ( isset( $information['health_site_status'] ) ) {
442 $health_status = $information['health_site_status'];
443 $hstatus = MainWP_Utility::get_site_health( $health_status );
444 $custom_health_value = $hstatus['val'] - $hstatus['critical'] * 100; // computes custom health value to support sorting by sites health and sites health threshold.
445 $websiteSyncValues['health_value'] = $custom_health_value;
446 $done = true;
447 MainWP_DB::instance()->update_website_option( $pWebsite, 'health_site_status', wp_json_encode( $health_status ) );
448 $new_noticed = MainWP_Monitoring_Handler::get_health_noticed_status_value( $pWebsite, $custom_health_value );
449 if ( null !== $new_noticed ) {
450 MainWP_DB::instance()->update_website_sync_values(
451 $pWebsite->id,
452 array(
453 'health_site_noticed' => $new_noticed,
454 )
455 );
456 }
457
458 $hval = $hstatus['val'];
459 $critical = $hstatus['critical'];
460 $health_status = 0;
461 if ( 80 <= $hval && empty( $critical ) ) {
462 $health_status = 0; // Good.
463 } else {
464 $health_status = 1; // Should be improved'.
465 }
466 $websiteSyncValues['health_status'] = $health_status;
467 } else {
468 MainWP_DB::instance()->update_website_option( $pWebsite, 'health_site_status', $emptyArray );
469 }
470
471 if ( isset( $information['mainwpdir'] ) ) {
472 $websiteValues['mainwpdir'] = $information['mainwpdir'];
473 $done = true;
474 }
475
476 if ( isset( $information['uniqueId'] ) ) {
477 $websiteValues['uniqueId'] = $information['uniqueId'];
478 $done = true;
479 }
480
481 if ( isset( $information['clone_adminname'] ) ) {
482 $websiteValues['adminname'] = $information['clone_adminname'];
483 $done = true;
484 }
485
486 if ( isset( $information['admin_nicename'] ) ) {
487 MainWP_DB::instance()->update_website_option( $pWebsite, 'admin_nicename', trim( $information['admin_nicename'] ) );
488 $done = true;
489 }
490
491 if ( isset( $information['admin_useremail'] ) ) {
492 MainWP_DB::instance()->update_website_option( $pWebsite, 'admin_useremail', trim( $information['admin_useremail'] ) );
493 $done = true;
494 }
495
496 if ( isset( $information['plugins_outdate_info'] ) ) {
497 MainWP_DB::instance()->update_website_option( $pWebsite, 'plugins_outdate_info', wp_json_encode( $information['plugins_outdate_info'] ) );
498 $done = true;
499 } else {
500 MainWP_DB::instance()->update_website_option( $pWebsite, 'plugins_outdate_info', $emptyArray );
501 }
502
503 if ( isset( $information['themes_outdate_info'] ) ) {
504 MainWP_DB::instance()->update_website_option( $pWebsite, 'themes_outdate_info', wp_json_encode( $information['themes_outdate_info'] ) );
505 $done = true;
506 } else {
507 MainWP_DB::instance()->update_website_option( $pWebsite, 'themes_outdate_info', $emptyArray );
508 }
509
510 if ( isset( $information['primaryLasttimeBackup'] ) ) {
511 MainWP_DB::instance()->update_website_option( $pWebsite, 'primary_lasttime_backup', $information['primaryLasttimeBackup'] );
512 $done = true;
513 }
514
515 if ( isset( $information['child_site_actions_data'] ) ) {
516 if ( is_array( $information['child_site_actions_data'] ) && isset( $information['child_site_actions_data']['connected_admin'] ) ) {
517 unset( $information['child_site_actions_data']['connected_admin'] );
518 }
519 MainWP_DB_Site_Actions::instance()->sync_site_actions( $pWebsite->id, $information['child_site_actions_data'] );
520 $done = true;
521 }
522
523 if ( ! $done ) {
524 if ( isset( $information['wpversion'] ) ) {
525 $done = true;
526 } elseif ( isset( $information['error'] ) ) {
527 MainWP_Logger::instance()->warning_for_website( $pWebsite, 'SYNC ERROR', '[' . esc_html( $information['error'] ) . ']' );
528 $error = true;
529 $done = true;
530 $_error = esc_html__( 'ERROR: ', 'mainwp' ) . esc_html( $information['error'] );
531 $websiteSyncValues['sync_errors'] = $_error;
532 } elseif ( ! empty( $sync_errors ) ) {
533 MainWP_Logger::instance()->warning_for_website( $pWebsite, 'SYNC ERROR', '[' . $sync_errors . ']' );
534 $_error = $sync_errors;
535 $error = true;
536 if ( ! $pAllowDisconnect ) {
537 $sync_errors = '';
538 }
539
540 $websiteSyncValues['sync_errors'] = $sync_errors;
541 } else {
542 MainWP_Logger::instance()->warning_for_website( $pWebsite, 'SYNC ERROR', '[Undefined error]' );
543 $error = true;
544 if ( $pAllowDisconnect ) {
545 $sync_errors = esc_html__( 'Undefined error! Please, reinstall the MainWP Child plugin on the child site.', 'mainwp' );
546 $websiteSyncValues['sync_errors'] = $sync_errors;
547 $_error = $sync_errors;
548 }
549 }
550 }
551
552 $act_success = false;
553 if ( $done ) {
554 $act_success = true;
555 $websiteSyncValues['dtsSync'] = time();
556 }
557 MainWP_DB::instance()->update_website_sync_values( $pWebsite->id, $websiteSyncValues );
558 MainWP_DB::instance()->update_website_values( $pWebsite->id, $websiteValues );
559
560 // Sync action.
561 if ( ! $error ) {
562 do_action_deprecated( 'mainwp-site-synced', array( $pWebsite, $information ), '4.0.7.2', 'mainwp_site_synced' ); // @deprecated Use 'mainwp_site_synced' instead. NOSONAR - not IP.
563
564 /**
565 * Action: mainwp_site_synced
566 *
567 * Fires upon successful site synchronization.
568 *
569 * @param object $pWebsite Object containing child site info.
570 * @param array $information Array containing information returned from child site.
571 *
572 * @since 3.4
573 */
574 do_action( 'mainwp_site_synced', $pWebsite, $information );
575 }
576
577 $post_data = array();
578
579 /**
580 * Action: mainwp_site_sync
581 *
582 * Fires upon successful site synchronization.
583 *
584 * @param object $pWebsite Object containing child site info.
585 * @param array $information Array containing information returned from child site.
586 * @param bool $act_success action success or failed.
587 * @param string $_error Sync error message if existed.
588 * @param array $post_data Addition post data.
589 *
590 * @since 3.4
591 */
592 do_action( 'mainwp_site_sync', $pWebsite, $information, $act_success, $_error, $post_data );
593
594 return ! $error;
595 }
596
597 /**
598 * Method get_wp_icon()
599 *
600 * Get site's icon.
601 *
602 * @param mixed $siteId site's id.
603 *
604 * @return array result error or success
605 * @throws \MainWP_Exception Error message.
606 *
607 * @uses \MainWP\Dashboard\MainWP_Connect::fetch_url_authed()
608 * @uses \MainWP\Dashboard\MainWP_Connect::get_file_content()
609 * @uses \MainWP\Dashboard\MainWP_DB::get_website_by_id()
610 * @uses \MainWP\Dashboard\MainWP_DB_Common::update_website_option()
611 * @uses \MainWP\Dashboard\MainWP_Exception
612 * @uses \MainWP\Dashboard\MainWP_Logger::debug()
613 * @uses \MainWP\Dashboard\MainWP_System_Utility::can_edit_website()
614 * @uses \MainWP\Dashboard\MainWP_System_Utility::get_wp_file_system()
615 * @uses \MainWP\Dashboard\MainWP_System_Utility::get_mainwp_dir()
616 * @uses \MainWP\Dashboard\MainWP_Utility::ctype_digit()
617 */
618 public static function get_wp_icon( $siteId = null ) { // phpcs:ignore -- NOSONAR - complex.
619 if ( MainWP_Utility::ctype_digit( $siteId ) ) {
620 $website = MainWP_DB::instance()->get_website_by_id( $siteId );
621 if ( MainWP_System_Utility::can_edit_website( $website ) ) {
622 $error = '';
623 try {
624 $information = MainWP_Connect::fetch_url_authed( $website, 'get_site_icon' );
625 } catch ( MainWP_Exception $e ) {
626 $error = $e->getMessage();
627 }
628
629 if ( ! empty( $error ) ) {
630 return array( 'error' => $error );
631 } elseif ( isset( $information['faviIconUrl'] ) && ! empty( $information['faviIconUrl'] ) ) {
632 MainWP_Logger::instance()->debug( 'Downloading icon :: ' . esc_html( $information['faviIconUrl'] ) );
633 $content = MainWP_Connect::get_file_content( $information['faviIconUrl'] );
634 if ( ! empty( $content ) ) {
635
636 MainWP_System_Utility::get_wp_file_system();
637
638 /**
639 * WordPress files system object.
640 *
641 * @global object
642 */
643 global $wp_filesystem;
644
645 $dirs = MainWP_System_Utility::get_mainwp_dir( 'icons', true );
646 $iconsDir = $dirs[0];
647 $filename = basename( $information['faviIconUrl'] );
648 $filename = strtok( $filename, '?' );
649 if ( $filename ) {
650 $filename = 'favi-' . $siteId . '-' . $filename;
651 $size = false;
652 if ( MainWP_Utility::check_image_file_name( $filename ) ) {
653 $size = $wp_filesystem->put_contents( $iconsDir . $filename, $content ); // phpcs:ignore --
654 }
655 if ( $size ) {
656 MainWP_Logger::instance()->debug( 'Icon size :: ' . $size );
657 MainWP_DB::instance()->update_website_option( $website, 'favi_icon', $filename );
658 return array( 'result' => 'success' );
659 } else {
660 return array( 'error' => 'Save icon file failed.' );
661 }
662 }
663 return array( 'undefined_error' => true );
664 } else {
665 return array( 'error' => esc_html__( 'Download icon file failed', 'mainwp' ) );
666 }
667 } else {
668 return array( 'undefined_error' => true );
669 }
670 }
671 }
672 return array( 'result' => 'NOSITE' );
673 }
674 }
675