PluginProbe
MainWP Dashboard: Self-hosted WordPress Management for Agencies / 5.0.1
MainWP Dashboard: Self-hosted WordPress Management for Agencies v5.0.1
6.2.2 6.2.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 All 155 releases
mainwp / widgets / widget-mainwp-updates-overview.php

widget-mainwp-updates-overview.php in MainWP Dashboard: Self-hosted WordPress Management for Agencies 5.0.1, at widgets/widget-mainwp-updates-overview.php

1,205 lines 44.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * MainWP Updates Overview Widget
4 *
5 * Grab Child Sites update status & build widget.
6 *
7 * @package MainWP/Updates_Overview
8 */
9
10 namespace MainWP\Dashboard;
11
12 /**
13 * Class MainWP_Updates_Overview
14 *
15 * @package MainWP\Dashboard
16 */
17 class MainWP_Updates_Overview {
18
19 /**
20 * Method get_class_name()
21 *
22 * Get Class Name
23 *
24 * @return string __CLASS__ Class Name.
25 */
26 public static function get_class_name() {
27 return __CLASS__;
28 }
29
30 /**
31 * Method init()
32 *
33 * Add plugins api filter.
34 */
35 public static function init() {
36 add_filter( 'plugins_api', array( __CLASS__, 'plugins_api' ), 10, 3 );
37 }
38
39 /**
40 * Method plugins_api()
41 *
42 * Grab Child Sites update status & build widget.
43 *
44 * @param mixed $default_value Default.
45 * @param mixed $action Action.
46 * @param mixed $args Slug.
47 *
48 * @return mixed $default|$res
49 */
50 public static function plugins_api( $default_value, $action, $args ) {
51 if ( property_exists( $args, 'slug' ) && ( 'mainwp' === $args->slug ) ) {
52 return $default_value;
53 }
54
55 $url = 'http://api.wordpress.org/plugins/info/1.0/';
56 $ssl = wp_http_supports( array( 'ssl' ) );
57 if ( $ssl ) {
58 $url = set_url_scheme( $url, 'https' );
59 }
60
61 $args = array(
62 'timeout' => 15,
63 'body' => array(
64 'action' => $action,
65 'request' => serialize( $args ), // phpcs:ignore -- WP.org API params.
66 ),
67 );
68 $request = wp_remote_post( $url, $args );
69
70 if ( is_wp_error( $request ) ) {
71 $url = isset( $_REQUEST['url'] ) ? esc_url_raw( wp_unslash( $_REQUEST['url'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
72 $name = isset( $_REQUEST['name'] ) ? wp_unslash( $_REQUEST['name'] ) : ''; // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
73 $res = new \WP_Error( 'plugins_api_failed', esc_html__( '<h3>No plugin information found.</h3> This may be a premium plugin and no other details are available from WordPress.', 'mainwp' ) . ' ' . ( empty( $url ) ? esc_html__( 'Please visit the plugin website for more information.', 'mainwp' ) : esc_html__( 'Please visit the plugin website for more information: ', 'mainwp' ) . '<a href="' . esc_html( rawurldecode( $url ) ) . '" target="_blank">' . esc_html( rawurldecode( $name ) ) . '</a>' ), $request->get_error_message() );
74
75 return $res;
76 }
77
78 return $default_value;
79 }
80
81 /**
82 * Method get_name()
83 *
84 * Define Widget Title.
85 */
86 public static function get_name() {
87 return esc_html__( 'Update Overview', 'mainwp' );
88 }
89
90 /**
91 * Method render()
92 *
93 * Check if $_GET['dashboard'] then run render_sites().
94 */
95 public static function render() {
96 self::render_sites();
97 }
98
99 /**
100 * Method render_sites()
101 *
102 * Grab available Child Sites updates a build Widget.
103 *
104 * @uses \MainWP\Dashboard\MainWP_DB_Common::get_user_extension()
105 * @uses \MainWP\Dashboard\MainWP_DB_Common::get_last_sync_status()
106 * @uses \MainWP\Dashboard\MainWP_DB::query()
107 * @uses \MainWP\Dashboard\MainWP_DB::get_website_by_id()
108 * @uses \MainWP\Dashboard\MainWP_DB::get_website_option()
109 * @uses \MainWP\Dashboard\MainWP_DB::data_seek()::fetch_object()
110 * @uses \MainWP\Dashboard\MainWP_DB::data_seek()
111 * @uses \MainWP\Dashboard\MainWP_System_Utility::get_current_wpid()
112 * @uses \MainWP\Dashboard\MainWP_Utility::format_timestamp()
113 */
114 public static function render_sites() { // phpcs:ignore -- current complexity required to achieve desired results. Pull request solutions appreciated.
115
116 $globalView = true;
117
118 /**
119 * Current user global.
120 *
121 * @global string
122 */
123 global $current_user;
124
125 $current_wpid = MainWP_System_Utility::get_current_wpid();
126
127 if ( $current_wpid ) {
128 $sql = MainWP_DB::instance()->get_sql_website_by_id( $current_wpid, false, array( 'premium_upgrades', 'plugins_outdate_dismissed', 'themes_outdate_dismissed', 'plugins_outdate_info', 'themes_outdate_info', 'favi_icon' ) );
129 $globalView = false;
130 } else {
131 $staging_enabled = is_plugin_active( 'mainwp-staging-extension/mainwp-staging-extension.php' ) || is_plugin_active( 'mainwp-timecapsule-extension/mainwp-timecapsule-extension.php' );
132 // To support staging extension.
133 $is_staging = 'no';
134 if ( $staging_enabled ) {
135 $staging_updates_view = MainWP_System_Utility::get_staging_options_sites_view_for_current_users();
136 if ( 'staging' === $staging_updates_view ) {
137 $is_staging = 'yes';
138 }
139 }
140 // end support.
141
142 $sql = MainWP_DB::instance()->get_sql_websites_for_current_user( false, null, 'wp.url', false, false, null, false, array( 'premium_upgrades', 'plugins_outdate_dismissed', 'themes_outdate_dismissed', 'plugins_outdate_info', 'themes_outdate_info', 'favi_icon' ), $is_staging );
143 }
144
145 $userExtension = MainWP_DB_Common::instance()->get_user_extension();
146 $websites = MainWP_DB::instance()->query( $sql );
147
148 $mainwp_show_language_updates = get_option( 'mainwp_show_language_updates', 1 );
149
150 $decodedDismissedPlugins = ! empty( $userExtension->dismissed_plugins ) ? json_decode( $userExtension->dismissed_plugins, true ) : array();
151 $decodedDismissedThemes = ! empty( $userExtension->dismissed_themes ) ? json_decode( $userExtension->dismissed_themes, true ) : array();
152
153 $total_wp_upgrades = 0;
154 $total_plugin_upgrades = 0;
155 $total_translation_upgrades = 0;
156 $total_theme_upgrades = 0;
157
158 $total_plugins_outdate = 0;
159 $total_themes_outdate = 0;
160
161 $all_wp_updates = array();
162 $all_plugins_updates = array();
163 $all_themes_updates = array();
164 $all_translations_updates = array();
165
166 MainWP_DB::data_seek( $websites, 0 );
167
168 $currentSite = null;
169
170 while ( $websites && ( $website = MainWP_DB::fetch_object( $websites ) ) ) {
171 if ( ! $globalView ) {
172 $currentSite = $website;
173 }
174
175 $pluginsIgnoredAbandoned_perSites = array();
176 $themesIgnoredAbandoned_perSites = array();
177
178 $wp_upgrades = MainWP_DB::instance()->get_website_option( $website, 'wp_upgrades' );
179 $wp_upgrades = ! empty( $wp_upgrades ) ? json_decode( $wp_upgrades, true ) : array();
180
181 if ( $website->is_ignoreCoreUpdates ) {
182 $wp_upgrades = array();
183 }
184
185 if ( is_array( $wp_upgrades ) && count( $wp_upgrades ) > 0 ) {
186 ++$total_wp_upgrades;
187 $all_wp_updates[] = array(
188 'id' => $website->id,
189 'name' => $website->name,
190 );
191 }
192
193 $translation_upgrades = ! empty( $website->translation_upgrades ) ? json_decode( $website->translation_upgrades, true ) : array();
194
195 $plugin_upgrades = ! empty( $website->plugin_upgrades ) ? json_decode( $website->plugin_upgrades, true ) : array();
196
197 if ( $website->is_ignorePluginUpdates ) {
198 $plugin_upgrades = array();
199 }
200
201 $theme_upgrades = ! empty( $website->theme_upgrades ) ? json_decode( $website->theme_upgrades, true ) : array();
202 if ( $website->is_ignoreThemeUpdates ) {
203 $theme_upgrades = array();
204 }
205
206 $decodedPremiumUpgrades = MainWP_DB::instance()->get_website_option( $website, 'premium_upgrades' );
207 $decodedPremiumUpgrades = ! empty( $decodedPremiumUpgrades ) ? json_decode( $decodedPremiumUpgrades, true ) : array();
208
209 if ( is_array( $decodedPremiumUpgrades ) ) {
210 foreach ( $decodedPremiumUpgrades as $crrSlug => $premiumUpgrade ) {
211 $premiumUpgrade['premium'] = true;
212
213 if ( 'plugin' === $premiumUpgrade['type'] ) {
214 if ( ! is_array( $plugin_upgrades ) ) {
215 $plugin_upgrades = array();
216 }
217 if ( ! $website->is_ignorePluginUpdates ) {
218
219 $premiumUpgrade = array_filter( $premiumUpgrade );
220 if ( ! isset( $plugin_upgrades[ $crrSlug ] ) ) {
221 $plugin_upgrades[ $crrSlug ] = array();
222 }
223
224 $plugin_upgrades[ $crrSlug ] = array_merge( $plugin_upgrades[ $crrSlug ], $premiumUpgrade );
225 }
226 } elseif ( 'theme' === $premiumUpgrade['type'] ) {
227 if ( ! is_array( $theme_upgrades ) ) {
228 $theme_upgrades = array();
229 }
230 if ( ! $website->is_ignoreThemeUpdates ) {
231 $theme_upgrades[ $crrSlug ] = $premiumUpgrade;
232 }
233 }
234 }
235 }
236
237 if ( is_array( $translation_upgrades ) ) {
238
239 $total_translation_upgrades += count( $translation_upgrades );
240
241 if ( count( $translation_upgrades ) > 0 ) {
242 foreach ( $translation_upgrades as $trans_upgrade ) {
243 $slug = $trans_upgrade['slug'];
244 $all_translations_updates[] = array(
245 'id' => $website->id,
246 'name' => $website->name,
247 'translation_slug' => $slug,
248 );
249 }
250 }
251 }
252
253 if ( is_array( $plugin_upgrades ) ) {
254 $ignored_plugins = ! empty( $website->ignored_plugins ) ? json_decode( $website->ignored_plugins, true ) : array();
255 if ( is_array( $ignored_plugins ) ) {
256 $plugin_upgrades = array_diff_key( $plugin_upgrades, $ignored_plugins );
257 }
258
259 $ignored_plugins = ! empty( $userExtension->ignored_plugins ) ? json_decode( $userExtension->ignored_plugins, true ) : array();
260 if ( is_array( $ignored_plugins ) ) {
261 $plugin_upgrades = array_diff_key( $plugin_upgrades, $ignored_plugins );
262 }
263
264 $total_plugin_upgrades += count( $plugin_upgrades );
265
266 if ( count( $plugin_upgrades ) > 0 ) {
267 foreach ( $plugin_upgrades as $slug => $value ) {
268 $all_plugins_updates[] = array(
269 'id' => $website->id,
270 'name' => $website->name,
271 'plugin_slug' => $slug,
272 );
273 }
274 }
275 }
276
277 if ( is_array( $theme_upgrades ) ) {
278 $ignored_themes = ! empty( $website->ignored_themes ) ? json_decode( $website->ignored_themes, true ) : array();
279 if ( is_array( $ignored_themes ) ) {
280 $theme_upgrades = array_diff_key( $theme_upgrades, $ignored_themes );
281 }
282
283 $ignored_themes = ! empty( $userExtension->ignored_themes ) ? json_decode( $userExtension->ignored_themes, true ) : array();
284 if ( is_array( $ignored_themes ) ) {
285 $theme_upgrades = array_diff_key( $theme_upgrades, $ignored_themes );
286 }
287
288 $total_theme_upgrades += count( $theme_upgrades );
289
290 if ( count( $theme_upgrades ) > 0 ) {
291 foreach ( $theme_upgrades as $slug => $value ) {
292 $all_themes_updates[] = array(
293 'id' => $website->id,
294 'name' => $website->name,
295 'theme_slug' => $slug,
296 );
297 }
298 }
299 }
300
301 $pluginsIgnoredAbandoned_perSites = MainWP_DB::instance()->get_website_option( $website, 'plugins_outdate_dismissed' );
302 $pluginsIgnoredAbandoned_perSites = ! empty( $pluginsIgnoredAbandoned_perSites ) ? json_decode( $pluginsIgnoredAbandoned_perSites, true ) : array();
303 if ( is_array( $pluginsIgnoredAbandoned_perSites ) ) {
304 $pluginsIgnoredAbandoned_perSites = array_filter( $pluginsIgnoredAbandoned_perSites );
305 }
306
307 $themesIgnoredAbandoned_perSites = MainWP_DB::instance()->get_website_option( $website, 'themes_outdate_dismissed' );
308 $themesIgnoredAbandoned_perSites = ! empty( $themesIgnoredAbandoned_perSites ) ? json_decode( $themesIgnoredAbandoned_perSites, true ) : array();
309 if ( is_array( $themesIgnoredAbandoned_perSites ) ) {
310 $themesIgnoredAbandoned_perSites = array_filter( $themesIgnoredAbandoned_perSites );
311 }
312
313 $plugins_outdate = MainWP_DB::instance()->get_website_option( $website, 'plugins_outdate_info' );
314 $plugins_outdate = ! empty( $plugins_outdate ) ? json_decode( $plugins_outdate, true ) : array();
315
316 $themes_outdate = MainWP_DB::instance()->get_website_option( $website, 'themes_outdate_info' );
317 $themes_outdate = ! empty( $themes_outdate ) ? json_decode( $themes_outdate, true ) : array();
318
319 if ( is_array( $plugins_outdate ) ) {
320 if ( is_array( $pluginsIgnoredAbandoned_perSites ) ) {
321 $plugins_outdate = array_diff_key( $plugins_outdate, $pluginsIgnoredAbandoned_perSites );
322 }
323
324 if ( is_array( $decodedDismissedPlugins ) ) {
325 $plugins_outdate = array_diff_key( $plugins_outdate, $decodedDismissedPlugins );
326 }
327
328 $total_plugins_outdate += count( $plugins_outdate );
329 }
330
331 if ( is_array( $themes_outdate ) ) {
332 if ( is_array( $themesIgnoredAbandoned_perSites ) ) {
333 $themes_outdate = array_diff_key( $themes_outdate, $themesIgnoredAbandoned_perSites );
334 }
335
336 if ( is_array( $decodedDismissedThemes ) ) {
337 $themes_outdate = array_diff_key( $themes_outdate, $decodedDismissedThemes );
338 }
339
340 $total_themes_outdate += count( $themes_outdate );
341 }
342 }
343
344 // WP Upgrades part.
345 $total_upgrades = $total_wp_upgrades + $total_plugin_upgrades + $total_theme_upgrades;
346
347 // to fix incorrect total updates.
348 if ( $mainwp_show_language_updates ) {
349 $total_upgrades += $total_translation_upgrades;
350 }
351
352 $trustedPlugins = ! empty( $userExtension->trusted_plugins ) ? json_decode( $userExtension->trusted_plugins, true ) : array();
353 if ( ! is_array( $trustedPlugins ) ) {
354 $trustedPlugins = array();
355 }
356 $trustedThemes = ! empty( $userExtension->trusted_themes ) ? json_decode( $userExtension->trusted_themes, true ) : array();
357 if ( ! is_array( $trustedThemes ) ) {
358 $trustedThemes = array();
359 }
360
361 /**
362 * Filter: mainwp_limit_updates_all
363 *
364 * Limits the number of updates that will be processed in a single run on Update Everything action.
365 *
366 * @since 4.0
367 */
368 $limit_updates_all = apply_filters( 'mainwp_limit_updates_all', 0 );
369
370 if ( ! $globalView ) {
371 $last_dtsSync = $currentSite->dtsSync;
372 } else {
373 $result = MainWP_DB_Common::instance()->get_last_sync_status();
374 $sync_status = $result['sync_status'];
375 $last_sync = $result['last_sync'];
376 $last_dtsSync = $result['last_sync'];
377
378 if ( 'all_synced' === $sync_status ) {
379 $last_dtsSync = get_option( 'mainwp_last_synced_all_sites', $last_sync );
380 }
381 }
382
383 $lastSyncMsg = '';
384 if ( $last_dtsSync ) {
385 $lastSyncMsg = esc_html__( 'Last successfully completed synchronization: ', 'mainwp' ) . MainWP_Utility::format_timestamp( MainWP_Utility::get_timestamp( $last_dtsSync ) );
386 }
387
388 $user_can_update_translation = mainwp_current_user_have_right( 'dashboard', 'update_translations' );
389 $user_can_update_wordpress = mainwp_current_user_have_right( 'dashboard', 'update_wordpress' );
390 $user_can_update_themes = mainwp_current_user_have_right( 'dashboard', 'update_themes' );
391 $user_can_update_plugins = mainwp_current_user_have_right( 'dashboard', 'update_plugins' );
392
393 $can_total_update = ( $user_can_update_wordpress && $user_can_update_plugins && $user_can_update_themes && $user_can_update_translation ) ? true : false;
394
395 self::render_total_update( $total_upgrades, $lastSyncMsg, $can_total_update, $limit_updates_all );
396 echo '<div class="mainwp-scrolly-overflow">';
397 self::render_wordpress_update( $user_can_update_wordpress, $total_wp_upgrades, $globalView, $current_wpid );
398 self::render_plugins_update( $user_can_update_plugins, $total_plugin_upgrades, $globalView, $current_wpid );
399 self::render_themes_update( $user_can_update_themes, $total_theme_upgrades, $globalView, $current_wpid );
400 if ( 1 === (int) $mainwp_show_language_updates ) {
401 self::render_language_update( $user_can_update_translation, $total_translation_upgrades, $globalView, $current_wpid );
402 }
403 self::render_abandoned_plugins( $total_plugins_outdate, $globalView, $current_wpid );
404 self::render_abandoned_themes( $total_themes_outdate, $globalView, $current_wpid );
405
406 self::render_global_update(
407 $user_can_update_wordpress,
408 $total_wp_upgrades,
409 $all_wp_updates,
410 $user_can_update_plugins,
411 $total_plugin_upgrades,
412 $all_plugins_updates,
413 $user_can_update_themes,
414 $total_theme_upgrades,
415 $all_themes_updates,
416 $mainwp_show_language_updates,
417 $user_can_update_translation,
418 $total_translation_upgrades,
419 $all_translations_updates
420 );
421 self::render_bottom( $websites, $globalView );
422 echo '</div>';
423 echo '<div class="ui stackable grid mainwp-widget-footer">';
424 echo '<div class="eight wide column"></div>';
425 echo '<div class="eight wide column"></div>';
426 echo '</div>';
427 }
428
429 /**
430 * Render total update.
431 *
432 * @param int $total_upgrades number of update.
433 * @param string $lastSyncMsg last sync info.
434 * @param bool true|false $can_total_update permission to update all.
435 * @param int $limit_updates_all limit number of update per request, 0 is no limit.
436 */
437 public static function render_total_update( $total_upgrades, $lastSyncMsg, $can_total_update, $limit_updates_all ) {
438 $current_wpid = MainWP_System_Utility::get_current_wpid();
439 $globalView = true;
440 if ( $current_wpid ) {
441 $globalView = false;
442 }
443 ?>
444 <div class="ui grid mainwp-widget-header">
445 <div class="sixteen wide column">
446 <h3 class="ui header handle-drag">
447 <?php
448 /**
449 * Filter: mainwp_updates_overview_widget_title
450 *
451 * Filters the Updates Overview widget title text.
452 *
453 * @since 4.1
454 */
455 echo esc_html( apply_filters( 'mainwp_updates_overview_widget_title', esc_html__( 'Updates Overview', 'mainwp' ) ) );
456 ?>
457 <div class="sub header"><?php echo $lastSyncMsg; // phpcs:ignore WordPress.Security.EscapeOutput ?></div>
458 </h3>
459 </div>
460 </div>
461
462 <input type="hidden" name="updatesoverview_limit_updates_all" id="updatesoverview_limit_updates_all" value="<?php echo intval( $limit_updates_all ); ?>">
463 <?php
464 /**
465 * Action: mainwp_updates_overview_before_total_updates
466 *
467 * Fires before the total updates section in the Updates Overview widget.
468 *
469 * @since 4.1
470 */
471 do_action( 'mainwp_updates_overview_before_total_updates' );
472 ?>
473 <div class="ui stackable grid">
474
475 <div class="eight wide middle aligned column">
476
477 <div class="ui large statistic horizontal">
478 <div class="value">
479 <?php echo intval( $total_upgrades ); ?>
480 </div>
481 <div class="label">
482 <?php esc_html_e( 'Total Updates', 'mainwp' ); ?>
483 </div>
484 </div>
485 </div>
486
487 <div class="eight wide middle aligned right aligned column">
488 <?php
489 /**
490 * Filter: mainwp_update_everything_button_text
491 *
492 * Filters the Update Everything button text.
493 *
494 * @since 4.1
495 */
496
497 $is_demo = MainWP_Demo_Handle::is_demo_mode();
498 ?>
499 <?php if ( $can_total_update ) : ?>
500 <?php
501 if ( ! get_option( 'mainwp_hide_update_everything', false ) ) :
502 if ( $is_demo ) {
503 MainWP_Demo_Handle::get_instance()->render_demo_disable_button( '<a href="javascript:void(0)" class="ui big button green fluid disabled" disabled="disabled">' . esc_html( apply_filters( 'mainwp_update_everything_button_text', esc_html__( 'Update Everything', 'mainwp' ) ) ) . '</a>' );
504 } else {
505 ?>
506 <a href="#" <?php echo empty( $total_upgrades ) ? 'disabled' : 'onClick="return updatesoverview_global_upgrade_all( \'all\' );"'; ?> class="ui big button fluid green" id="mainwp-update-everything-button" data-tooltip="<?php $globalView ? esc_attr_e( 'Clicking this button will update all Plugins, Themes, WP Core files and translations on ALL your websites.', 'mainwp' ) : esc_attr_e( 'Clicking this button will update all Plugins, Themes, WP Core files and translations on this website.', 'mainwp' ); ?>" data-inverted="" data-position="top center"><?php echo esc_html( apply_filters( 'mainwp_update_everything_button_text', esc_html__( 'Update Everything', 'mainwp' ) ) ); ?></a>
507 <?php } ?>
508 <?php endif; ?>
509 <?php endif; ?>
510 </div>
511 </div>
512 <?php
513 /**
514 * Action: mainwp_updates_overview_after_total_updates
515 *
516 * Fires after the total updates section in the Updates Overview widget.
517 *
518 * @since 4.1
519 */
520 do_action( 'mainwp_updates_overview_after_total_updates' );
521 }
522
523 /**
524 * Render WordPress update details.
525 *
526 * @param bool $user_can_update_wordpress Permission to update WordPress.
527 * @param int $total_wp_upgrades Total number of WordPress update.
528 * @param bool $globalView Global view or not.
529 * @param int $current_wpid Current site ID.
530 *
531 * @uses \MainWP\Dashboard\MainWP_Updates::set_continue_update_html_selector()
532 * @uses \MainWP\Dashboard\MainWP_Updates::get_continue_update_selector()
533 */
534 public static function render_wordpress_update( $user_can_update_wordpress, $total_wp_upgrades, $globalView, $current_wpid ) {
535 ?>
536 <div class="ui hidden divider"></div>
537 <div class="ui horizontal divider">
538 <?php
539 /**
540 * Filter: mainwp_updates_overview_update_details_divider
541 *
542 * Filters the Update Details divider text in the Updates Overview widget.
543 *
544 * @since 4.1
545 */
546 echo esc_html( apply_filters( 'mainwp_updates_overview_update_details_divider', esc_html__( 'Available Updates', 'mainwp' ) ) );
547 ?>
548 </div>
549 <div class="ui hidden divider"></div>
550 <?php
551 /**
552 * Action: mainwp_updates_overview_before_update_details
553 *
554 * Fires at the top of the Update Details section in the Updates Overview widget.
555 *
556 * @since 4.1
557 */
558 do_action( 'mainwp_updates_overview_before_update_details' );
559
560 /**
561 * Action: mainwp_updates_overview_before_wordpress_updates
562 *
563 * Fires before the WordPress updates section in the Updates Overview widget.
564 *
565 * @since 4.1
566 */
567 do_action( 'mainwp_updates_overview_before_wordpress_updates' );
568
569 $is_demo = MainWP_Demo_Handle::is_demo_mode();
570 ?>
571 <div class="ui grid">
572 <div class="two column row">
573
574 <div class="six wide column">
575 <div class="ui horizontal statistic">
576 <div class="value">
577 <?php echo intval( $total_wp_upgrades ); ?>
578 </div>
579 <div class="label">
580 <?php esc_html_e( 'WordPress', 'mainwp' ); ?>
581 </div>
582 </div>
583 </div>
584
585 <div class="ten wide right aligned column">
586 <div class="ui small buttons">
587 <?php
588 if ( $user_can_update_wordpress ) :
589 $wpcore_update_disabled_by = '';
590 if ( $globalView ) {
591 $detail_wp_up = 'admin.php?page=UpdatesManage&tab=wordpress-updates';
592 } else {
593 $detail_wp_up = 'admin.php?page=managesites&updateid=' . $current_wpid . '&tab=wordpress-updates';
594 $wpcore_update_disabled_by = MainWP_System_Utility::disabled_wpcore_update_by( $current_wpid );
595 }
596 ?>
597 <?php if ( 0 < $total_wp_upgrades ) : ?>
598 <?php MainWP_Updates::set_continue_update_html_selector( 'wpcore_global_upgrade_all' ); ?>
599 <a href="<?php echo esc_url( $detail_wp_up ); ?>" class="ui button"><?php esc_html_e( 'See Details', 'mainwp' ); ?></a>
600 <?php
601 if ( ! empty( $wpcore_update_disabled_by ) ) {
602 ?>
603 <span data-tooltip="<?php echo esc_html( $wpcore_update_disabled_by ); ?>" data-inverted="" data-position="left center"><a href="javascript:void(0)" class="ui button basic green disabled mainwp-update-all-button"><?php esc_html_e( 'Update All', 'mainwp' ); ?></a></span>
604 <?php
605 } elseif ( $is_demo ) {
606 MainWP_Demo_Handle::get_instance()->render_demo_disable_button( '<a href="javascript:void(0)" class="ui green basic button disabled mainwp-update-all-button" disabled="disabled">' . esc_html__( 'Update All', 'mainwp' ) . '</a>' );
607 } else {
608 ?>
609 <a href="#" onClick="return updatesoverview_global_upgrade_all('wp');" class="ui green basic button mainwp-update-all-button <?php MainWP_Updates::get_continue_update_selector(); // phpcs:ignore WordPress.Security.EscapeOutput ?>" data-tooltip="<?php esc_html_e( 'Clicking this button will update WP Core files on All your websites.', 'mainwp' ); ?>" data-inverted="" data-position="top center"><?php esc_html_e( 'Update All', 'mainwp' ); ?></a>
610 <?php
611 }
612 ?>
613 <?php else : ?>
614
615 <a href="<?php echo esc_url( $detail_wp_up ); ?>" class="ui button"><?php esc_html_e( 'See Details', 'mainwp' ); ?></a>
616 <a href="#" class="ui disabled green basic button mainwp-update-all-button"><?php esc_html_e( 'Update All', 'mainwp' ); ?></a>
617
618 <?php endif; ?>
619 <?php endif; ?>
620 </div>
621 </div>
622 </div>
623 </div>
624 <?php
625 /**
626 * Action: mainwp_updates_overview_after_wordpress_updates
627 *
628 * Fires after the WordPress updates section in the Updates Overview widget.
629 *
630 * @since 4.1
631 */
632 do_action( 'mainwp_updates_overview_after_wordpress_updates' );
633 }
634
635 /**
636 * Render Plugins update detail.
637 *
638 * @param bool true|false $user_can_update_plugins permission to update.
639 * @param int $total_plugin_upgrades total number of update.
640 * @param bool true|false $globalView global view or not.
641 * @param int $current_wpid current site id.
642 *
643 * @uses \MainWP\Dashboard\MainWP_Updates::set_continue_update_html_selector()
644 * @uses \MainWP\Dashboard\MainWP_Updates::get_continue_update_selector()
645 */
646 public static function render_plugins_update( $user_can_update_plugins, $total_plugin_upgrades, $globalView, $current_wpid ) {
647 /**
648 * Action: mainwp_updates_overview_before_plugin_updates
649 *
650 * Fires before the Plugin updates section in the Updates Overview widget.
651 *
652 * @since 4.1
653 */
654 do_action( 'mainwp_updates_overview_before_plugin_updates' );
655 $is_demo = MainWP_Demo_Handle::is_demo_mode();
656 ?>
657 <div class="ui grid">
658 <div class="two column row">
659 <div class="six wide column">
660 <div class="ui horizontal statistic">
661 <div class="value">
662 <?php echo intval( $total_plugin_upgrades ); ?>
663 </div>
664 <div class="label">
665 <?php esc_html_e( 'Plugins', 'mainwp' ); ?>
666 </div>
667 </div>
668 </div>
669 <div class="ten wide right aligned column">
670 <div class="ui small buttons">
671 <?php
672 if ( $user_can_update_plugins ) {
673 MainWP_Updates::set_continue_update_html_selector( 'plugins_global_upgrade_all' );
674 if ( $globalView ) {
675 $detail_plugins_up = 'admin.php?page=UpdatesManage&tab=plugins-updates';
676 $update_all_tooltip = esc_html__( 'Clicking this button will update all Plugins on All your websites.', 'mainwp' );
677 } else {
678 $detail_plugins_up = 'admin.php?page=managesites&updateid=' . $current_wpid . '&tab=plugins-updates';
679 $update_all_tooltip = esc_html__( 'Clicking this button will update all Plugins on the website.', 'mainwp' );
680 }
681
682 if ( empty( $total_plugin_upgrades ) ) {
683 ?>
684 <a href="<?php echo esc_url( $detail_plugins_up ); ?>" class="ui button"><?php esc_html_e( 'See Details', 'mainwp' ); ?></a>
685 <a href="#" class="ui disabled green basic button mainwp-update-all-button"><?php esc_html_e( 'Update All', 'mainwp' ); ?></a>
686 <?php
687 } else {
688 ?>
689 <a href="<?php echo esc_url( $detail_plugins_up ); ?>" class="ui button"><?php esc_html_e( 'See Details', 'mainwp' ); ?></a>
690 <?php
691 if ( $is_demo ) {
692 MainWP_Demo_Handle::get_instance()->render_demo_disable_button( '<a href="javascript:void(0)" class="ui basic green button mainwp-update-all-button disabled" disabled="disabled">' . esc_html__( 'Update All', 'mainwp' ) . '</a>' );
693 } else {
694 ?>
695 <a href="#" onClick="return updatesoverview_global_upgrade_all('plugin');" class="ui basic green mainwp-update-all-button button <?php MainWP_Updates::get_continue_update_selector(); // phpcs:ignore WordPress.Security.EscapeOutput ?>" data-tooltip="<?php echo esc_attr( $update_all_tooltip ); ?>" data-inverted="" data-position="top center"><?php esc_html_e( 'Update All', 'mainwp' ); ?></a>
696 <?php
697 }
698 }
699 }
700 ?>
701 </div>
702 </div>
703 </div>
704 </div>
705 <?php
706 /**
707 * Action: mainwp_updates_overview_after_plugin_updates
708 *
709 * Fires after the Plugin updates section in the Updates Overview widget.
710 *
711 * @since 4.1
712 */
713 do_action( 'mainwp_updates_overview_after_plugin_updates' );
714 }
715
716 /**
717 * Render Themes update detail.
718 *
719 * @param bool true|false $user_can_update_themes permission to update.
720 * @param int $total_theme_upgrades total number of update.
721 * @param bool true|false $globalView global view or not.
722 * @param int $current_wpid current site id.
723 *
724 * @uses \MainWP\Dashboard\MainWP_Updates::set_continue_update_html_selector()
725 * @uses \MainWP\Dashboard\MainWP_Updates::get_continue_update_selector()
726 */
727 public static function render_themes_update( $user_can_update_themes, $total_theme_upgrades, $globalView, $current_wpid ) {
728 /**
729 * Action: mainwp_updates_overview_before_theme_updates
730 *
731 * Fires before the Theme updates section in the Updates Overview widget.
732 *
733 * @since 4.1
734 */
735 do_action( 'mainwp_updates_overview_before_theme_updates' );
736 $is_demo = MainWP_Demo_Handle::is_demo_mode();
737 ?>
738 <div class="ui grid">
739 <div class="two column row">
740 <div class="six wide column">
741 <div class="ui horizontal statistic">
742 <div class="value">
743 <?php echo intval( $total_theme_upgrades ); ?>
744 </div>
745 <div class="label">
746 <?php esc_html_e( 'Themes', 'mainwp' ); ?>
747 </div>
748 </div>
749 </div>
750 <div class="ten wide right aligned column">
751 <div class="ui small buttons">
752 <?php
753 if ( $user_can_update_themes ) {
754 MainWP_Updates::set_continue_update_html_selector( 'themes_global_upgrade_all' );
755 if ( $globalView ) {
756 $detail_themes_up = 'admin.php?page=UpdatesManage&tab=themes-updates';
757 } else {
758 $detail_themes_up = 'admin.php?page=managesites&updateid=' . $current_wpid . '&tab=themes-updates';
759 }
760 if ( empty( $total_theme_upgrades ) ) {
761 ?>
762 <a href="<?php echo esc_url( $detail_themes_up ); ?>" class="ui button"><?php esc_html_e( 'See Details', 'mainwp' ); ?></a>
763 <a href="#" class="ui disabled green basic mainwp-update-all-button button"><?php esc_html_e( 'Update All', 'mainwp' ); ?></a>
764 <?php
765 } else {
766 ?>
767 <a href="<?php echo esc_url( $detail_themes_up ); ?>" class="ui button"><?php esc_html_e( 'See Details', 'mainwp' ); ?></a>
768 <?php
769 if ( $is_demo ) {
770 MainWP_Demo_Handle::get_instance()->render_demo_disable_button( '<a href="javascript:void(0)" class="ui basic green button mainwp-update-all-button disabled" disabled="disabled">' . esc_html__( 'Update All', 'mainwp' ) . '</a>' );
771 } else {
772 ?>
773 <a href="#" onClick="return updatesoverview_global_upgrade_all('theme');" class="ui basic green mainwp-update-all-button button <?php MainWP_Updates::get_continue_update_selector(); // phpcs:ignore WordPress.Security.EscapeOutput ?>" data-tooltip="<?php esc_html_e( 'Clicking this button will update all Themes on All your websites.', 'mainwp' ); ?>" data-inverted="" data-position="top center"><?php esc_html_e( 'Update All', 'mainwp' ); ?></a>
774 <?php
775 }
776 }
777 }
778 ?>
779 </div>
780 </div>
781 </div>
782 </div>
783 <?php
784 /**
785 * Action: mainwp_updates_overview_after_theme_updates
786 *
787 * Fires after the Theme updates section in the Updates Overview widget.
788 *
789 * @since 4.1
790 */
791 do_action( 'mainwp_updates_overview_after_theme_updates' );
792 }
793 /**
794 * Render language update details.
795 *
796 * @param bool $user_can_update_translation Permission to update.
797 * @param int $total_translation_upgrades Total number of update.
798 * @param bool $globalView Global view or not.
799 * @param int $current_wpid Current site id.
800 *
801 * @uses \MainWP\Dashboard\MainWP_Updates::set_continue_update_html_selector()
802 * @uses \MainWP\Dashboard\MainWP_Updates::get_continue_update_selector()
803 */
804 public static function render_language_update( $user_can_update_translation, $total_translation_upgrades, $globalView, $current_wpid ) {
805 /**
806 * Action: mainwp_updates_overview_before_translation_updates
807 *
808 * Fires before the Translation updates section in the Updates Overview widget.
809 *
810 * @since 4.1
811 */
812 do_action( 'mainwp_updates_overview_before_translation_updates' );
813 $is_demo = MainWP_Demo_Handle::is_demo_mode();
814 ?>
815 <div class="ui grid">
816 <div class="two column row">
817 <div class="six wide column">
818 <div class="ui horizontal statistic">
819 <div class="value">
820 <?php echo intval( $total_translation_upgrades ); ?>
821 </div>
822 <div class="label">
823 <?php esc_html_e( 'Translations', 'mainwp' ); ?>
824 </div>
825 </div>
826 </div>
827 <div class="ten wide right aligned column">
828 <div class="ui small buttons">
829 <?php
830 if ( $user_can_update_translation ) {
831 MainWP_Updates::set_continue_update_html_selector( 'translations_global_upgrade_all' );
832 if ( $globalView ) {
833 $detail_trans_up = 'admin.php?page=UpdatesManage&tab=translations-updates';
834 } else {
835 $detail_trans_up = 'admin.php?page=managesites&updateid=' . $current_wpid . '&tab=translations-updates';
836 }
837 if ( empty( $total_translation_upgrades ) ) {
838 ?>
839 <a href="<?php echo esc_url( $detail_trans_up ); ?>" class="ui button"><?php esc_html_e( 'See Details', 'mainwp' ); ?></a>
840 <a href="#" class="ui disabled green basic mainwp-update-all-button button"><?php esc_html_e( 'Update All', 'mainwp' ); ?></a>
841 <?php
842 } else {
843 ?>
844 <a href="<?php echo esc_url( $detail_trans_up ); ?>" class="ui button"><?php esc_html_e( 'See Details', 'mainwp' ); ?></a>
845 <?php
846 if ( $is_demo ) {
847 MainWP_Demo_Handle::get_instance()->render_demo_disable_button( '<a href="javascript:void(0)" class="ui basic green button mainwp-update-all-button disabled" disabled="disabled">' . esc_html__( 'Update All', 'mainwp' ) . '</a>' );
848 } else {
849 ?>
850 <a href="#" onClick="return updatesoverview_global_upgrade_all('translation');" class="ui basic green mainwp-update-all-button button <?php MainWP_Updates::get_continue_update_selector(); // phpcs:ignore WordPress.Security.EscapeOutput ?>" data-tooltip="<?php esc_html_e( 'Clicking this button will update all Translations on All your websites.', 'mainwp' ); ?>" data-inverted="" data-position="top center"><?php esc_html_e( 'Update All', 'mainwp' ); ?></a>
851 <?php
852 }
853 }
854 }
855 ?>
856 </div>
857 </div>
858 </div>
859 </div>
860 <?php
861 /**
862 * Action: mainwp_updates_overview_after_translation_updates
863 *
864 * Fires after the Translation updates section in the Updates Overview widget.
865 *
866 * @since 4.1
867 */
868 do_action( 'mainwp_updates_overview_after_translation_updates' );
869
870 /**
871 * Action: mainwp_updates_overview_after_update_details
872 *
873 * Fires at the bottom of the Update Details section in the Updates Overview widget.
874 *
875 * @since 4.1
876 */
877 do_action( 'mainwp_updates_overview_after_update_details' );
878 }
879
880 /**
881 * Render abandoned plugins detail.
882 *
883 * @param int $total_plugins_outdate total number of update.
884 * @param bool $globalView global view or not.
885 * @param int $current_wpid current site id.
886 */
887 public static function render_abandoned_plugins( $total_plugins_outdate, $globalView, $current_wpid ) {
888 ?>
889 <div class="ui hidden divider"></div>
890 <div class="ui horizontal divider">
891 <?php
892 /**
893 * Filter: mainwp_updates_overview_abandoned_plugins_themes_divider
894 *
895 * Filters the Abandoned Plugins & Themes divider text in the Updates Overview widget.
896 *
897 * @since 4.1
898 */
899 echo esc_html( apply_filters( 'mainwp_updates_overview_abandoned_plugins_themes_divider', esc_html__( 'Abandoned Plugins & Themes', 'mainwp' ) ) );
900 ?>
901 </div>
902 <div class="ui hidden divider"></div>
903 <?php
904 /**
905 * Action: mainwp_updates_overview_before_abandoned_plugins_themes
906 *
907 * Fires at the top of the Abandoned Plugins & Themes section in the Updates Overview widget.
908 *
909 * @since 4.1
910 */
911 do_action( 'mainwp_updates_overview_before_abandoned_plugins_themes' );
912 ?>
913 <div class="ui grid">
914 <div class="two column row">
915 <div class="six wide column">
916 <div class="ui horizontal statistic">
917 <?php
918 if ( $globalView ) {
919 $detail_aban_plugins = 'admin.php?page=UpdatesManage&tab=abandoned-plugins';
920 } else {
921 $detail_aban_plugins = 'admin.php?page=managesites&updateid=' . $current_wpid . '&tab=abandoned-plugins';
922 }
923 ?>
924 <div class="value">
925 <?php echo intval( $total_plugins_outdate ); ?>
926 </div>
927 <div class="label">
928 <?php esc_html_e( 'Plugins', 'mainwp' ); ?>
929 </div>
930 </div>
931 </div>
932 <div class="ten wide right aligned column">
933 <a href="<?php echo esc_url( $detail_aban_plugins ); ?>" class="ui button"><?php esc_html_e( 'See Details', 'mainwp' ); ?></a>
934 </div>
935 </div>
936 </div>
937 <?php
938 }
939
940 /**
941 * Render abandoned themes detail.
942 *
943 * @param int $total_themes_outdate Total number of update.
944 * @param bool $globalView global View or not.
945 * @param int $current_wpid Current site ID.
946 */
947 public static function render_abandoned_themes( $total_themes_outdate, $globalView, $current_wpid ) {
948 ?>
949 <div class="ui grid">
950 <div class="two column row">
951 <div class="six wide column">
952 <div class="ui horizontal statistic">
953 <?php
954 if ( $globalView ) {
955 $detail_aban_themes = 'admin.php?page=UpdatesManage&tab=abandoned-themes';
956 } else {
957 $detail_aban_themes = 'admin.php?page=managesites&updateid=' . $current_wpid . '&tab=abandoned-themes';
958 }
959 ?>
960 <div class="value">
961 <?php echo intval( $total_themes_outdate ); ?>
962 </div>
963 <div class="label">
964 <?php esc_html_e( 'Themes', 'mainwp' ); ?>
965 </div>
966 </div>
967 </div>
968 <div class="ten wide right aligned column">
969 <a href="<?php echo esc_url( $detail_aban_themes ); ?>" class="ui button"><?php esc_html_e( 'See Details', 'mainwp' ); ?></a>
970 </div>
971 </div>
972 </div>
973 <?php
974 /**
975 * Action: mainwp_updates_overview_after_abandoned_plugins_themes
976 *
977 * Fires at the bottom of the Abandoned Plugins & Themes section in the Updates Overview widget.
978 *
979 * @since 4.1
980 */
981 do_action( 'mainwp_updates_overview_after_abandoned_plugins_themes' );
982 }
983
984 /**
985 * Method render_global_update()
986 *
987 * Render global updates.
988 *
989 * @param bool $user_can_update_wordpress Permission to update WordPress.
990 * @param int $total_wp_upgrades Total WordPress update.
991 * @param array $all_wp_updates All WordPress update list.
992 *
993 * @param bool $user_can_update_plugins permission to update plugings.
994 * @param int $total_plugin_upgrades total WordPress update.
995 * @param array $all_plugins_updates all WordPress update list.
996 *
997 * @param bool $user_can_update_themes permission to update themes.
998 * @param int $total_theme_upgrades total themes update.
999 * @param mixed $all_themes_updates all themes update list.
1000 *
1001 * @param mixed $mainwp_show_language_updates MainWP Language Updates.
1002 * @param bool $user_can_update_translation permission to update languages.
1003 * @param int $total_translation_upgrades total WordPress update.
1004 * @param mixed $all_translations_updates all transations update list.
1005 */
1006 public static function render_global_update(
1007 $user_can_update_wordpress,
1008 $total_wp_upgrades,
1009 $all_wp_updates,
1010 $user_can_update_plugins,
1011 $total_plugin_upgrades,
1012 $all_plugins_updates,
1013 $user_can_update_themes,
1014 $total_theme_upgrades,
1015 $all_themes_updates,
1016 $mainwp_show_language_updates,
1017 $user_can_update_translation,
1018 $total_translation_upgrades,
1019 $all_translations_updates
1020 ) {
1021 ?>
1022 <div style="display: none">
1023
1024 <div id="wp_upgrades">
1025 <?php
1026 if ( $user_can_update_wordpress && $total_wp_upgrades > 0 ) {
1027 foreach ( $all_wp_updates as $item ) {
1028 ?>
1029 <div updated="0" site_id="<?php echo intval( $item['id'] ); ?>" site_name="<?php echo esc_attr( $item['name'] ); ?>" ></div>
1030 <?php
1031 }
1032 }
1033 ?>
1034 </div>
1035
1036 <div id="wp_plugin_upgrades">
1037 <?php
1038 if ( $user_can_update_plugins && $total_plugin_upgrades > 0 ) {
1039 foreach ( $all_plugins_updates as $item ) {
1040 ?>
1041 <div updated="0" site_id="<?php echo intval( $item['id'] ); ?>" site_name="<?php echo esc_attr( $item['name'] ); ?>" plugin_slug="<?php echo esc_attr( $item['plugin_slug'] ); ?>" ></div>
1042 <?php
1043 }
1044 }
1045 ?>
1046 </div>
1047 <div id="wp_theme_upgrades">
1048
1049 <?php
1050 if ( $user_can_update_themes && $total_theme_upgrades > 0 ) {
1051 foreach ( $all_themes_updates as $item ) {
1052 ?>
1053 <div updated="0" site_id="<?php echo intval( $item['id'] ); ?>" site_name="<?php echo esc_attr( $item['name'] ); ?>" theme_slug="<?php echo esc_attr( $item['theme_slug'] ); ?>" ></div>
1054 <?php
1055 }
1056 }
1057 ?>
1058
1059 </div>
1060 <?php if ( 1 === (int) $mainwp_show_language_updates ) : ?>
1061 <div id="wp_translation_upgrades">
1062
1063 <?php
1064 if ( $user_can_update_translation && $total_translation_upgrades > 0 ) {
1065 foreach ( $all_translations_updates as $item ) {
1066 ?>
1067 <div updated="0" site_id="<?php echo intval( $item['id'] ); ?>" site_name="<?php echo esc_attr( $item['name'] ); ?>" translation_slug="<?php echo esc_attr( $item['translation_slug'] ); ?>" ></div>
1068 <?php
1069 }
1070 }
1071 ?>
1072 </div>
1073 <?php endif; ?>
1074 </div>
1075 <?php
1076 }
1077
1078 /**
1079 * Render bottom of widget.
1080 *
1081 * @param object $websites Object containing child sites info.
1082 * @param bool $globalView Whether it's global or individual site view.
1083 *
1084 * @uses \MainWP\Dashboard\MainWP_DB::fetch_object()
1085 * @uses \MainWP\Dashboard\MainWP_DB::data_seek()
1086 * @uses \MainWP\Dashboard\MainWP_DB::free_result()
1087 */
1088 public static function render_bottom( $websites, $globalView ) {
1089
1090 MainWP_DB::data_seek( $websites, 0 );
1091
1092 $site_ids = array();
1093 while ( $websites && ( $website = MainWP_DB::fetch_object( $websites ) ) ) {
1094 $site_ids[] = $website->id;
1095 }
1096
1097 /**
1098 * Action: mainwp_updatesoverview_widget_bottom
1099 *
1100 * Fires at the bottom of the Updates Overview widgets.
1101 *
1102 * @param array $side_ids Array of sites IDs.
1103 * @param bool $globalView Whether it's global or individual site view.
1104 *
1105 * @since 4.0
1106 */
1107 do_action( 'mainwp_updatesoverview_widget_bottom', $site_ids, $globalView );
1108 ?>
1109 <div class="ui modal" id="updatesoverview-backup-box" tabindex="0">
1110 <div class="header"><?php esc_html_e( 'Backup Check', 'mainwp' ); ?></div>
1111 <div class="scrolling content mainwp-modal-content"></div>
1112 <div class="actions mainwp-modal-actions">
1113 <input id="updatesoverview-backup-all" type="button" name="Backup All" value="<?php esc_html_e( 'Backup All', 'mainwp' ); ?>" class="button-primary"/>
1114 <a id="updatesoverview-backup-now" href="#" target="_blank" style="display: none" class="button-primary button"><?php esc_html_e( 'Backup Now', 'mainwp' ); ?></a>&nbsp;
1115 <input id="updatesoverview-backup-ignore" type="button" name="Ignore" value="<?php esc_html_e( 'Ignore', 'mainwp' ); ?>" class="button"/>
1116 </div>
1117 </div>
1118
1119 <?php
1120 MainWP_DB::free_result( $websites );
1121 }
1122
1123 /**
1124 * Method dismiss_sync_errors()
1125 *
1126 * @param bool $dismiss true|false.
1127 *
1128 * @return bool true
1129 */
1130 public static function dismiss_sync_errors( $dismiss = true ) {
1131 global $current_user;
1132 update_user_option( $current_user->ID, 'mainwp_syncerrors_dismissed', $dismiss );
1133
1134 return true;
1135 }
1136
1137 /**
1138 * Method checkbackups()
1139 *
1140 * Check if Child Site needs to be backed up before updates.
1141 *
1142 * @return mixed $output
1143 *
1144 * @uses \MainWP\Dashboard\MainWP_Backup_Handler::is_archive()
1145 * @uses \MainWP\Dashboard\MainWP_DB::get_website_by_id()
1146 * @uses \MainWP\Dashboard\MainWP_DB::get_website_option()
1147 * @uses \MainWP\Dashboard\MainWP_System_Utility::get_primary_backup()
1148 * @uses \MainWP\Dashboard\MainWP_System_Utility::get_mainwp_specific_dir()
1149 */
1150 public static function check_backups() {
1151 if ( empty( $_POST['sites'] ) || ! is_array( $_POST['sites'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
1152 return true;
1153 }
1154
1155 $primaryBackup = MainWP_System_Utility::get_primary_backup();
1156 $global_backup_before_upgrade = get_option( 'mainwp_backup_before_upgrade' );
1157
1158 $mainwp_backup_before_upgrade_days = get_option( 'mainwp_backup_before_upgrade_days' );
1159 if ( empty( $mainwp_backup_before_upgrade_days ) || ! ctype_digit( $mainwp_backup_before_upgrade_days ) ) {
1160 $mainwp_backup_before_upgrade_days = 7;
1161 }
1162
1163 $output = array();
1164 if ( isset( $_POST['sites'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
1165 foreach ( array_map( 'sanitize_text_field', wp_unslash( $_POST['sites'] ) ) as $siteId ) { // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
1166 $website = MainWP_DB::instance()->get_website_by_id( $siteId );
1167 if ( ( 0 === (int) $website->backup_before_upgrade ) || ( ( 2 === (int) $website->backup_before_upgrade ) && empty( $global_backup_before_upgrade ) ) ) {
1168 continue;
1169 }
1170
1171 if ( ! empty( $primaryBackup ) ) {
1172 $lastBackup = MainWP_DB::instance()->get_website_option( $website, 'primary_lasttime_backup' );
1173
1174 if ( -1 !== $lastBackup ) { // installed backup plugin.
1175 $output['sites'][ $siteId ] = ( $lastBackup < ( time() - ( $mainwp_backup_before_upgrade_days * 24 * 60 * 60 ) ) ? false : true );
1176 }
1177 $output['primary_backup'] = $primaryBackup;
1178 } else {
1179 $dir = MainWP_System_Utility::get_mainwp_specific_dir( $siteId );
1180 // Check if backup ok.
1181 $lastBackup = - 1;
1182 if ( file_exists( $dir ) ) {
1183 $dh = opendir( $dir );
1184 if ( $dh ) {
1185 while ( false !== ( $file = readdir( $dh ) ) ) {
1186 if ( '.' !== $file && '..' !== $file ) {
1187 $theFile = $dir . $file;
1188 if ( MainWP_Backup_Handler::is_archive( $file ) && ! MainWP_Backup_Handler::is_sql_archive( $file ) && ( filemtime( $theFile ) > $lastBackup ) ) {
1189 $lastBackup = filemtime( $theFile );
1190 }
1191 }
1192 }
1193 closedir( $dh );
1194 }
1195 }
1196
1197 $output['sites'][ $siteId ] = ( $lastBackup < ( time() - ( $mainwp_backup_before_upgrade_days * 24 * 60 * 60 ) ) ? false : true );
1198 }
1199 }
1200 }
1201
1202 return $output;
1203 }
1204 }
1205