38217-vm/wp-content/plugins/mainwp/pages/page-mainwp-updates.php
2026-02-05 17:08:59 +03:00

2583 lines
138 KiB
PHP

<?php
/**
* MainWP Updates Page.
*
* @package MainWP/Dashboard
*/
namespace MainWP\Dashboard;
/**
* Class MainWP_Updates
*
* @package MainWP\Dashboard
*/
class MainWP_Updates { // phpcs:ignore Generic.Classes.OpeningBraceSameLine.ContentAfterBrace -- NOSONAR.
/**
* User can ignore updates.
*
* @var bool $user_can_ignore_updates User can ignore updates.
*/
public static $user_can_ignore_updates = null;
/**
* User can update translations.
*
* @var bool $user_can_update_trans User can update translations.
*/
public static $user_can_update_trans = null;
/**
* User can update WordPress core files.
*
* @var bool $user_can_update_wp User can update WordPress core files.
*/
public static $user_can_update_wp = null;
/**
* User can update themes.
*
* @var bool $user_can_update_themes User can update themes.
*/
public static $user_can_update_themes = null;
/**
* User can update plugins.
*
* @var bool $user_can_update_plugins User can update plugins.
*/
public static $user_can_update_plugins = null;
/**
* Placeholder for continue selector.
*
* @var string $continue_selector Placeholder for continue selector.
*/
public static $continue_selector = '';
/**
* Placeholder for continue update.
*
* @var string $continue_update Placeholder for continue update.
*/
public static $continue_update = '';
/**
* Placeholder for continue update slug.
*
* @var string $continue_update_slug Placeholder for continue update slug.
*/
public static $continue_update_slug = '';
/**
* Public static varable to hold Subpages information.
*
* @var array $subPages
*/
public static $subPages;
/**
* Current page.
*
* @static
* @var string $page Current page.
*/
public static $page;
/**
* Gets Class Name.
*
* @return object
*/
public static function get_class_name() {
return __CLASS__;
}
/**
* Instantiates MainWP Updates Page.
*
* @uses \MainWP\Dashboard\MainWP_Post::get_class_name()
*/
public static function init() {
/**
* This hook allows you to render the Post page header via the 'mainwp-pageheader-updates' action.
*
* This hook is normally used in the same context of 'mainwp-getsubpages-updates'
*
* @see \MainWP_Updates::render_header
*/
add_action( 'mainwp-pageheader-updates', array( MainWP_Post::get_class_name(), 'render_header' ) );
/**
* This hook allows you to render the Updates page footer via the 'mainwp-pagefooter-updates' action.
*
* This hook is normally used in the same context of 'mainwp-getsubpages-updates'
*
* @see \MainWP_Updates::render_footer
*/
add_action( 'mainwp-pagefooter-updates', array( MainWP_Post::get_class_name(), 'render_footer' ) );
add_action( 'mainwp_help_sidebar_content', array( static::get_class_name(), 'mainwp_help_content' ) );
add_action( 'admin_init', array( static::get_class_name(), 'admin_init' ) );
}
/**
* Init method.
*/
public static function admin_init() {
static::handle_post_staging_sites_view();
}
/**
* Renders init updates menu.
*
* @uses \MainWP\Dashboard\MainWP_Menu::add_left_menu()
*/
public static function init_menu() {
static::init_left_menu( static::$subPages );
add_action( 'load-' . static::$page, array( static::get_class_name(), 'on_load_page' ) );
}
/**
* Initiates Updates menu.
*
* @param array $subPages Sub pages array.
*
* @uses \MainWP\Dashboard\MainWP_Menu::add_left_menu()
* @uses \MainWP\Dashboard\MainWP_Menu::init_subpages_left_menu()
* @uses \MainWP\Dashboard\MainWP_Menu::is_disable_menu_item()
*/
public static function init_left_menu( $subPages = array() ) {
static::$page = add_submenu_page(
'mainwp_tab',
__( 'Updates', 'mainwp' ),
'<span id="mainwp-Updates">' . esc_html__( 'Updates', 'mainwp' ) . '</span>',
'read',
'UpdatesManage',
array(
static::get_class_name(),
'render',
)
);
$updates_count = MainWP_Common_Handler::instance()->sites_available_updates_count();
$label_color_plugins = '';
$label_color_themes = '';
$label_color_wp = '';
$label_color_translations = '';
$label_color_total = '';
if ( isset( $updates_count['plugins'] ) && 0 < $updates_count['plugins'] ) {
$label_color_plugins = ' blue ';
}
if ( isset( $updates_count['wp'] ) && 0 < $updates_count['wp'] ) {
$label_color_wp = ' blue ';
}
if ( isset( $updates_count['themes'] ) && 0 < $updates_count['themes'] ) {
$label_color_themes = ' blue ';
}
if ( isset( $updates_count['translations'] ) && 0 < $updates_count['translations'] ) {
$label_color_translations = ' blue ';
}
if ( isset( $updates_count['total'] ) && 0 < $updates_count['total'] ) {
$label_color_total = ' blue ';
}
MainWP_Menu::add_left_menu(
array(
'title' => esc_html__( 'Updates', 'mainwp' ) . ' <span class="ui ' . $label_color_total . ' mini label">' . intval( $updates_count['total'] ) . '</span>',
'parent_key' => 'managesites',
'slug' => 'UpdatesManage',
'href' => 'admin.php?page=UpdatesManage',
'icon' => '<i class="sync icon"></i>',
'desc' => 'Manage updates on your child sites',
'leftsub_order' => 4,
),
1
);
$init_sub_subleftmenu = array(
array(
'title' => esc_html__( 'Plugins', 'mainwp' ) . ' <span class="ui ' . $label_color_plugins . ' label">' . intval( $updates_count['plugins'] ) . '</span>',
'parent_key' => 'UpdatesManage',
'href' => 'admin.php?page=UpdatesManage&tab=plugins-updates',
'slug' => 'UpdatesManage',
'right' => '',
),
array(
'title' => esc_html__( 'Themes', 'mainwp' ) . ' <span class="ui ' . $label_color_themes . ' label">' . intval( $updates_count['themes'] ) . '</span>',
'parent_key' => 'UpdatesManage',
'href' => 'admin.php?page=UpdatesManage&tab=themes-updates',
'slug' => 'UpdatesManage',
'right' => '',
),
array(
'title' => esc_html__( 'WordPress', 'mainwp' ) . ' <span class="ui ' . $label_color_wp . ' label">' . intval( $updates_count['wp'] ) . '</span>',
'parent_key' => 'UpdatesManage',
'href' => 'admin.php?page=UpdatesManage&tab=wordpress-updates',
'slug' => 'UpdatesManage&tab=wordpress-updates',
'right' => '',
'active_params' => array( 'tab' => 'updates-ignore' ),
),
array(
'title' => esc_html__( 'Updates Ignore', 'mainwp' ),
'parent_key' => 'UpdatesManage',
'slug' => 'UpdatesManage&tab=updates-ignore',
'href' => '', // fix warning.
'menu_hidden' => true,
),
);
$show_language_updates = get_option( 'mainwp_show_language_updates', 1 );
if ( $show_language_updates ) {
$init_sub_subleftmenu[] = array(
'title' => esc_html__( 'Translation', 'mainwp' ) . ' <span class="ui ' . $label_color_translations . ' label">' . intval( $updates_count['translations'] ) . '</span>',
'parent_key' => 'UpdatesManage',
'href' => 'admin.php?page=UpdatesManage&tab=translations-updates',
'slug' => 'UpdatesManage&tab=translations-updates',
'right' => '',
);
}
$init_sub_subleftmenu = apply_filters( 'mainwp_sub_leftmenu_updates', $init_sub_subleftmenu );
MainWP_Menu::init_subpages_left_menu( $subPages, $init_sub_subleftmenu, 'UpdatesManage', 'UpdatesManage' );
foreach ( $init_sub_subleftmenu as $item ) {
if ( MainWP_Menu::is_disable_menu_item( 3, $item['slug'] ) ) {
continue;
}
MainWP_Menu::add_left_menu( $item, 2 );
}
}
/**
* Method on_load_page()
*
* Run on page load.
*/
public static function on_load_page() {
add_filter( 'mainwp_header_actions_right', array( static::get_class_name(), 'screen_options' ), 10, 2 );
}
/**
* Method screen_options()
*
* Create Page Settings button.
*
* @param mixed $input Page Settings button HTML.
*
* @return mixed Page Settings button.
*/
public static function screen_options( $input ) {
return $input .
'<a class="ui button basic icon" onclick="mainwp_manage_updates_screen_options(); return false;" data-inverted="" data-position="bottom right" href="#" target="_blank" data-tooltip="' . esc_html__( 'Page Settings', 'mainwp' ) . '">
<i class="cog icon"></i>
</a>';
}
/**
* Sets the MainWP Update page page title and pass it off to method MainWP_UI::render_top_header().
*
* @uses \MainWP\Dashboard\MainWP_UI::render_top_header()
*/
public static function render_header() {
$params = array(
'title' => esc_html__( 'Available Updates', 'mainwp' ),
);
MainWP_UI::render_top_header( $params );
}
/**
* Closes the page container.
*/
public static function render_footer() {
echo '</div>';
}
/**
* Generates individual site overview page link.
*
* @param object $website The site object.
* @param bool $echo_out Either echo or not.
*
* @return string Dashboard link.
*/
public static function render_site_link_dashboard( $website, $echo_out = true ) {
$lnk = '<a href="' . esc_url( admin_url( 'admin.php?page=managesites&dashboard=' . $website->id ) ) . '" data-inverted="" data-tooltip="' . esc_html__( 'Visit this dashboard.', 'mainwp' ) . '">' . stripslashes( $website->name ) . '</a>';
if ( $echo_out ) {
echo $lnk; // phpcs:ignore WordPress.Security.EscapeOutput
} else {
return $lnk;
}
}
/**
* Checks if the current user has permission to uignore updates.
*
* @return bool Whether user can ignore updates or not.
*/
public static function user_can_ignore_updates() {
if ( null === static::$user_can_ignore_updates ) {
static::$user_can_ignore_updates = \mainwp_current_user_can( 'dashboard', 'ignore_unignore_updates' );
}
return static::$user_can_ignore_updates;
}
/**
* Checks if the current user has permission to update translations.
*
* @return bool Whether user can update translations or not.
*/
public static function user_can_update_trans() {
if ( null === static::$user_can_update_trans ) {
static::$user_can_update_trans = \mainwp_current_user_can( 'dashboard', 'update_translations' );
}
return static::$user_can_update_trans;
}
/**
* Checks if the current user has permission to update WordPress core files.
*
* @return bool Whether user can update WordPress or not.
*/
public static function user_can_update_wp() {
if ( null === static::$user_can_update_wp ) {
static::$user_can_update_wp = \mainwp_current_user_can( 'dashboard', 'update_wordpress' );
}
return static::$user_can_update_wp;
}
/**
* Checks if the current user has permission to update themes.
*
* @return bool Whether user can update themes or not.
*/
public static function user_can_update_themes() {
if ( null === static::$user_can_update_themes ) {
static::$user_can_update_themes = \mainwp_current_user_can( 'dashboard', 'update_themes' );
}
return static::$user_can_update_themes;
}
/**
* Checks if the current user has permission to update plugins.
*
* @return bool Whether user can update plugins or not.
*/
public static function user_can_update_plugins() {
if ( null === static::$user_can_update_plugins ) {
static::$user_can_update_plugins = \mainwp_current_user_can( 'dashboard', 'update_plugins' );
}
return static::$user_can_update_plugins;
}
/**
* Renders updates page.
*
* @param string $abandoned_tab Render abandoned plugins|themes tab, abandoned_plugins|abandoned_themes.
*
* @uses \MainWP\Dashboard\MainWP_DB_Common::get_user_extension()
* @uses \MainWP\Dashboard\MainWP_DB_Common::get_groups_for_current_user()
* @uses \MainWP\Dashboard\MainWP_DB::get_websites_by_group_id()
* @uses \MainWP\Dashboard\MainWP_DB::get_website_option()
* @uses \MainWP\Dashboard\MainWP_DB::fetch_object()
* @uses \MainWP\Dashboard\MainWP_DB::data_seek()
* @uses \MainWP\Dashboard\MainWP_Utility::array_sort()
*/
public static function render( $abandoned_tab = '' ) { // phpcs:ignore Generic.Metrics.CyclomaticComplexity -- NOSONAR - current complexity is the only way to achieve desired results, pull request solutions appreciated.
static::handle_limit_sites();
$websites = static::get_sites_for_current_user();
$userExtension = MainWP_DB_Common::instance()->get_user_extension();
$site_view = (int) $userExtension->site_view;
$site_offset_for_groups = array();
$all_groups = array();
$sites_in_groups = array();
$all_groups_sites = array();
if ( MAINWP_VIEW_PER_GROUP === $site_view ) {
$groups = MainWP_DB_Common::instance()->get_groups_for_current_user();
foreach ( $groups as $group ) {
$all_groups[ $group->id ] = $group->name;
}
foreach ( $all_groups as $group_id => $group_name ) {
$all_groups_sites[ $group_id ] = array();
$group_sites = MainWP_DB::instance()->get_websites_by_group_id( $group_id );
foreach ( $group_sites as $site ) {
if ( ! isset( $sites_in_groups[ $site->id ] ) ) {
$sites_in_groups[ $site->id ] = 1;
}
$all_groups_sites[ $group_id ][] = $site->id;
}
unset( $group_sites );
}
$sites_not_in_groups = array();
$pos = 0;
MainWP_DB::data_seek( $websites, 0 );
while ( $websites && ( $website = MainWP_DB::fetch_object( $websites ) ) ) {
$site_offset_for_groups[ $website->id ] = $pos;
++$pos;
if ( ! isset( $sites_in_groups[ $website->id ] ) ) {
$sites_not_in_groups[] = $website->id;
}
}
if ( ! empty( $sites_not_in_groups ) ) {
$all_groups_sites[0] = $sites_not_in_groups;
$all_groups[0] = esc_html__( 'Others', 'mainwp' );
}
}
$decodedDismissedPlugins = ! empty( $userExtension->dismissed_plugins ) ? json_decode( $userExtension->dismissed_plugins, true ) : array();
$decodedDismissedThemes = ! empty( $userExtension->dismissed_themes ) ? json_decode( $userExtension->dismissed_themes, true ) : array();
$decodedDismissedCores = ! empty( $userExtension->ignored_wp_upgrades ) ? json_decode( $userExtension->ignored_wp_upgrades, true ) : array();
$total_wp_upgrades = 0;
$total_plugin_upgrades = 0;
$total_translation_upgrades = 0;
$total_theme_upgrades = 0;
$total_sync_errors = 0;
$total_plugins_outdate = 0;
$total_themes_outdate = 0;
$allTranslations = array();
$translationsInfo = array();
$allPlugins = array();
$pluginsInfo = array();
$allThemes = array();
$themesInfo = array();
$allPluginsOutdate = array();
$allThemesOutdate = array();
MainWP_DB::data_seek( $websites, 0 );
while ( $websites && ( $website = MainWP_DB::fetch_object( $websites ) ) ) {
$wp_upgrades = ! empty( $website->wp_upgrades ) ? json_decode( $website->wp_upgrades, true ) : array();
$ignored_core_upgrades = ! empty( $website->ignored_wp_upgrades ) ? json_decode( $website->ignored_wp_upgrades, true ) : array();
if ( $website->is_ignoreCoreUpdates || MainWP_Common_Functions::instance()->is_ignored_updates( $wp_upgrades, $ignored_core_upgrades, 'core' ) || MainWP_Common_Functions::instance()->is_ignored_updates( $wp_upgrades, $decodedDismissedCores, 'core' ) ) {
$wp_upgrades = array();
}
if ( is_array( $wp_upgrades ) && ! empty( $wp_upgrades ) ) {
++$total_wp_upgrades;
}
$translation_upgrades = json_decode( $website->translation_upgrades, true );
$plugin_upgrades = json_decode( $website->plugin_upgrades, true );
if ( $website->is_ignorePluginUpdates ) {
$plugin_upgrades = array();
}
$theme_upgrades = json_decode( $website->theme_upgrades, true );
if ( $website->is_ignoreThemeUpdates ) {
$theme_upgrades = array();
}
$decodedPremiumUpgrades = MainWP_DB::instance()->get_website_option( $website, 'premium_upgrades' );
$decodedPremiumUpgrades = ! empty( $decodedPremiumUpgrades ) ? json_decode( $decodedPremiumUpgrades, true ) : array();
if ( is_array( $decodedPremiumUpgrades ) ) {
foreach ( $decodedPremiumUpgrades as $crrSlug => $premiumUpgrade ) {
$premiumUpgrade['premium'] = true;
if ( 'plugin' === $premiumUpgrade['type'] ) {
if ( ! is_array( $plugin_upgrades ) ) {
$plugin_upgrades = array();
}
if ( ! $website->is_ignorePluginUpdates ) {
$premiumUpgrade = array_filter( $premiumUpgrade );
if ( ! isset( $plugin_upgrades[ $crrSlug ] ) ) {
continue; // to fix missing update name.
}
$plugin_upgrades[ $crrSlug ] = array_merge( $plugin_upgrades[ $crrSlug ], $premiumUpgrade );
}
} elseif ( 'theme' === $premiumUpgrade['type'] ) {
if ( ! is_array( $theme_upgrades ) ) {
$theme_upgrades = array();
}
if ( ! $website->is_ignoreThemeUpdates ) {
$theme_upgrades[ $crrSlug ] = $premiumUpgrade;
}
}
}
}
if ( is_array( $translation_upgrades ) ) {
$total_translation_upgrades += count( $translation_upgrades );
}
if ( is_array( $plugin_upgrades ) && ! $website->is_ignorePluginUpdates ) {
$_ignored_plugins = json_decode( $website->ignored_plugins, true );
if ( is_array( $_ignored_plugins ) ) {
$plugin_upgrades = MainWP_Common_Functions::instance()->get_not_ignored_updates_themesplugins( $plugin_upgrades, $_ignored_plugins );
}
$_ignored_plugins = json_decode( $userExtension->ignored_plugins, true );
if ( is_array( $_ignored_plugins ) ) {
$plugin_upgrades = MainWP_Common_Functions::instance()->get_not_ignored_updates_themesplugins( $plugin_upgrades, $_ignored_plugins );
}
$total_plugin_upgrades += count( $plugin_upgrades );
}
if ( is_array( $theme_upgrades ) ) {
$_ignored_themes = json_decode( $website->ignored_themes, true );
if ( is_array( $_ignored_themes ) ) {
$theme_upgrades = MainWP_Common_Functions::instance()->get_not_ignored_updates_themesplugins( $theme_upgrades, $_ignored_themes );
}
$_ignored_themes = json_decode( $userExtension->ignored_themes, true );
if ( is_array( $_ignored_themes ) ) {
$theme_upgrades = MainWP_Common_Functions::instance()->get_not_ignored_updates_themesplugins( $theme_upgrades, $_ignored_themes );
}
$total_theme_upgrades += count( $theme_upgrades );
}
$themesIgnoredAbandoned_perSites = array();
$ignoredAbandoned_themes = MainWP_DB::instance()->get_website_option( $website, 'themes_outdate_dismissed' );
$ignoredAbandoned_themes = ! empty( $ignoredAbandoned_themes ) ? json_decode( $ignoredAbandoned_themes, true ) : array();
if ( is_array( $ignoredAbandoned_themes ) ) {
$ignoredAbandoned_themes = array_filter( $ignoredAbandoned_themes );
$themesIgnoredAbandoned_perSites = array_merge( $themesIgnoredAbandoned_perSites, $ignoredAbandoned_themes );
}
$ignoredAbandoned_plugins = MainWP_DB::instance()->get_website_option( $website, 'plugins_outdate_dismissed' );
$ignoredAbandoned_plugins = ! empty( $ignoredAbandoned_plugins ) ? json_decode( $ignoredAbandoned_plugins, true ) : array();
$plugins_outdate = MainWP_DB::instance()->get_website_option( $website, 'plugins_outdate_info' );
$plugins_outdate = ! empty( $plugins_outdate ) ? json_decode( $plugins_outdate, true ) : array();
$themes_outdate = MainWP_DB::instance()->get_website_option( $website, 'themes_outdate_info' );
$themes_outdate = ! empty( $themes_outdate ) ? json_decode( $themes_outdate, true ) : array();
if ( is_array( $plugins_outdate ) ) {
if ( is_array( $ignoredAbandoned_plugins ) ) {
$plugins_outdate = array_diff_key( $plugins_outdate, $ignoredAbandoned_plugins );
}
if ( is_array( $decodedDismissedPlugins ) ) {
$plugins_outdate = array_diff_key( $plugins_outdate, $decodedDismissedPlugins );
}
$total_plugins_outdate += count( $plugins_outdate );
}
if ( is_array( $themes_outdate ) ) {
if ( is_array( $themesIgnoredAbandoned_perSites ) ) {
$themes_outdate = array_diff_key( $themes_outdate, $themesIgnoredAbandoned_perSites );
}
if ( is_array( $decodedDismissedThemes ) ) {
$themes_outdate = array_diff_key( $themes_outdate, $decodedDismissedThemes );
}
$total_themes_outdate += count( $themes_outdate );
}
// to fix displaying per sites/tags.
if ( is_array( $plugins_outdate ) ) {
foreach ( $plugins_outdate as $slug => $plugin_outdate ) {
$slug = esc_html( $slug );
if ( ! isset( $allPluginsOutdate[ $slug ] ) ) {
$allPluginsOutdate[ $slug ] = array(
'name' => esc_html( $plugin_outdate['Name'] ),
'cnt' => 1,
'uri' => esc_html( $plugin_outdate['PluginURI'] ),
);
} else {
++$allPluginsOutdate[ $slug ]['cnt'];
}
}
}
if ( is_array( $themes_outdate ) ) {
foreach ( $themes_outdate as $slug => $theme_outdate ) {
$slug = esc_html( $slug );
if ( ! isset( $allThemesOutdate[ $slug ] ) ) {
$allThemesOutdate[ $slug ] = array(
'name' => esc_html( $theme_outdate['Name'] ),
'cnt' => 1,
);
} else {
++$allThemesOutdate[ $slug ]['cnt'];
}
}
}
if ( MAINWP_VIEW_PER_PLUGIN_THEME === $site_view ) {
if ( is_array( $translation_upgrades ) ) {
foreach ( $translation_upgrades as $translation_upgrade ) {
$slug = esc_html( $translation_upgrade['slug'] );
if ( ! isset( $allTranslations[ $slug ] ) ) {
$allTranslations[ $slug ] = array(
'name' => isset( $translation_upgrade['name'] ) ? esc_html( $translation_upgrade['name'] ) : $slug,
'cnt' => 1,
);
} else {
++$allTranslations[ $slug ]['cnt'];
}
$translationsInfo[ $slug ] = array(
'name' => isset( $translation_upgrade['name'] ) ? esc_html( $translation_upgrade['name'] ) : $slug,
'slug' => $slug,
'version' => esc_html( $translation_upgrade['version'] ),
);
}
}
if ( is_array( $plugin_upgrades ) ) {
foreach ( $plugin_upgrades as $slug => $plugin_upgrade ) {
if ( ! isset( $allPlugins[ $slug ] ) ) {
$allPlugins[ $slug ] = array(
'name' => esc_html( $plugin_upgrade['Name'] ),
'cnt' => 1,
);
} else {
++$allPlugins[ $slug ]['cnt'];
}
$pluginsInfo[ $slug ] = array(
'name' => esc_html( $plugin_upgrade['Name'] ),
'slug' => isset( $plugin_upgrade['update']['slug'] ) ? esc_html( $plugin_upgrade['update']['slug'] ) : '',
'premium' => ( isset( $plugin_upgrade['premium'] ) ? esc_html( $plugin_upgrade['premium'] ) : 0 ),
'PluginURI' => esc_html( $plugin_upgrade['PluginURI'] ),
'version' => esc_html( $plugin_upgrade['Version'] ),
);
}
}
if ( is_array( $theme_upgrades ) ) {
foreach ( $theme_upgrades as $slug => $theme_upgrade ) {
if ( ! isset( $allThemes[ $slug ] ) ) {
$allThemes[ $slug ] = array(
'name' => esc_html( $theme_upgrade['Name'] ),
'cnt' => 1,
);
} else {
++$allThemes[ $slug ]['cnt'];
}
$up_th_name = isset( $theme_upgrade['Name'] ) ? esc_html( $theme_upgrade['Name'] ) : '';
if ( empty( $up_th_name ) ) {
$up_th_name = isset( $theme_upgrade['name'] ) ? esc_html( $theme_upgrade['name'] ) : 'N/A';
}
$themesInfo[ $slug ] = array(
'name' => $up_th_name,
'premium' => ( isset( $theme_upgrade['premium'] ) ? esc_html( $theme_upgrade['premium'] ) : 0 ),
);
}
}
}
if ( '' !== $website->sync_errors ) {
++$total_sync_errors;
}
}
/**
* Filter: mainwp_updates_translation_sort_by
*
* Filters the default sorting option for Translation updates.
*
* @since 4.1
*/
$allTranslationsSortBy = apply_filters( 'mainwp_updates_translation_sort_by', 'name' );
/**
* Filter: mainwp_updates_plugins_sort_by
*
* Filters the default sorting option for Plugin updates.
*
* @since 4.1
*/
$allPluginsSortBy = apply_filters( 'mainwp_updates_plugins_sort_by', 'name' );
/**
* Filter: mainwp_updates_themes_sort_by
*
* Filters the default sorting option for Theme updates.
*
* @since 4.1
*/
$allThemesSortBy = apply_filters( 'mainwp_updates_themes_sort_by', 'name' );
/**
* Filter: mainwp_updates_abandoned_plugins_sort_by
*
* Filters the default sorting option for Abandoned plugins.
*
* @since 4.1
*/
$allPluginsOutdateSortBy = apply_filters( 'mainwp_updates_abandoned_plugins_sort_by', 'name' );
/**
* Filter: mainwp_updates_abandoned_themes_sort_by
*
* Filters the default sorting option for Abandoned themes.
*
* @since 4.1
*/
$allThemesOutdateSortBy = apply_filters( 'mainwp_updates_abandoned_themes_sort_by', 'name' );
MainWP_Utility::array_sort( $allTranslations, $allTranslationsSortBy );
MainWP_Utility::array_sort( $allPlugins, $allPluginsSortBy );
MainWP_Utility::array_sort( $allThemes, $allThemesSortBy );
MainWP_Utility::array_sort( $allPluginsOutdate, $allPluginsOutdateSortBy );
MainWP_Utility::array_sort( $allThemesOutdate, $allThemesOutdateSortBy );
$mainwp_show_language_updates = get_option( 'mainwp_show_language_updates', 1 );
/**
* Limits number of updates to process.
*
* Limits the number of updates that will be processed in a single run on Update Everything action.
*
* @since 4.0
*/
$limit_updates_all = apply_filters( 'mainwp_limit_updates_all', 0 );
// phpcs:disable WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
if ( 0 < $limit_updates_all && isset( $_GET['continue_update'] ) && '' !== $_GET['continue_update'] ) {
static::$continue_update = sanitize_text_field( wp_unslash( $_GET['continue_update'] ) );
if ( ( 'plugins_upgrade_all' === static::$continue_update || 'themes_upgrade_all' === static::$continue_update || 'translations_upgrade_all' === static::$continue_update ) && isset( $_GET['slug'] ) && '' !== $_GET['slug'] ) {
static::$continue_update_slug = wp_unslash( $_GET['slug'] );
}
}
$current_tab = '';
if ( isset( $_GET['tab'] ) ) {
$current_tab = sanitize_text_field( wp_unslash( $_GET['tab'] ) );
if ( ! in_array( $current_tab, array( 'wordpress-updates', 'updates-ignore', 'plugins-updates', 'themes-updates', 'translations-updates', true ) ) ) {
$current_tab = 'plugins-updates';
}
} elseif ( 'abandoned_plugins' === $abandoned_tab ) {
$current_tab = 'abandoned-plugins';
} elseif ( 'abandoned_themes' === $abandoned_tab ) {
$current_tab = 'abandoned-themes';
}
if ( empty( $current_tab ) ) {
$current_tab = 'plugins-updates';
}
// phpcs:enable
static::render_header( 'UpdatesManage' );
static::render_header_tabs( $mainwp_show_language_updates, $current_tab, $total_wp_upgrades, $total_plugin_upgrades, $total_theme_upgrades, $total_translation_upgrades, $total_plugins_outdate, $total_themes_outdate, $site_view );
?>
<div class="ui segment" id="mainwp-manage-updates">
<?php if ( MainWP_Utility::show_mainwp_message( 'notice', 'mainwp-manage-updates-message' ) ) { ?>
<div class="ui info message">
<i class="close icon mainwp-notice-dismiss" notice-id="mainwp-manage-updates-message"></i>
<div><?php printf( esc_html__( 'Manage available updates for all your child sites. From here, you can update update %1$splugins%2$s, %3$sthemes%4$s, and %5$sWordPress core%6$s.', 'mainwp' ), '<a href="https://mainwp.com/kb/update-plugins/" target="_blank">', '</a>', '<a href="https://mainwp.com/kb/update-themes/" target="_blank">', '</a> <i class="external alternate icon"></i>', '<a href="https://mainwp.com/kb/update-wordpress-core/" target="_blank">', '</a> <i class="external alternate icon"></i>' ); ?></div>
<div><?php printf( esc_html__( 'Also, from here, you can ignore updates for %1$sWordPress core%2$s, %3$splugins%4$s, and %5$sthemes%6$s.', 'mainwp' ), '<a href="https://mainwp.com/kb/ignore-wordpress-core-update/" target="_blank">', '</a>', '<a href="https://mainwp.com/kb/ignore-plugin-updates/" target="_blank">', '</a> <i class="external alternate icon"></i>', '<a href="https://mainwp.com/kb/ignore-theme-updates/" target="_blank">', '</a> <i class="external alternate icon"></i>' ); ?></div>
</div>
<?php } ?>
<?php
$hooks_tabs = apply_filters( 'mainwp_pages_updates_render_tabs', false, $current_tab );
if ( false === $hooks_tabs ) {
if ( 'wordpress-updates' === $current_tab ) {
static::render_wp_update_tab( $websites, $userExtension, $total_wp_upgrades, $all_groups_sites, $all_groups, $site_offset_for_groups, $site_view );
} elseif ( 'updates-ignore' === $current_tab ) {
static::render_wp_ignore_update_tab( $websites, $userExtension );
} elseif ( 'plugins-updates' === $current_tab ) {
static::render_plugins_update_tab( $websites, $total_plugin_upgrades, $userExtension, $all_groups_sites, $all_groups, $allPlugins, $pluginsInfo, $site_offset_for_groups, $site_view );
} elseif ( 'themes-updates' === $current_tab ) {
static::render_themes_update_tab( $websites, $total_theme_upgrades, $userExtension, $all_groups_sites, $all_groups, $allThemes, $themesInfo, $site_offset_for_groups, $site_view );
} elseif ( 'translations-updates' === $current_tab ) {
static::render_trans_update_tab( $websites, $total_translation_upgrades, $userExtension, $all_groups_sites, $all_groups, $allTranslations, $translationsInfo, $mainwp_show_language_updates, $site_offset_for_groups, $site_view );
} elseif ( 'abandoned-plugins' === $current_tab ) {
static::render_abandoned_plugins_tab( $websites, $all_groups_sites, $all_groups, $allPluginsOutdate, $decodedDismissedPlugins, $site_offset_for_groups, $site_view );
} elseif ( 'abandoned-themes' === $current_tab ) {
static::render_abandoned_themes_tab( $websites, $all_groups_sites, $all_groups, $allThemesOutdate, $decodedDismissedThemes, $site_offset_for_groups, $site_view );
}
?>
</div>
<?php
static::render_js_updates( $site_view );
}
static::render_updates_modal();
static::render_plugin_details_modal();
MainWP_UI::render_modal_upload_icon();
static::render_screen_options_modal();
static::render_footer();
?>
<script type="text/javascript">
mainwp_manage_updates_screen_options = function () {
jQuery( '#mainwp-manage-updates-screen-options-modal' ).modal( 'show' );
jQuery( '#manage-updates-screen-options-form' ).submit( function() {
jQuery( '#mainwp-manage-updates-screen-options-modal' ).modal( 'hide' );
} );
return false;
};
</script>
<?php
}
/**
* Render WP updates tab.
*
* @param object $websites Object containing child sites info.
* @param object $userExtension User Extension object.
* @param int $total_wp_upgrades Number of available WP upates.
* @param array $all_groups_sites Array containing all groups and sites.
* @param array $all_groups Array containing all groups.
* @param int $site_offset_for_groups Offset value.
* @param string $site_view Current view.
*
* @uses \MainWP\Dashboard\MainWP_DB::data_seek()
* @uses \MainWP\Dashboard\MainWP_Updates_Per_Group::render_wpcore_updates()
* @uses \MainWP\Dashboard\MainWP_Updates_Per_Site::render_wpcore_updates()
*/
public static function render_wp_update_tab( $websites, $userExtension, $total_wp_upgrades, $all_groups_sites, $all_groups, $site_offset_for_groups, $site_view ) {
?>
<div class="ui active tab" data-tab="wordpress-updates">
<?php
/**
* Action: mainwp_updates_before_wp_updates
*
* Fires at the top of the WP updates tab.
*
* @param object $websites Object containing child sites info.
* @param int $total_wp_upgrades Number of available WP upates.
* @param array $all_groups_sites Array containing all groups and sites.
* @param array $all_groups Array containing all groups.
* @param int $site_offset_for_groups Offset value.
*
* @since 4.1
*/
do_action( 'mainwp_updates_before_wp_updates', $websites, $total_wp_upgrades, $all_groups_sites, $all_groups, $site_offset_for_groups );
if ( MAINWP_VIEW_PER_GROUP === $site_view ) {
/**
* Action: mainwp_updates_pergroup_before_wp_updates
*
* Fires at the top of the WP updates tab, per Group view.
*
* @param object $websites Object containing child sites info.
* @param int $total_wp_upgrades Number of available WP upates.
* @param array $all_groups_sites Array containing all groups and sites.
* @param array $all_groups Array containing all groups.
* @param int $site_offset_for_groups Offset value.
*
* @since 4.1
*/
do_action( 'mainwp_updates_pergroup_before_wp_updates', $websites, $total_wp_upgrades, $all_groups_sites, $all_groups, $site_offset_for_groups );
MainWP_Updates_Per_Group::render_wpcore_updates( $websites, $userExtension, $total_wp_upgrades, $all_groups_sites, $all_groups, $site_offset_for_groups );
/**
* Action: mainwp_updates_pergroup_after_wp_updates
*
* Fires at the bottom of the WP updates tab, per Group view.
*
* @param object $websites Object containing child sites info.
* @param int $total_wp_upgrades Number of available WP upates.
* @param array $all_groups_sites Array containing all groups and sites.
* @param array $all_groups Array containing all groups.
* @param int $site_offset_for_groups Offset value.
*
* @since 4.1
*/
do_action( 'mainwp_updates_pergroup_after_wp_updates', $websites, $total_wp_upgrades, $all_groups_sites, $all_groups, $site_offset_for_groups );
} else {
/**
* Action: mainwp_updates_persite_before_wp_updates
*
* Fires at the top of the WP updates tab, per Site view.
*
* @param object $websites Object containing child sites info.
* @param int $total_wp_upgrades Number of available WP upates.
* @param array $all_groups_sites Array containing all groups and sites.
* @param array $all_groups Array containing all groups.
* @param int $site_offset_for_groups Offset value.
*
* @since 4.1
*/
do_action( 'mainwp_updates_pergroup_before_wp_updates', $websites, $total_wp_upgrades, $all_groups_sites, $all_groups, $site_offset_for_groups );
MainWP_DB::data_seek( $websites, 0 );
MainWP_Updates_Per_Site::render_wpcore_updates( $websites, $userExtension, $total_wp_upgrades );
/**
* Action: mainwp_updates_persite_after_wp_updates
*
* Fires at the bottom of the WP updates tab, per Site view.
*
* @param object $websites Object containing child sites info.
* @param int $total_wp_upgrades Number of available WP upates.
* @param array $all_groups_sites Array containing all groups and sites.
* @param array $all_groups Array containing all groups.
* @param int $site_offset_for_groups Offset value.
*
* @since 4.1
*/
do_action( 'mainwp_updates_persite_after_wp_updates', $websites, $total_wp_upgrades, $all_groups_sites, $all_groups, $site_offset_for_groups );
}
/**
* Action: mainwp_updates_after_wp_updates
*
* Fires at the top of the WP updates tab.
*
* @param object $websites Object containing child sites info.
* @param int $total_wp_upgrades Number of available WP upates.
* @param array $all_groups_sites Array containing all groups and sites.
* @param array $all_groups Array containing all groups.
* @param int $site_offset_for_groups Offset value.
*
* @since 4.1
*/
do_action( 'mainwp_updates_after_wp_updates', $websites, $total_wp_upgrades, $all_groups_sites, $all_groups, $site_offset_for_groups );
?>
</div>
<?php
}
/**
* Renders WP updates tab.
*
* @param array $websites Object containing child sites info.
* @param object $userExtension User extension.
*/
public static function render_wp_ignore_update_tab( $websites, $userExtension ) {
MainWP_WP_Updates::instance()->render_ignore( $websites, $userExtension );
}
/**
* Renders WP updates tab.
*
* @param object $websites Object containing child sites info.
* @param int $total_plugin_upgrades Number of available plugin updates.
* @param object $userExtension User extension.
* @param array $all_groups_sites Array of all groups and sites.
* @param array $all_groups Array of all groups.
* @param array $allPlugins Array of all plugins.
* @param array $pluginsInfo Array of all plugins info.
* @param int $site_offset_for_groups Offset value.
* @param string $site_view Current view.
*
* @uses \MainWP\Dashboard\MainWP_Updates_Per_Group::render_plugins_updates()
* @uses \MainWP\Dashboard\MainWP_Updates_Per_Item::render_plugins_updates()
* @uses \MainWP\Dashboard\MainWP_Updates_Per_Site::render_plugins_updates()
*/
public static function render_plugins_update_tab( $websites, $total_plugin_upgrades, $userExtension, $all_groups_sites, $all_groups, $allPlugins, $pluginsInfo, $site_offset_for_groups, $site_view ) { //phpcs:ignore -- NOSONAR - compatible.
$trustedPlugins = json_decode( $userExtension->trusted_plugins, true );
if ( ! is_array( $trustedPlugins ) ) {
$trustedPlugins = array();
}
?>
<div class="ui active tab" data-tab="plugins-updates">
<?php
/**
* Action: mainwp_updates_before_plugin_updates
*
* Fires at the top of the Plugin updates tab.
*
* @param object $websites Object containing child sites info.
* @param int $total_plugin_upgrades Number of available plugin updates.
* @param object $userExtension User extension.
* @param array $all_groups_sites Array of all groups and sites.
* @param array $all_groups Array of all groups.
* @param array $allPlugins Array of all plugins.
* @param array $pluginsInfo Array of all plugins info.
* @param int $site_offset_for_groups Offset value.
*
* @since 4.1
*/
do_action( 'mainwp_updates_before_plugin_updates', $websites, $total_plugin_upgrades, $userExtension, $all_groups_sites, $all_groups, $allPlugins, $pluginsInfo, $site_offset_for_groups );
if ( MAINWP_VIEW_PER_SITE === $site_view ) {
/**
* Action: mainwp_updates_persite_before_plugin_updates
*
* Fires at the top of the Plugin updates tab, per Site view.
*
* @param object $websites Object containing child sites info.
* @param int $total_plugin_upgrades Number of available plugin updates.
* @param object $userExtension User extension.
* @param array $all_groups_sites Array of all groups and sites.
* @param array $all_groups Array of all groups.
* @param array $allPlugins Array of all plugins.
* @param array $pluginsInfo Array of all plugins info.
* @param int $site_offset_for_groups Offset value.
*
* @since 4.1
*/
do_action( 'mainwp_updates_persite_before_plugin_updates', $websites, $total_plugin_upgrades, $userExtension, $all_groups_sites, $all_groups, $allPlugins, $pluginsInfo, $site_offset_for_groups );
MainWP_Updates_Per_Site::render_plugins_updates( $websites, $total_plugin_upgrades, $userExtension, $trustedPlugins );
/**
* Action: mainwp_updates_persite_after_plugin_updates
*
* Fires at the bottom of the Plugin updates tab, per Site view.
*
* @param object $websites Object containing child sites info.
* @param int $total_plugin_upgrades Number of available plugin updates.
* @param object $userExtension User extension.
* @param array $all_groups_sites Array of all groups and sites.
* @param array $all_groups Array of all groups.
* @param array $allPlugins Array of all plugins.
* @param array $pluginsInfo Array of all plugins info.
* @param int $site_offset_for_groups Offset value.
*
* @since 4.1
*/
do_action( 'mainwp_updates_persite_after_plugin_updates', $websites, $total_plugin_upgrades, $userExtension, $all_groups_sites, $all_groups, $allPlugins, $pluginsInfo, $site_offset_for_groups );
} elseif ( MAINWP_VIEW_PER_GROUP === $site_view ) {
/**
* Action: mainwp_updates_pergroup_before_plugin_updates
*
* Fires at the top of the Plugin updates tab, per Group view.
*
* @param object $websites Object containing child sites info.
* @param int $total_plugin_upgrades Number of available plugin updates.
* @param object $userExtension User extension.
* @param array $all_groups_sites Array of all groups and sites.
* @param array $all_groups Array of all groups.
* @param array $allPlugins Array of all plugins.
* @param array $pluginsInfo Array of all plugins info.
* @param int $site_offset_for_groups Offset value.
*
* @since 4.1
*/
do_action( 'mainwp_updates_pergroup_before_plugin_updates', $websites, $total_plugin_upgrades, $userExtension, $all_groups_sites, $all_groups, $allPlugins, $pluginsInfo, $site_offset_for_groups );
MainWP_Updates_Per_Group::render_plugins_updates( $websites, $total_plugin_upgrades, $userExtension, $all_groups_sites, $all_groups, $site_offset_for_groups, $trustedPlugins );
/**
* Action: mainwp_updates_pergroup_after_plugin_updates
*
* Fires at the bottom of the Plugin updates tab, per Group view.
*
* @param object $websites Object containing child sites info.
* @param int $total_plugin_upgrades Number of available plugin updates.
* @param object $userExtension User extension.
* @param array $all_groups_sites Array of all groups and sites.
* @param array $all_groups Array of all groups.
* @param array $allPlugins Array of all plugins.
* @param array $pluginsInfo Array of all plugins info.
* @param int $site_offset_for_groups Offset value.
*
* @since 4.1
*/
do_action( 'mainwp_updates_pergroup_after_plugin_updates', $websites, $total_plugin_upgrades, $userExtension, $all_groups_sites, $all_groups, $allPlugins, $pluginsInfo, $site_offset_for_groups );
} else {
/**
* Action: mainwp_updates_perplugin_before_plugin_updates
*
* Fires at the top of the Plugin updates tab, per Plugin view.
*
* @param object $websites Object containing child sites info.
* @param int $total_plugin_upgrades Number of available plugin updates.
* @param object $userExtension User extension.
* @param array $all_groups_sites Array of all groups and sites.
* @param array $all_groups Array of all groups.
* @param array $allPlugins Array of all plugins.
* @param array $pluginsInfo Array of all plugins info.
* @param int $site_offset_for_groups Offset value.
*
* @since 4.1
*/
do_action( 'mainwp_updates_perplugin_before_plugin_updates', $websites, $total_plugin_upgrades, $userExtension, $all_groups_sites, $all_groups, $allPlugins, $pluginsInfo, $site_offset_for_groups );
MainWP_Updates_Per_Item::render_plugins_updates( $websites, $total_plugin_upgrades, $userExtension, $allPlugins, $pluginsInfo, $trustedPlugins );
/**
* Action: mainwp_updates_perplugin_after_plugin_updates
*
* Fires at the bottom of the Plugin updates tab, per Plugin view.
*
* @param object $websites Object containing child sites info.
* @param int $total_plugin_upgrades Number of available plugin updates.
* @param object $userExtension User extension.
* @param array $all_groups_sites Array of all groups and sites.
* @param array $all_groups Array of all groups.
* @param array $allPlugins Array of all plugins.
* @param array $pluginsInfo Array of all plugins info.
* @param int $site_offset_for_groups Offset value.
*
* @since 4.1
*/
do_action( 'mainwp_updates_perplugin_after_plugin_updates', $websites, $total_plugin_upgrades, $userExtension, $all_groups_sites, $all_groups, $allPlugins, $pluginsInfo, $site_offset_for_groups );
}
/**
* Action: mainwp_updates_after_plugin_updates
*
* Fires at the bottom of the Plugin updates tab.
*
* @param object $websites Object containing child sites info.
* @param int $total_plugin_upgrades Number of available plugin updates.
* @param object $userExtension User extension.
* @param array $all_groups_sites Array of all groups and sites.
* @param array $all_groups Array of all groups.
* @param array $allPlugins Array of all plugins.
* @param array $pluginsInfo Array of all plugins info.
* @param int $site_offset_for_groups Offset value.
*
* @since 4.1
*/
do_action( 'mainwp_updates_after_plugin_updates', $websites, $total_plugin_upgrades, $userExtension, $all_groups_sites, $all_groups, $allPlugins, $pluginsInfo, $site_offset_for_groups );
?>
</div>
<?php
}
/**
* Renders theme update tab.
*
* @param object $websites Object containing child sites info.
* @param int $total_theme_upgrades Number of available theme updates.
* @param object $userExtension User extension.
* @param array $all_groups_sites Array of all groups and sites.
* @param array $all_groups Array of all groups.
* @param array $allThemes Array of all themes.
* @param array $themesInfo Array of all themes info.
* @param int $site_offset_for_groups Offset value.
* @param string $site_view Current view.
*
* @uses \MainWP\Dashboard\MainWP_Updates_Per_Group::render_themes_updates()
* @uses \MainWP\Dashboard\MainWP_Updates_Per_Item::render_themes_updates()
* @uses \MainWP\Dashboard\MainWP_Updates_Per_Site::render_themes_updates()
*/
public static function render_themes_update_tab( $websites, $total_theme_upgrades, $userExtension, $all_groups_sites, $all_groups, $allThemes, $themesInfo, $site_offset_for_groups, $site_view ) { //phpcs:ignore -- NOSONAR - compatible.
$trustedThemes = json_decode( $userExtension->trusted_themes, true );
if ( ! is_array( $trustedThemes ) ) {
$trustedThemes = array();
}
?>
<div class="ui active tab" data-tab="themes-updates">
<?php
/**
* Action: mainwp_updates_before_theme_updates
*
* Fires at the top of the Theme updates tab.
*
* @param object $websites Object containing child sites info.
* @param int $total_theme_upgrades Number of available theme updates.
* @param object $userExtension User extension.
* @param array $all_groups_sites Array of all groups and sites.
* @param array $all_groups Array of all groups.
* @param array $allThemes Array of all themes.
* @param array $themesInfo Array of all themes info.
* @param int $site_offset_for_groups Offset value.
*
* @since 4.1
*/
do_action( 'mainwp_updates_before_theme_updates', $websites, $total_theme_upgrades, $userExtension, $all_groups_sites, $all_groups, $allThemes, $themesInfo, $site_offset_for_groups );
if ( MAINWP_VIEW_PER_SITE === $site_view ) {
/**
* Action: mainwp_updates_persite_before_theme_updates
*
* Fires at the top of the Theme updates tab, per Site view.
*
* @param object $websites Object containing child sites info.
* @param int $total_theme_upgrades Number of available theme updates.
* @param object $userExtension User extension.
* @param array $all_groups_sites Array of all groups and sites.
* @param array $all_groups Array of all groups.
* @param array $allThemes Array of all themes.
* @param array $themesInfo Array of all themes info.
* @param int $site_offset_for_groups Offset value.
*
* @since 4.1
*/
do_action( 'mainwp_updates_persite_before_theme_updates', $websites, $total_theme_upgrades, $userExtension, $all_groups_sites, $all_groups, $allThemes, $themesInfo, $site_offset_for_groups );
MainWP_Updates_Per_Site::render_themes_updates( $websites, $total_theme_upgrades, $userExtension, $trustedThemes );
/**
* Action: mainwp_updates_persite_after_theme_updates
*
* Fires at the bottom of the Theme updates tab, per Site view.
*
* @param object $websites Object containing child sites info.
* @param int $total_theme_upgrades Number of available theme updates.
* @param object $userExtension User extension.
* @param array $all_groups_sites Array of all groups and sites.
* @param array $all_groups Array of all groups.
* @param array $allThemes Array of all themes.
* @param array $themesInfo Array of all themes info.
* @param int $site_offset_for_groups Offset value.
*
* @since 4.1
*/
do_action( 'mainwp_updates_persite_after_theme_updates', $websites, $total_theme_upgrades, $userExtension, $all_groups_sites, $all_groups, $allThemes, $themesInfo, $site_offset_for_groups );
} elseif ( MAINWP_VIEW_PER_GROUP === $site_view ) {
/**
* Action: mainwp_updates_pergroup_before_theme_updates
*
* Fires at the top of the Theme updates tab, per Group view.
*
* @param object $websites Object containing child sites info.
* @param int $total_theme_upgrades Number of available theme updates.
* @param object $userExtension User extension.
* @param array $all_groups_sites Array of all groups and sites.
* @param array $all_groups Array of all groups.
* @param array $allThemes Array of all themes.
* @param array $themesInfo Array of all themes info.
* @param int $site_offset_for_groups Offset value.
*
* @since 4.1
*/
do_action( 'mainwp_updates_pergroup_before_theme_updates', $websites, $total_theme_upgrades, $userExtension, $all_groups_sites, $all_groups, $allThemes, $themesInfo, $site_offset_for_groups );
MainWP_Updates_Per_Group::render_themes_updates( $websites, $total_theme_upgrades, $userExtension, $all_groups_sites, $all_groups, $site_offset_for_groups, $trustedThemes );
/**
* Action: mainwp_updates_pergroup_after_theme_updates
*
* Fires at the bottom of the Theme updates tab, per Group view.
*
* @param object $websites Object containing child sites info.
* @param int $total_theme_upgrades Number of available theme updates.
* @param object $userExtension User extension.
* @param array $all_groups_sites Array of all groups and sites.
* @param array $all_groups Array of all groups.
* @param array $allThemes Array of all themes.
* @param array $themesInfo Array of all themes info.
* @param int $site_offset_for_groups Offset value.
*
* @since 4.1
*/
do_action( 'mainwp_updates_pergroup_after_theme_updates', $websites, $total_theme_upgrades, $userExtension, $all_groups_sites, $all_groups, $allThemes, $themesInfo, $site_offset_for_groups );
} else {
/**
* Action: mainwp_updates_pertheme_before_theme_updates
*
* Fires at the top of the Theme updates tab, per Theme view.
*
* @param object $websites Object containing child sites info.
* @param int $total_theme_upgrades Number of available theme updates.
* @param object $userExtension User extension.
* @param array $all_groups_sites Array of all groups and sites.
* @param array $all_groups Array of all groups.
* @param array $allThemes Array of all themes.
* @param array $themesInfo Array of all themes info.
* @param int $site_offset_for_groups Offset value.
*
* @since 4.1
*/
do_action( 'mainwp_updates_pertheme_before_theme_updates', $websites, $total_theme_upgrades, $userExtension, $all_groups_sites, $all_groups, $allThemes, $themesInfo, $site_offset_for_groups );
MainWP_Updates_Per_Item::render_themes_updates( $websites, $total_theme_upgrades, $userExtension, $allThemes, $themesInfo, $trustedThemes );
/**
* Action: mainwp_updates_pertheme_after_theme_updates
*
* Fires at the bottom of the Theme updates tab, per Theme view.
*
* @param object $websites Object containing child sites info.
* @param int $total_theme_upgrades Number of available theme updates.
* @param object $userExtension User extension.
* @param array $all_groups_sites Array of all groups and sites.
* @param array $all_groups Array of all groups.
* @param array $allThemes Array of all themes.
* @param array $themesInfo Array of all themes info.
* @param int $site_offset_for_groups Offset value.
*
* @since 4.1
*/
do_action( 'mainwp_updates_pertheme_after_theme_updates', $websites, $total_theme_upgrades, $userExtension, $all_groups_sites, $all_groups, $allThemes, $themesInfo, $site_offset_for_groups );
}
/**
* Action: mainwp_updates_after_theme_updates
*
* Fires at the bottom of the Theme updates tab.
*
* @param object $websites Object containing child sites info.
* @param int $total_theme_upgrades Number of available theme updates.
* @param object $userExtension User extension.
* @param array $all_groups_sites Array of all groups and sites.
* @param array $all_groups Array of all groups.
* @param array $allThemes Array of all themes.
* @param array $themesInfo Array of all themes info.
* @param int $site_offset_for_groups Offset value.
*
* @since 4.1
*/
do_action( 'mainwp_updates_after_theme_updates', $websites, $total_theme_upgrades, $userExtension, $all_groups_sites, $all_groups, $allThemes, $themesInfo, $site_offset_for_groups );
?>
</div>
<?php
}
/**
* Renders translations update tab.
*
* @param object $websites Object containing child sites info.
* @param int $total_translation_upgrades Number of available translation updates.
* @param object $userExtension User extension.
* @param array $all_groups_sites Array of all groups and sites.
* @param array $all_groups Array of all groups.
* @param array $allTranslations Array of all translations.
* @param array $translationsInfo Array of all translations info.
* @param bool $mainwp_show_language_updates Either or not show language updates.
* @param int $site_offset_for_groups Offset value.
* @param string $site_view Current Site view.
*
* @uses \MainWP\Dashboard\MainWP_Updates_Per_Group::render_trans_update()
* @uses \MainWP\Dashboard\MainWP_Updates_Per_Item::render_trans_update()
* @uses \MainWP\Dashboard\MainWP_Updates_Per_Site::render_trans_update()
*/
public static function render_trans_update_tab( $websites, $total_translation_upgrades, $userExtension, $all_groups_sites, $all_groups, $allTranslations, $translationsInfo, $mainwp_show_language_updates, $site_offset_for_groups, $site_view ) { //phpcs:ignore -- NOSONAR - compatible.
if ( 1 === (int) $mainwp_show_language_updates ) {
?>
<div class="ui active tab" data-tab="translations-updates">
<?php
/**
* Action: mainwp_updates_before_translation_updates
*
* Fires at the top of the Translation updates tab.
*
* @param object $websites Object containing child sites info.
* @param int $total_translation_upgrades Number of available translation updates.
* @param object $userExtension User extension.
* @param array $all_groups_sites Array of all groups and sites.
* @param array $all_groups Array of all groups.
* @param array $allTranslations Array of all translations.
* @param array $translationsInfo Array of all translations info.
* @param int $site_offset_for_groups Offset value.
*
* @since 4.1
*/
do_action( 'mainwp_updates_before_translation_updates', $websites, $total_translation_upgrades, $userExtension, $all_groups_sites, $all_groups, $allTranslations, $translationsInfo, $mainwp_show_language_updates, $site_offset_for_groups );
if ( MAINWP_VIEW_PER_SITE === $site_view ) {
/**
* Action: mainwp_updates_persite_before_translation_updates
*
* Fires at the top of the Translation updates tab, per Site view.
*
* @param object $websites Object containing child sites info.
* @param int $total_translation_upgrades Number of available translation updates.
* @param object $userExtension User extension.
* @param array $all_groups_sites Array of all groups and sites.
* @param array $all_groups Array of all groups.
* @param array $allTranslations Array of all translations.
* @param array $translationsInfo Array of all translations info.
* @param int $site_offset_for_groups Offset value.
*
* @since 4.1
*/
do_action( 'mainwp_updates_persite_before_translation_updates', $websites, $total_translation_upgrades, $userExtension, $all_groups_sites, $all_groups, $allTranslations, $translationsInfo, $mainwp_show_language_updates, $site_offset_for_groups );
MainWP_Updates_Per_Site::render_trans_update( $websites, $total_translation_upgrades, $userExtension );
/**
* Action: mainwp_updates_persite_after_translation_updates
*
* Fires at the bottom of the Translation updates tab, per Site view.
*
* @param object $websites Object containing child sites info.
* @param int $total_translation_upgrades Number of available translation updates.
* @param object $userExtension User extension.
* @param array $all_groups_sites Array of all groups and sites.
* @param array $all_groups Array of all groups.
* @param array $allTranslations Array of all translations.
* @param array $translationsInfo Array of all translations info.
* @param int $site_offset_for_groups Offset value.
*
* @since 4.1
*/
do_action( 'mainwp_updates_persite_after_translation_updates', $websites, $total_translation_upgrades, $userExtension, $all_groups_sites, $all_groups, $allTranslations, $translationsInfo, $mainwp_show_language_updates, $site_offset_for_groups );
} elseif ( MAINWP_VIEW_PER_GROUP === $site_view ) {
/**
* Action: mainwp_updates_pergroup_before_translation_updates
*
* Fires at the top of the Translation updates tab, per Group view.
*
* @param object $websites Object containing child sites info.
* @param int $total_translation_upgrades Number of available translation updates.
* @param object $userExtension User extension.
* @param array $all_groups_sites Array of all groups and sites.
* @param array $all_groups Array of all groups.
* @param array $allTranslations Array of all translations.
* @param array $translationsInfo Array of all translations info.
* @param int $site_offset_for_groups Offset value.
*
* @since 4.1
*/
do_action( 'mainwp_updates_pergroup_before_translation_updates', $websites, $total_translation_upgrades, $userExtension, $all_groups_sites, $all_groups, $allTranslations, $translationsInfo, $mainwp_show_language_updates, $site_offset_for_groups );
MainWP_Updates_Per_Group::render_trans_update( $websites, $total_translation_upgrades, $all_groups_sites, $all_groups, $site_offset_for_groups, $userExtension );
/**
* Action: mainwp_updates_pergroup_after_translation_updates
*
* Fires at the bottom of the Translation updates tab, per Group view.
*
* @param object $websites Object containing child sites info.
* @param int $total_translation_upgrades Number of available translation updates.
* @param object $userExtension User extension.
* @param array $all_groups_sites Array of all groups and sites.
* @param array $all_groups Array of all groups.
* @param array $allTranslations Array of all translations.
* @param array $translationsInfo Array of all translations info.
* @param int $site_offset_for_groups Offset value.
*
* @since 4.1
*/
do_action( 'mainwp_updates_pergroup_after_translation_updates', $websites, $total_translation_upgrades, $userExtension, $all_groups_sites, $all_groups, $allTranslations, $translationsInfo, $mainwp_show_language_updates, $site_offset_for_groups );
} else {
/**
* Action: mainwp_updates_pertranslation_before_translation_updates
*
* Fires at the top of the Translation updates tab, per Translation view.
*
* @param object $websites Object containing child sites info.
* @param int $total_translation_upgrades Number of available translation updates.
* @param object $userExtension User extension.
* @param array $all_groups_sites Array of all groups and sites.
* @param array $all_groups Array of all groups.
* @param array $allTranslations Array of all translations.
* @param array $translationsInfo Array of all translations info.
* @param int $site_offset_for_groups Offset value.
*
* @since 4.1
*/
do_action( 'mainwp_updates_pertranslation_before_translation_updates', $websites, $total_translation_upgrades, $userExtension, $all_groups_sites, $all_groups, $allTranslations, $translationsInfo, $mainwp_show_language_updates, $site_offset_for_groups );
MainWP_Updates_Per_Item::render_trans_update( $websites, $total_translation_upgrades, $userExtension, $allTranslations, $translationsInfo );
/**
* Action: mainwp_updates_pertranslation_after_translation_updates
*
* Fires at the bottom of the Translation updates tab, per Translation view.
*
* @param object $websites Object containing child sites info.
* @param int $total_translation_upgrades Number of available translation updates.
* @param object $userExtension User extension.
* @param array $all_groups_sites Array of all groups and sites.
* @param array $all_groups Array of all groups.
* @param array $allTranslations Array of all translations.
* @param array $translationsInfo Array of all translations info.
* @param int $site_offset_for_groups Offset value.
*
* @since 4.1
*/
do_action( 'mainwp_updates_pertranslation_after_translation_updates', $websites, $total_translation_upgrades, $userExtension, $all_groups_sites, $all_groups, $allTranslations, $translationsInfo, $mainwp_show_language_updates, $site_offset_for_groups );
}
/**
* Action: mainwp_updates_after_translation_updates
*
* Fires at the bottom of the Translation updates tab.
*
* @param object $websites Object containing child sites info.
* @param int $total_translation_upgrades Number of available translation updates.
* @param object $userExtension User extension.
* @param array $all_groups_sites Array of all groups and sites.
* @param array $all_groups Array of all groups.
* @param array $allTranslations Array of all translations.
* @param array $translationsInfo Array of all translations info.
* @param int $site_offset_for_groups Offset value.
*
* @since 4.1
*/
do_action( 'mainwp_updates_after_translation_updates', $websites, $total_translation_upgrades, $userExtension, $all_groups_sites, $all_groups, $allTranslations, $translationsInfo, $mainwp_show_language_updates, $site_offset_for_groups );
?>
</div>
<?php
}
}
/**
* Renders abandoned plugins tab.
*
* @param object $websites Object containing child sites info.
* @param array $all_groups_sites Array of all groups and sites.
* @param array $all_groups Array of all groups.
* @param array $allPluginsOutdate Array of all abandoned plugins.
* @param array $decodedDismissedPlugins Array of dismissed abandoned plugins.
* @param int $site_offset_for_groups Offset value.
* @param string $site_view Current site view.
*
* @uses \MainWP\Dashboard\MainWP_Updates_Per_Group::render_abandoned_plugins()
* @uses \MainWP\Dashboard\MainWP_Updates_Per_Item::render_abandoned_plugins()
* @uses \MainWP\Dashboard\MainWP_Updates_Per_Site::render_abandoned_plugins()
*/
public static function render_abandoned_plugins_tab( $websites, $all_groups_sites, $all_groups, $allPluginsOutdate, $decodedDismissedPlugins, $site_offset_for_groups, $site_view ) {
?>
<div class="ui active tab" data-tab="abandoned-plugins">
<?php
/**
* Action: mainwp_updates_before_abandoned_plugins
*
* Fires at the top of the Abandoned plugins tab.
*
* @param object $websites Object containing child sites info.
* @param array $all_groups_sites Array of all groups and sites.
* @param array $all_groups Array of all groups.
* @param array $allPluginsOutdate Array of all abandoned plugins.
* @param array $decodedDismissedPlugins Array of dismissed abandoned plugins.
* @param int $site_offset_for_groups Offset value.
*
* @since 4.1
*/
do_action( 'mainwp_updates_before_abandoned_plugins', $websites, $all_groups_sites, $all_groups, $allPluginsOutdate, $decodedDismissedPlugins, $site_offset_for_groups );
if ( MAINWP_VIEW_PER_SITE === $site_view ) {
/**
* Action: mainwp_updates_persite_before_abandoned_plugins
*
* Fires at the top of the Abandoned plugins tab, per Site view.
*
* @param object $websites Object containing child sites info.
* @param array $all_groups_sites Array of all groups and sites.
* @param array $all_groups Array of all groups.
* @param array $allPluginsOutdate Array of all abandoned plugins.
* @param array $decodedDismissedPlugins Array of dismissed abandoned plugins.
* @param int $site_offset_for_groups Offset value.
*
* @since 4.1
*/
do_action( 'mainwp_updates_persite_before_abandoned_plugins', $websites, $all_groups_sites, $all_groups, $allPluginsOutdate, $decodedDismissedPlugins, $site_offset_for_groups );
MainWP_Updates_Per_Site::render_abandoned_plugins( $websites, $allPluginsOutdate, $decodedDismissedPlugins );
/**
* Action: mainwp_updates_persite_after_abandoned_plugins
*
* Fires at the bottom of the Abandoned plugins tab, per Site view.
*
* @param object $websites Object containing child sites info.
* @param array $all_groups_sites Array of all groups and sites.
* @param array $all_groups Array of all groups.
* @param array $allPluginsOutdate Array of all abandoned plugins.
* @param array $decodedDismissedPlugins Array of dismissed abandoned plugins.
* @param int $site_offset_for_groups Offset value.
*
* @since 4.1
*/
do_action( 'mainwp_updates_persite_after_abandoned_plugins', $websites, $all_groups_sites, $all_groups, $allPluginsOutdate, $decodedDismissedPlugins, $site_offset_for_groups );
} elseif ( MAINWP_VIEW_PER_GROUP === $site_view ) {
/**
* Action: mainwp_updates_pergroup_before_abandoned_plugins
*
* Fires at the top of the Abandoned plugins tab, per Group view.
*
* @param object $websites Object containing child sites info.
* @param array $all_groups_sites Array of all groups and sites.
* @param array $all_groups Array of all groups.
* @param array $allPluginsOutdate Array of all abandoned plugins.
* @param array $decodedDismissedPlugins Array of dismissed abandoned plugins.
* @param int $site_offset_for_groups Offset value.
*
* @since 4.1
*/
do_action( 'mainwp_updates_pergroup_before_abandoned_plugins', $websites, $all_groups_sites, $all_groups, $allPluginsOutdate, $decodedDismissedPlugins, $site_offset_for_groups );
MainWP_Updates_Per_Group::render_abandoned_plugins( $websites, $allPluginsOutdate, $all_groups_sites, $all_groups, $site_offset_for_groups, $decodedDismissedPlugins );
/**
* Action: mainwp_updates_pergroup_after_abandoned_plugins
*
* Fires at the bottom of the Abandoned plugins tab, per Group view.
*
* @param object $websites Object containing child sites info.
* @param array $all_groups_sites Array of all groups and sites.
* @param array $all_groups Array of all groups.
* @param array $allPluginsOutdate Array of all abandoned plugins.
* @param array $decodedDismissedPlugins Array of dismissed abandoned plugins.
* @param int $site_offset_for_groups Offset value.
*
* @since 4.1
*/
do_action( 'mainwp_updates_pergroup_after_abandoned_plugins', $websites, $all_groups_sites, $all_groups, $allPluginsOutdate, $decodedDismissedPlugins, $site_offset_for_groups );
} else {
/**
* Action: mainwp_updates_perplugin_before_abandoned_plugins
*
* Fires at the top of the Abandoned plugins tab, per Plugin view.
*
* @param object $websites Object containing child sites info.
* @param array $all_groups_sites Array of all groups and sites.
* @param array $all_groups Array of all groups.
* @param array $allPluginsOutdate Array of all abandoned plugins.
* @param array $decodedDismissedPlugins Array of dismissed abandoned plugins.
* @param int $site_offset_for_groups Offset value.
*
* @since 4.1
*/
do_action( 'mainwp_updates_perplugin_before_abandoned_plugins', $websites, $all_groups_sites, $all_groups, $allPluginsOutdate, $decodedDismissedPlugins, $site_offset_for_groups );
MainWP_Updates_Per_Item::render_abandoned_plugins( $websites, $allPluginsOutdate, $decodedDismissedPlugins );
/**
* Action: mainwp_updates_perplugin_after_abandoned_plugins
*
* Fires at the bottom of the Abandoned plugins tab, per Plugin view.
*
* @param object $websites Object containing child sites info.
* @param array $all_groups_sites Array of all groups and sites.
* @param array $all_groups Array of all groups.
* @param array $allPluginsOutdate Array of all abandoned plugins.
* @param array $decodedDismissedPlugins Array of dismissed abandoned plugins.
* @param int $site_offset_for_groups Offset value.
*
* @since 4.1
*/
do_action( 'mainwp_updates_perplugin_after_abandoned_plugins', $websites, $all_groups_sites, $all_groups, $allPluginsOutdate, $decodedDismissedPlugins, $site_offset_for_groups );
}
/**
* Action: mainwp_updates_after_abandoned_plugins
*
* Fires at the bottom of the Abandoned plugins tab.
*
* @param object $websites Object containing child sites info.
* @param array $all_groups_sites Array of all groups and sites.
* @param array $all_groups Array of all groups.
* @param array $allPluginsOutdate Array of all abandoned plugins.
* @param array $decodedDismissedPlugins Array of dismissed abandoned plugins.
* @param int $site_offset_for_groups Offset value.
*
* @since 4.1
*/
do_action( 'mainwp_updates_after_abandoned_plugins', $websites, $all_groups_sites, $all_groups, $allPluginsOutdate, $decodedDismissedPlugins, $site_offset_for_groups );
?>
</div>
<?php
}
/**
* Renders abandoned themes tab.
*
* @param object $websites Object containing child sites info.
* @param array $all_groups_sites Array of all groups and sites.
* @param array $all_groups Array of all groups.
* @param array $allThemesOutdate Array of all abandoned plugins.
* @param array $decodedDismissedThemes Array of dismissed abandoned plugins.
* @param int $site_offset_for_groups Offset value.
* @param string $site_view Current site view.
*
* @uses \MainWP\Dashboard\MainWP_Updates_Per_Group::render_abandoned_themes()
* @uses \MainWP\Dashboard\MainWP_Updates_Per_Item::render_abandoned_themes()
* @uses \MainWP\Dashboard\MainWP_Updates_Per_Site::render_abandoned_themes()
*/
public static function render_abandoned_themes_tab( $websites, $all_groups_sites, $all_groups, $allThemesOutdate, $decodedDismissedThemes, $site_offset_for_groups, $site_view ) {
?>
<div class="ui active tab" data-tab="abandoned-themes">
<?php
/**
* Action: mainwp_updates_before_abandoned_themes
*
* Fires at the top of the Abandoned themes tab.
*
* @param object $websites Object containing child sites info.
* @param array $all_groups_sites Array of all groups and sites.
* @param array $all_groups Array of all groups.
* @param array $allThemesOutdate Array of all abandoned plugins.
* @param array $decodedDismissedThemes Array of dismissed abandoned plugins.
* @param int $site_offset_for_groups Offset value.
*
* @since 4.1
*/
do_action( 'mainwp_updates_before_abandoned_themes', $websites, $all_groups_sites, $all_groups, $allThemesOutdate, $decodedDismissedThemes, $site_offset_for_groups );
if ( MAINWP_VIEW_PER_SITE === $site_view ) {
/**
* Action: mainwp_updates_persite_before_abandoned_themes
*
* Fires at the top of the Abandoned themes tab, per Site view.
*
* @param object $websites Object containing child sites info.
* @param array $all_groups_sites Array of all groups and sites.
* @param array $all_groups Array of all groups.
* @param array $allThemesOutdate Array of all abandoned plugins.
* @param array $decodedDismissedThemes Array of dismissed abandoned plugins.
* @param int $site_offset_for_groups Offset value.
*
* @since 4.1
*/
do_action( 'mainwp_updates_persite_before_abandoned_themes', $websites, $all_groups_sites, $all_groups, $allThemesOutdate, $decodedDismissedThemes, $site_offset_for_groups );
MainWP_Updates_Per_Site::render_abandoned_themes( $websites, $allThemesOutdate, $decodedDismissedThemes );
/**
* Action: mainwp_updates_persite_after_abandoned_themes
*
* Fires at the bottom of the Abandoned themes tab, per Site view.
*
* @param object $websites Object containing child sites info.
* @param array $all_groups_sites Array of all groups and sites.
* @param array $all_groups Array of all groups.
* @param array $allThemesOutdate Array of all abandoned plugins.
* @param array $decodedDismissedThemes Array of dismissed abandoned plugins.
* @param int $site_offset_for_groups Offset value.
*
* @since 4.1
*/
do_action( 'mainwp_updates_persite_after_abandoned_themes', $websites, $all_groups_sites, $all_groups, $allThemesOutdate, $decodedDismissedThemes, $site_offset_for_groups );
} elseif ( MAINWP_VIEW_PER_GROUP === $site_view ) {
/**
* Action: mainwp_updates_pergroup_before_abandoned_themes
*
* Fires at the top of the Abandoned themes tab, per Group view.
*
* @param object $websites Object containing child sites info.
* @param array $all_groups_sites Array of all groups and sites.
* @param array $all_groups Array of all groups.
* @param array $allThemesOutdate Array of all abandoned plugins.
* @param array $decodedDismissedThemes Array of dismissed abandoned plugins.
* @param int $site_offset_for_groups Offset value.
*
* @since 4.1
*/
do_action( 'mainwp_updates_pergroup_before_abandoned_themes', $websites, $all_groups_sites, $all_groups, $allThemesOutdate, $decodedDismissedThemes, $site_offset_for_groups );
MainWP_Updates_Per_Group::render_abandoned_themes( $websites, $allThemesOutdate, $all_groups_sites, $all_groups, $site_offset_for_groups, $decodedDismissedThemes );
/**
* Action: mainwp_updates_pergroup_after_abandoned_themes
*
* Fires at the bottom of the Abandoned themes tab, per Group view.
*
* @param object $websites Object containing child sites info.
* @param array $all_groups_sites Array of all groups and sites.
* @param array $all_groups Array of all groups.
* @param array $allThemesOutdate Array of all abandoned plugins.
* @param array $decodedDismissedThemes Array of dismissed abandoned plugins.
* @param int $site_offset_for_groups Offset value.
*
* @since 4.1
*/
do_action( 'mainwp_updates_pergroup_after_abandoned_themes', $websites, $all_groups_sites, $all_groups, $allThemesOutdate, $decodedDismissedThemes, $site_offset_for_groups );
} else {
/**
* Action: mainwp_updates_pertheme_before_abandoned_themes
*
* Fires at the top of the Abandoned themes tab, per Theme view.
*
* @param object $websites Object containing child sites info.
* @param array $all_groups_sites Array of all groups and sites.
* @param array $all_groups Array of all groups.
* @param array $allThemesOutdate Array of all abandoned plugins.
* @param array $decodedDismissedThemes Array of dismissed abandoned plugins.
* @param int $site_offset_for_groups Offset value.
*
* @since 4.1
*/
do_action( 'mainwp_updates_pertheme_before_abandoned_themes', $websites, $all_groups_sites, $all_groups, $allThemesOutdate, $decodedDismissedThemes, $site_offset_for_groups );
MainWP_Updates_Per_Item::render_abandoned_themes( $websites, $allThemesOutdate, $decodedDismissedThemes );
/**
* Action: mainwp_updates_pertheme_after_abandoned_themes
*
* Fires at the bottom of the Abandoned themes tab, per Theme view.
*
* @param object $websites Object containing child sites info.
* @param array $all_groups_sites Array of all groups and sites.
* @param array $all_groups Array of all groups.
* @param array $allThemesOutdate Array of all abandoned plugins.
* @param array $decodedDismissedThemes Array of dismissed abandoned plugins.
* @param int $site_offset_for_groups Offset value.
*
* @since 4.1
*/
do_action( 'mainwp_updates_pertheme_after_abandoned_themes', $websites, $all_groups_sites, $all_groups, $allThemesOutdate, $decodedDismissedThemes, $site_offset_for_groups );
}
/**
* Action: mainwp_updates_after_abandoned_themes
*
* Fires at the bottom of the Abandoned themes tab.
*
* @param object $websites Object containing child sites info.
* @param array $all_groups_sites Array of all groups and sites.
* @param array $all_groups Array of all groups.
* @param array $allThemesOutdate Array of all abandoned plugins.
* @param array $decodedDismissedThemes Array of dismissed abandoned plugins.
* @param int $site_offset_for_groups Offset value.
*
* @since 4.1
*/
do_action( 'mainwp_updates_after_abandoned_themes', $websites, $all_groups_sites, $all_groups, $allThemesOutdate, $decodedDismissedThemes, $site_offset_for_groups );
?>
</div>
<?php
}
/**
* Renders JavaScript for update page.
*
* @param string $site_view current site view.
*/
public static function render_js_updates( $site_view ) {
$table_features = array(
'searching' => 'false',
'paging' => 'false',
'stateSave' => 'true',
'info' => 'false',
'exclusive' => 'false',
'duration' => '200',
);
/**
* Filter: mainwp_updates_table_features
*
* Filters the Updates table features.
*
* @since 4.1
*/
$table_features = apply_filters( 'mainwp_updates_table_features', $table_features );
?>
<script type="text/javascript">
jQuery( document ).ready( function () {
jQuery( '#mainwp-manage-updates .ui.accordion' ).accordion( {
"exclusive": <?php echo esc_html( $table_features['exclusive'] ); ?>,
"duration": <?php echo esc_html( $table_features['duration'] ); ?>,
onOpen: function(){
//mainwp_datatable_init_and_fix_recalc('table.mainwp-manage-updates-item-table');
}
} );
} );
mainwp_datatable_init_and_fix_recalc = function(selector){
jQuery(selector).each( function(e) {
if(jQuery(this).is(":visible")){
console.log('visible ' + jQuery(this).attr('id'));
jQuery(this).css( 'display', 'table' );
jQuery(this).DataTable().destroy();
let tb = jQuery(this).DataTable({
"paging":false,
"info": false,
"searching": false,
"ordering" : false,
"responsive": true
});
tb.columns.adjust();
tb.responsive.recalc();
}
});
}
jQuery( document ).on( 'click', '.trigger-all-accordion', function() {
if ( jQuery( this ).hasClass( 'active' ) ) {
jQuery( this ).removeClass( 'active' );
jQuery( '#mainwp-manage-updates .ui.accordion tr.title' ).each( function( i ) {
if ( jQuery( this ).hasClass( 'active' ) ) {
jQuery( this ).trigger( 'click' );
}
} );
} else {
jQuery( this ).addClass( 'active' );
jQuery( '#mainwp-manage-updates .ui.accordion tr.title' ).each( function( i ) {
if ( !jQuery( this ).hasClass( 'active' ) ) {
jQuery( this ).trigger( 'click' );
}
} );
}
} );
</script>
<?php
if ( MAINWP_VIEW_PER_GROUP === $site_view ) {
?>
<script type="text/javascript">
jQuery( document ).ready( function () {
updatesoverview_updates_init_group_view();
} );
</script>
<?php
}
}
/**
* Gets sites for updates
*
* @return object Object containing websites info.
*
* @uses \MainWP\Dashboard\MainWP_DB::query()
* @uses \MainWP\Dashboard\MainWP_DB::get_sql_website_by_id()
* @uses \MainWP\Dashboard\MainWP_DB::get_sql_websites_for_current_user()
* @uses \MainWP\Dashboard\MainWP_DB::fetch_object()
* @uses \MainWP\Dashboard\MainWP_DB::data_seek()
* @uses \MainWP\Dashboard\MainWP_System_Utility::get_current_wpid()
*/
public static function get_sites_for_current_user() {
/**
* Current user global.
*
* @global string
*/
global $current_user;
$current_wpid = MainWP_System_Utility::get_current_wpid();
if ( $current_wpid ) {
$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' ) );
} else {
$staging_enabled = is_plugin_active( 'mainwp-staging-extension/mainwp-staging-extension.php' ) || is_plugin_active( 'mainwp-timecapsule-extension/mainwp-timecapsule-extension.php' );
$is_staging = 'no';
if ( $staging_enabled ) {
$staging_updates_view = MainWP_System_Utility::get_select_staging_view_sites();
if ( 'staging' === $staging_updates_view ) {
$is_staging = 'yes';
}
}
$params = array(
'connected' => 'yes',
);
$limit_sites = get_option( 'mainwp_manage_updates_limit_sites' );
if ( ! empty( $limit_sites ) ) {
$params['limit_sites'] = $limit_sites;
}
$sql = MainWP_DB::instance()->get_sql_websites_for_current_user( false, null, 'wp.url', false, false, null, false, array( 'wp_upgrades', 'ignored_wp_upgrades', 'premium_upgrades', 'rollback_updates_data', 'plugins_outdate_dismissed', 'themes_outdate_dismissed', 'plugins_outdate_info', 'themes_outdate_info', 'favi_icon' ), $is_staging, $params );
}
return MainWP_DB::instance()->query( $sql );
}
/**
* Renders header tabs
*
* @param bool $show_language_updates show language update.
* @param string $current_tab current tab.
* @param int $total_wp_upgrades total WP update.
* @param int $total_plugin_upgrades total plugins update.
* @param int $total_theme_upgrades total themes update.
* @param int $total_translation_upgrades total translation update.
* @param int $total_plugins_outdate total plugins outdate.
* @param int $total_themes_outdate total theme outdate.
* @param string $site_view current site view.
*/
public static function render_header_tabs( $show_language_updates, $current_tab, $total_wp_upgrades, $total_plugin_upgrades, $total_theme_upgrades, $total_translation_upgrades, $total_plugins_outdate, $total_themes_outdate, $site_view ) { // phpcs:ignore -- NOSONAR -Current complexity is the only way to achieve desired results, pull request solutions appreciated.
/**
* Action: mainwp_updates_before_nav_tabs
*
* Fires before the navigation tabs on the Updates page.
*
* @since 4.1
*/
do_action( 'mainwp_updates_before_nav_tabs' );
$header_tabs = array(
'plugins-updates' => array(
'slug' => 'plugins-updates',
'title' => esc_html__( 'Plugin Updates', 'mainwp' ),
'total_upgrades' => $total_plugin_upgrades,
),
'themes-updates' => array(
'slug' => 'themes-updates',
'title' => esc_html__( 'Theme Updates', 'mainwp' ),
'total_upgrades' => $total_theme_upgrades,
),
'wordpress-updates' => array(
'slug' => 'wordpress-updates',
'title' => esc_html__( 'WordPress Updates', 'mainwp' ),
'total_upgrades' => $total_wp_upgrades,
),
);
if ( $show_language_updates ) {
$header_tabs['translations-updates'] = array(
'slug' => 'translations-updates',
'title' => esc_html__( 'Translations Updates', 'mainwp' ),
'total_upgrades' => $total_translation_upgrades,
);
}
$header_tabs['abandoned-plugins'] = array(
'slug' => 'abandoned-plugins',
'title' => esc_html__( 'Abandoned Plugins', 'mainwp' ),
'total_upgrades' => $total_plugins_outdate,
);
$header_tabs['abandoned-themes'] = array(
'slug' => 'abandoned-themes',
'title' => esc_html__( 'Abandoned Themes', 'mainwp' ),
'total_upgrades' => $total_themes_outdate,
);
$header_tabs = apply_filters( 'mainwp_page_hearder_tabs_updates', $header_tabs );
?>
<div id="mainwp-page-navigation-wrapper">
<div class="ui vertical menu mainwp-page-navigation">
<?php
foreach ( $header_tabs as $slug => $tab ) {
if ( empty( $tab['title'] ) ) {
continue;
}
?>
<a class="<?php echo $slug === $current_tab ? 'active' : ''; ?> item" data-tab="<?php echo esc_html( $slug ); ?>" href="admin.php?page=UpdatesManage&tab=<?php echo esc_html( $slug ); ?>"><?php echo esc_html( $tab['title'] ); ?><div class="ui small <?php echo empty( $tab['total_upgrades'] ) ? 'green' : 'red'; ?> label" timestamp="<?php echo esc_html( time() ); ?>"><?php echo intval( $tab['total_upgrades'] ); ?></div></a>
<?php
}
?>
</div>
</div>
<?php
$hide_show_updates_per = 'updates-ignore' === $current_tab ? true : false;
$hide_show_updates_per = apply_filters( 'mainwp_updates_hide_show_updates_per', $hide_show_updates_per, $current_tab );
$show_select_staging_sites = is_plugin_active( 'mainwp-staging-extension/mainwp-staging-extension.php' );
/**
* Action: mainwp_updates_after_nav_tabs
*
* Fires after the navigation tabs on the Updates page.
*
* @since 4.1
*/
do_action( 'mainwp_updates_after_nav_tabs' );
/**
* Action: mainwp_updates_before_actions_bar
*
* Fires before the actions bar on the Updates page.
*
* @since 4.1
*/
do_action( 'mainwp_updates_before_actions_bar' );
?>
<?php if ( ! $hide_show_updates_per || $show_select_staging_sites ) : ?>
<?php if ( ( 'plugins-updates' === $current_tab && 0 < $total_plugin_upgrades ) || ( 'themes-updates' === $current_tab && 0 < $total_theme_upgrades ) || ( 'wordpress-updates' === $current_tab && 0 < $total_wp_upgrades ) || ( 'translations-updates' === $current_tab && 0 < $total_translation_upgrades ) || ( 'abandoned-plugins' === $current_tab && 0 < $total_plugins_outdate ) || ( 'abandoned-themes' === $current_tab && 0 < $total_themes_outdate ) ) : ?>
<div class="mainwp-sub-header">
<div class="ui three column grid">
<div class="left aligned middle aligned column">
<?php static::render_updates_view_options( $site_view ); ?>
<?php
if ( $show_select_staging_sites ) {
static::render_select_staging_sites_view();
}
?>
</div>
<div class="center aligned middle aligned column"></div>
<div class="right aligned middle aligned column">
<?php
/**
* Action: mainwp_widget_updates_actions_top
*
* Updates actions top content.
*
* @since 5.4.1
*/
do_action( 'mainwp_widget_updates_actions_top', $current_tab );
?>
<?php static::render_updates_actions_buttons( $current_tab ); ?>
<?php static::render_button_view_ignored_updates( $current_tab ); ?>
<?php static::render_abandoned_plugins_themes_buttons( $current_tab ); ?>
</div>
</div>
</div>
<?php elseif ( $show_select_staging_sites ) : ?>
<div class="mainwp-sub-header">
<div class="ui three column grid">
<div class="left aligned middle aligned column">
<?php static::render_select_staging_sites_view(); ?>
</div>
<div class="center aligned middle aligned column"></div>
<div class="right aligned middle aligned column">
</div>
</div>
</div>
<?php endif; ?>
<?php endif; ?>
<?php
/**
* Action: mainwp_updates_after_actions_bar
*
* Fires after the actions bar on the Updates page.
*
* @since 4.1
*/
do_action( 'mainwp_updates_after_actions_bar' );
}
/**
* Method handle_post_staging_sites_view.
*
* @return void
*/
public static function handle_post_staging_sites_view() {
//phpcs:disable WordPress.Security.NonceVerification.Missing
if ( isset( $_POST['mainwpStagingNonceView'] ) && wp_verify_nonce( sanitize_key( $_POST['mainwpStagingNonceView'] ), 'mainwpStagingNonceView' ) ) {
global $current_user;
if ( isset( $_POST['select_staging_options_siteview'] ) && in_array( $_POST['select_staging_options_siteview'], array( 'live', 'staging' ), true ) ) {
update_user_option( $current_user->ID, 'mainwp_staging_options_updates_view', $_POST['select_staging_options_siteview'] );
}
}
//phpcs:enable WordPress.Security.NonceVerification.Missing
}
/**
* Method render_select_staging_sites_view.
*
* @return void
*/
public static function render_select_staging_sites_view() {
$view = MainWP_System_Utility::get_select_staging_view_sites();
$view_stagings = 'staging' === (string) $view ? true : false;
?>
<form method="post" action="" style="display:inline">
<select class="ui dropdown mini" id="mainwp_staging_select_options_siteview" name="select_staging_options_siteview">
<option value="live" <?php echo $view_stagings ? '' : 'selected'; ?>><?php esc_html_e( 'Production sites', 'mainwp' ); ?></option>
<option value="staging" <?php echo $view_stagings ? 'selected' : ''; ?>><?php esc_html_e( 'Staging sites', 'mainwp' ); ?></option>
</select>
<?php wp_nonce_field( 'mainwpStagingNonceView', 'mainwpStagingNonceView' ); ?>
</form>
<script type="text/javascript">
jQuery(document).ready(function ($) {
jQuery("#mainwp_staging_select_options_siteview").change(function() {
jQuery(this).closest("form").submit();
});
})
</script>
<?php
}
/**
* Method render_updates_view_options().
*
* @param mixed $site_view Site view.
* @return void
*/
public static function render_updates_view_options( $site_view = '' ) {
?>
<form method="post" action="" class="ui mini form" style="display:inline flow-root">
<?php wp_nonce_field( 'mainwp-admin-nonce' ); ?>
<div class="inline field">
<select class="ui mini dropdown" onchange="mainwp_siteview_onchange(this)" id="mainwp_select_options_siteview" name="select_mainwp_options_siteview">
<option value="1" class="item" <?php echo MAINWP_VIEW_PER_SITE === $site_view ? 'selected' : ''; ?>><?php esc_html_e( 'Show updates per Site', 'mainwp' ); ?></option>
<option value="0" class="item" <?php echo MAINWP_VIEW_PER_PLUGIN_THEME === $site_view ? 'selected' : ''; ?>><?php esc_html_e( 'Show updates per Item', 'mainwp' ); ?></option>
<option value="2" class="item" <?php echo MAINWP_VIEW_PER_GROUP === $site_view ? 'selected' : ''; ?>><?php esc_html_e( 'Show updates per Tag', 'mainwp' ); ?></option>
</select>
</div>
</form>
<?php
}
/**
* Method render_abandoned_plugins_themes_buttons().
*
* @param mixed $current_tab Current tab.
* @return void
*/
public static function render_abandoned_plugins_themes_buttons( $current_tab = '' ) {
if ( 'abandoned-plugins' === $current_tab ) {
?>
<a href="#" onClick="updatesoverview_bulk_check_abandoned('plugin'); return false;" class="ui green mini basic button"><?php esc_html_e( 'Check for Abandoned Plugins', 'mainwp' ); ?></a>
<?php } elseif ( 'abandoned-themes' === $current_tab ) { ?>
<a href="#" onClick="updatesoverview_bulk_check_abandoned('theme'); return false;" class="ui green mini basic button"><?php esc_html_e( 'Check for Abandoned Themes', 'mainwp' ); ?></a>
<?php
}
}
/**
* Method render_updates_actions_buttons().
*
* @param mixed $current_tab Current tab.
* @return void
*/
public static function render_updates_actions_buttons( $current_tab ) {
// dev-to-do: add checks if number of updates is higher than 0 to hide buttons when not needed.
if ( 'plugins-updates' === $current_tab ) {
if ( static::user_can_update_plugins() ) {
static::set_continue_update_html_selector( 'plugins_global_upgrade_all' );
?>
<a href="javascript:void(0)" onClick="updatesoverview_plugins_global_upgrade_all( false, true ); return false;" class="mainwp-update-selected-button ui mini green basic button"><?php esc_html_e( 'Update Selected Plugins', 'mainwp' ); ?></a>
<a href="javascript:void(0)" onClick="updatesoverview_plugins_global_upgrade_all(); return false;" class="mainwp-update-all-button ui mini green button"><?php esc_html_e( 'Update All Sites', 'mainwp' ); ?></a>
<?php
}
} elseif ( 'themes-updates' === $current_tab ) {
if ( static::user_can_update_themes() ) {
static::set_continue_update_html_selector( 'themes_global_upgrade_all' );
?>
<a href="javascript:void(0)" onClick="updatesoverview_themes_global_upgrade_all( false, true ); return false;" class="mainwp-update-selected-button ui mini green basic button"><?php esc_html_e( 'Update Selected Themes', 'mainwp' ); ?></a>
<a href="javascript:void(0)" onClick="updatesoverview_themes_global_upgrade_all(); return false;" class="mainwp-update-all-button ui mini green button"><?php esc_html_e( 'Update All Themes', 'mainwp' ); ?></a>
<?php
}
} elseif ( 'wordpress-updates' === $current_tab ) {
if ( static::user_can_update_wp() ) {
static::set_continue_update_html_selector( 'wpcore_global_upgrade_all' );
?>
<a href="javascript:void(0)" class="mainwp-update-selected-button ui green mini basic button" onclick="event.stopPropagation(); updatesoverview_wordpress_global_upgrade_all( false, true ); return false;"><?php esc_html_e( 'Update Selected WP Cores', 'mainwp' ); ?></a>
<a href="javascript:void(0)" class="mainwp-update-all-button ui green mini button" onclick="updatesoverview_wordpress_global_upgrade_all(); return false;"><?php esc_html_e( 'Update All WP Cores', 'mainwp' ); ?></a>
<?php
}
} elseif ( 'translations-updates' === $current_tab ) {
if ( static::user_can_update_trans() ) {
?>
<a href="javascript:void(0)" onClick="updatesoverview_translations_global_upgrade_all( false, true ); return false;" class="mainwp-update-selected-button ui button mini basic green"><?php esc_html_e( 'Update Selected Translations', 'mainwp' ); ?></a>
<a href="javascript:void(0)" onClick="updatesoverview_translations_global_upgrade_all(); return false;" class="mainwp-update-all-button ui button mini green"><?php esc_html_e( 'Update All Translations', 'mainwp' ); ?></a>
<?php
}
}
}
/**
* Method render_button_view_ignored_updates().
*
* @uses \MainWP\Dashboard\MainWP_DB_Common::get_user_extension()
* @uses \MainWP\Dashboard\MainWP_DB::get_sql_websites_for_current_user()
* @uses \MainWP\Dashboard\MainWP_DB::fetch_object()
*
* @param string $current_tab current tab.
*
* @return null
*/
public static function render_button_view_ignored_updates( $current_tab = '' ) { //phpcs:ignore -- NOSONAR - complex.
if ( ! in_array( $current_tab, array( 'wordpress-updates', 'plugins-updates', 'themes-updates' ) ) ) {
return;
}
$websites = MainWP_DB::instance()->query( MainWP_DB::instance()->get_sql_websites_for_current_user() );
$userExtension = MainWP_DB_Common::instance()->get_user_extension();
$decodedIgnoredPlugins = json_decode( $userExtension->ignored_plugins, true );
$decodedIgnoredThemes = json_decode( $userExtension->ignored_themes, true );
$decodedIgnoredCores = ! empty( $userExtension->ignored_wp_upgrades ) ? json_decode( $userExtension->ignored_wp_upgrades, true ) : array();
$cntp = 0;
$cntt = 0;
while ( $websites && ( $website = MainWP_DB::fetch_object( $websites ) ) ) {
$tmpDecodedIgnoredPlugins = json_decode( $website->ignored_plugins, true );
$tmpDecodedIgnoredThemes = json_decode( $website->ignored_themes, true );
if ( ! empty( $tmpDecodedIgnoredPlugins ) && is_array( $tmpDecodedIgnoredPlugins ) ) {
++$cntp;
}
if ( ! empty( $tmpDecodedIgnoredThemes ) && is_array( $tmpDecodedIgnoredThemes ) ) {
++$cntt;
}
}
$count_ignored_plugins = is_array( $decodedIgnoredPlugins ) ? count( $decodedIgnoredPlugins ) + $cntp : $cntp;
$count_ignored_themes = is_array( $decodedIgnoredThemes ) ? count( $decodedIgnoredThemes ) + $cntt : $cntt;
$count_ignored_cores = is_array( $decodedIgnoredCores ) ? count( $decodedIgnoredCores ) : 0;
?>
<?php if ( 'wordpress-updates' === $current_tab && 0 < $count_ignored_cores ) : ?>
<a class="ui mini basic button" href="admin.php?page=UpdatesManage&tab=updates-ignore" data-position="bottom right" data-tooltip="<?php esc_attr_e( 'Click here to see the list of ignored WordPress core updates.', 'mainwp' ); ?>" data-inverted=""><?php esc_html_e( 'View Ignored Updates', 'mainwp' ); ?></a>
<?php elseif ( 'plugins-updates' === $current_tab && 0 < $count_ignored_plugins ) : ?>
<a class="ui mini basic button" href="admin.php?page=PluginsIgnore"><?php esc_html_e( 'View Ignored Updates', 'mainwp' ); ?></a>
<?php elseif ( 'themes-updates' === $current_tab && 0 < $count_ignored_themes ) : ?>
<a class="ui mini basic button" href="admin.php?page=ThemesIgnore" ><?php esc_html_e( 'View Ignored Updates', 'mainwp' ); ?></a>
<?php endif; ?>
<?php
}
/**
* Method handle_limit_sites().
*/
public static function handle_limit_sites(){ // phpcs:ignore -- NOSONAR - complex function. Current complexity is the only way to achieve desired results, pull request solutions appreciated.
// put hook here before loading sites.
$limit_number = apply_filters( 'mainwp_manage_updates_limit_loading', false, 'updates' );
$current_limit = get_option( 'mainwp_manage_updates_limit_sites' );
if ( (int) $limit_number !== (int) $current_limit ) {
update_option( 'mainwp_manage_updates_limit_sites', $limit_number );
update_option( 'mainwp_manage_updates_limit_current_page', 1 );
}
if ( ! empty( $limit_number ) ) {
$count = MainWP_DB::instance()->get_websites_count( null, true );
$current_page = 1;
if ( isset( $_GET['current_page'] ) && isset( $_GET['_opennonce'] ) && wp_verify_nonce( sanitize_key( $_GET['_opennonce'] ), 'mainwp-admin-nonce' ) ) {
$current_page = intval( $_GET['current_page'] );
}
if ( 0 >= $current_page ) {
$current_page = 1;
}
$total_page = ceil( $count / $limit_number );
if ( $current_page > $total_page ) {
$current_page = $total_page;
}
update_option( 'mainwp_manage_updates_limit_current_page', $current_page );
}
}
/**
* Method render_limit_load_sites().
*
* @param int $limit_number limit loading sites.
*/
public static function render_limit_load_sites( $limit_number) { // phpcs:ignore -- NOSONAR - complex function. Current complexity is the only way to achieve desired results, pull request solutions appreciated.
$count = MainWP_DB::instance()->get_websites_count( null, true );
$total_page = ceil( $count / $limit_number );
$current_page = (int) get_option( 'mainwp_manage_updates_limit_current_page' );
$first = 1 === $current_page;
$last = $total_page <= $current_page;
?>
<div class="dt-paging paging_full_numbers">
<div class="ui stackable pagination menu"><menu>
<?php if ( $first ) { ?>
<li class="dt-paging-button item disabled"><div class="page-link first" aria-controls="mainwp-manage-sites-table" aria-disabled="true" aria-label="First" data-dt-idx="first" tabindex="-1">First</div></li>
<li class="dt-paging-button item disabled"><div class="page-link previous" aria-controls="mainwp-manage-sites-table" aria-disabled="true" aria-label="Previous" data-dt-idx="previous" tabindex="-1">Previous</div></li>
<?php } else { ?>
<li class="dt-paging-button item"><a href="admin.php?page=UpdatesManage" class="page-link first" aria-controls="mainwp-manage-sites-table" aria-label="First" data-dt-idx="first" tabindex="0">First</a></li>
<li class="dt-paging-button item"><a href="admin.php?page=UpdatesManage&current_page=<?php echo intval( $current_page - 1 ); ?>&_opennonce=<?php echo esc_html( wp_create_nonce( 'mainwp-admin-nonce' ) ); ?>" class="page-link previous" aria-controls="mainwp-manage-sites-table" aria-label="Previous" data-dt-idx="previous" tabindex="0">Previous</a></li>
<?php } ?>
<?php
for ( $i = 1; $i <= $total_page;$i++ ) {
?>
<li class="dt-paging-button item <?php echo $current_page === $i ? 'active' : ''; ?>"><a href="admin.php?page=UpdatesManage&current_page=<?php echo intval( $i ); ?>&_opennonce=<?php echo esc_html( wp_create_nonce( 'mainwp-admin-nonce' ) ); ?>" class="page-link" aria-controls="mainwp-manage-sites-table" aria-current="page" data-dt-idx="1" tabindex="0"><?php echo intval( $i ); ?></a></li>
<?php
}
?>
<?php if ( $last ) { ?>
<li class="dt-paging-button item disabled"><div class="page-link next" aria-controls="mainwp-manage-sites-table" aria-disabled="true" aria-label="Next" data-dt-idx="next" tabindex="-1">Next</div></li>
<li class="dt-paging-button item disabled"><div class="page-link last" aria-controls="mainwp-manage-sites-table" aria-disabled="true" aria-label="Last" data-dt-idx="last" tabindex="-1">Last</div></li>
<?php } else { ?>
<li class="dt-paging-button item"><a href="admin.php?page=UpdatesManage&current_page=<?php echo $current_page === $last ? intval( $last ) : intval( $current_page + 1 ); ?>&_opennonce=<?php echo esc_html( wp_create_nonce( 'mainwp-admin-nonce' ) ); ?>" class="page-link next" aria-controls="mainwp-manage-sites-table" aria-label="Next" data-dt-idx="next" tabindex="0">Next</a></li>
<li class="dt-paging-button item"><a href="admin.php?page=UpdatesManage&current_page=<?php echo intval( $total_page ); ?>&_opennonce=<?php echo esc_html( wp_create_nonce( 'mainwp-admin-nonce' ) ); ?>" class="page-link last" aria-controls="mainwp-manage-sites-table" aria-label="Last" data-dt-idx="last" tabindex="0">Last</a></li>
<?php } ?>
</menu></div>
</div>
<br/>
<?php
}
/**
* Cheks which primary backup plugin is being used.
*
* @param mixed $what Which backup plugin is being use.
* @param object $website Website array of information.
*
* @return boolean True|False.
*/
public static function activated_primary_backup_plugin( $what, $website ) {
$plugins = json_decode( $website->plugins, 1 );
if ( ! is_array( $plugins ) || empty( $plugins ) ) {
return false;
}
$checks = array(
'backupbuddy' => 'backupbuddy/backupbuddy.php',
'backupwp' => array( 'backwpup/backwpup.php', 'backwpup-pro/backwpup.php' ),
'updraftplus' => 'updraftplus/updraftplus.php',
);
$slug = isset( $checks[ $what ] ) ? $checks[ $what ] : '';
if ( empty( $slug ) ) {
return false;
}
$installed = false;
foreach ( $plugins as $plugin ) {
if ( ( is_string( $slug ) && strtolower( $plugin['slug'] ) === $slug ) || ( is_array( $slug ) && in_array( $plugin['slug'], $slug ) ) ) {
if ( $plugin['active'] ) {
$installed = true;
}
break;
}
}
return $installed;
}
/**
* Sets the HTML selector to continue updates.
*
* @param string $current_update current update string.
* @param bool $slug Whether to update slug.
*/
public static function set_continue_update_html_selector( $current_update, $slug = false ) {
$check_slug = true;
if ( ! empty( $slug ) ) {
$check_slug = ( $slug === static::$continue_update_slug ) ? true : false;
}
if ( $check_slug && $current_update === static::$continue_update ) {
static::$continue_selector = 'updatesoverview_continue_update_me';
} else {
static::$continue_selector = '';
}
}
/**
* Gets the HTML selector to continue updates.
*
* @return void.
*/
public static function get_continue_update_selector() {
echo esc_attr( static::$continue_selector );
}
/**
* Displays the updates modal window during updates.
*/
public static function render_updates_modal() {
?>
<div class="ui modal" id="updatesoverview-backup-box">
<div class="header"><?php esc_html_e( 'Backup Check', 'mainwp' ); ?></div>
<div class="scrolling content mainwp-modal-content"></div>
<div class="actions mainwp-modal-actions">
<input id="updatesoverview-backup-all" type="button" name="Backup All" value="<?php esc_html_e( 'Backup All', 'mainwp' ); ?>" class="button-primary"/>
<a id="updatesoverview-backup-now" href="javascript:void(0)" target="_blank" style="display: none" class="button-primary button"><?php esc_html_e( 'Backup Now', 'mainwp' ); ?></a>&nbsp;
<input id="updatesoverview-backup-ignore" type="button" name="Ignore" value="<?php esc_html_e( 'Ignore', 'mainwp' ); ?>" class="button"/>
</div>
</div>
<?php
}
/**
* Displays the plugin details modal window.
*/
public static function render_plugin_details_modal() {
?>
<div class="ui modal" id="mainwp-plugin-details-modal">
<i class="close icon"></i>
<div class="header"><?php echo esc_html__( 'Plugin Details', 'mainwp' ); ?></div>
<div class="content">
<div class="ui embed"></div>
</div>
<div class="actions">
</div>
</div>
<?php
}
/**
* Method render_screen_options_modal()
*
* Renders Page Settings Modal.
*/
public static function render_screen_options_modal() { // phpcs:ignore -- NOSONAR - complex method.
$snAutomaticDailyUpdate = (int) get_option( 'mainwp_automaticDailyUpdate' );
$snPluginAutomaticDailyUpdate = (int) get_option( 'mainwp_pluginAutomaticDailyUpdate' );
$snThemeAutomaticDailyUpdate = (int) get_option( 'mainwp_themeAutomaticDailyUpdate' );
$snTransAutomaticUpdate = (int) get_option( 'mainwp_transAutomaticDailyUpdate' );
$mainwp_show_language_updates = (int) get_option( 'mainwp_show_language_updates', 1 );
$disableUpdateConfirmations = (int) get_option( 'mainwp_disable_update_confirmations', 0 );
$delay_autoupdate = (int) get_option( 'mainwp_delay_autoupdate', 1 );
?>
<div class="ui modal" id="mainwp-manage-updates-screen-options-modal">
<i class="close icon"></i>
<div class="header"><?php esc_html_e( 'Page Settings', 'mainwp' ); ?></div>
<div class="scrolling content ui form">
<form method="POST" action="" id="manage-updates-screen-options-form" name="manage-updates-screen-options-form">
<?php wp_nonce_field( 'mainwp-admin-nonce' ); ?>
<input type="hidden" name="wp_nonce" value="<?php echo esc_attr( wp_create_nonce( 'UpdatesScrOptions' ) ); ?>" />
<div class="ui grid field">
<label class="six wide column middle aligned"><?php esc_html_e( 'Plugin advanced automatic updates', 'mainwp' ); ?></label>
<div class="ten wide column" data-tooltip="<?php esc_attr_e( 'Enable or disable automatic plugin updates.', 'mainwp' ); ?>" data-inverted="" data-position="bottom left">
<select name="mainwp_pluginAutomaticDailyUpdate" id="mainwp_pluginAutomaticDailyUpdate" class="ui dropdown">
<option value="1" <?php echo 1 === $snPluginAutomaticDailyUpdate ? 'selected' : ''; ?>><?php esc_html_e( 'Install Trusted Updates', 'mainwp' ); ?></option>
<option value="0" <?php echo ( false !== $snPluginAutomaticDailyUpdate && empty( $snPluginAutomaticDailyUpdate ) ) || 2 === $snPluginAutomaticDailyUpdate ? 'selected' : ''; ?>><?php esc_html_e( 'Disabled', 'mainwp' ); ?></option>
</select>
</div>
</div>
<div class="ui grid field">
<label class="six wide column middle aligned"><?php esc_html_e( 'Theme advanced automatic updates', 'mainwp' ); ?></label>
<div class="ten wide column" data-tooltip="<?php esc_attr_e( 'Enable or disable automatic theme updates.', 'mainwp' ); ?>" data-inverted="" data-position="top left">
<select name="mainwp_themeAutomaticDailyUpdate" id="mainwp_themeAutomaticDailyUpdate" class="ui dropdown">
<option value="1" <?php echo 1 === $snThemeAutomaticDailyUpdate ? 'selected' : ''; ?>><?php esc_html_e( 'Install Trusted Updates', 'mainwp' ); ?></option>
<option value="0" <?php echo ( false !== $snThemeAutomaticDailyUpdate && 0 === $snThemeAutomaticDailyUpdate ) || 2 === $snThemeAutomaticDailyUpdate ? 'selected' : ''; ?>><?php esc_html_e( 'Disabled', 'mainwp' ); ?></option>
</select>
</div>
</div>
<div class="ui grid field">
<label class="six wide column middle aligned"><?php esc_html_e( 'Translation advanced automatic updates', 'mainwp' ); ?></label>
<div class="ten wide column" data-tooltip="<?php esc_attr_e( 'Enable or disable automatic translation updates.', 'mainwp' ); ?>" data-inverted="" data-position="top left">
<select name="mainwp_transAutomaticDailyUpdate" id="mainwp_transAutomaticDailyUpdate" class="ui dropdown">
<option value="1" <?php echo 1 === $snTransAutomaticUpdate ? 'selected' : ''; ?>><?php esc_html_e( 'Install Trusted Updates', 'mainwp' ); ?></option>
<option value="0" <?php echo ( false !== $snTransAutomaticUpdate && 0 === $snTransAutomaticUpdate ) || 2 === $snTransAutomaticUpdate ? 'selected' : ''; ?>><?php esc_html_e( 'Disabled', 'mainwp' ); ?></option>
</select>
</div>
</div>
<div class="ui grid field">
<label class="six wide column middle aligned"><?php esc_html_e( 'WP Core advanced automatic updates', 'mainwp' ); ?></label>
<div class="ten wide column" data-tooltip="<?php esc_attr_e( 'Enable or disable automatic WordPress core updates.', 'mainwp' ); ?>" data-inverted="" data-position="top left">
<select name="mainwp_automaticDailyUpdate" id="mainwp_automaticDailyUpdate" class="ui dropdown">
<option value="1" <?php echo 1 === $snAutomaticDailyUpdate ? 'selected' : ''; ?>><?php esc_html_e( 'Install Trusted Updates', 'mainwp' ); ?></option>
<option value="0" <?php echo ( false !== $snAutomaticDailyUpdate && 0 === $snAutomaticDailyUpdate ) || 2 === $snAutomaticDailyUpdate ? 'selected' : ''; ?>><?php esc_html_e( 'Disabled', 'mainwp' ); ?></option>
</select>
</div>
</div>
<div class="ui grid field">
<label class="six wide column middle aligned"><?php esc_html_e( 'Advanced automatic updates delay', 'mainwp' ); ?></label>
<div class="ten wide column ui input" data-tooltip="<?php esc_attr_e( 'Set the number of days to delay automatic updates.', 'mainwp' ); ?>" data-inverted="" data-position="top left">
<select name="mainwp_delay_autoupdate" id="mainwp_delay_autoupdate" class="ui dropdown">
<option value="0" <?php echo 0 === $delay_autoupdate ? 'selected' : ''; ?>><?php esc_html_e( 'Delay off', 'mainwp' ); ?></option>
<option value="1" <?php echo 1 === $delay_autoupdate ? 'selected' : ''; ?>><?php esc_html_e( '1 day', 'mainwp' ); ?></option>
<option value="2" <?php echo 2 === $delay_autoupdate ? 'selected' : ''; ?>><?php esc_html_e( '2 days', 'mainwp' ); ?></option>
<option value="3" <?php echo 3 === $delay_autoupdate ? 'selected' : ''; ?>><?php esc_html_e( '3 days', 'mainwp' ); ?></option>
<option value="4" <?php echo 4 === $delay_autoupdate ? 'selected' : ''; ?>><?php esc_html_e( '4 days', 'mainwp' ); ?></option>
<option value="5" <?php echo 5 === $delay_autoupdate ? 'selected' : ''; ?>><?php esc_html_e( '5 days', 'mainwp' ); ?></option>
<option value="6" <?php echo 6 === $delay_autoupdate ? 'selected' : ''; ?>><?php esc_html_e( '6 days', 'mainwp' ); ?></option>
<option value="7" <?php echo 7 === $delay_autoupdate ? 'selected' : ''; ?>><?php esc_html_e( '7 days', 'mainwp' ); ?></option>
<option value="14" <?php echo 14 === $delay_autoupdate ? 'selected' : ''; ?>><?php esc_html_e( '14 days', 'mainwp' ); ?></option>
<option value="30" <?php echo 30 === $delay_autoupdate ? 'selected' : ''; ?>><?php esc_html_e( '30 days', 'mainwp' ); ?></option>
</select>
</div>
</div>
<div class="ui grid field">
<label class="six wide column middle aligned"><?php esc_html_e( 'Show WordPress language updates', 'mainwp' ); ?></label>
<div class="ten wide column ui toggle checkbox" data-tooltip="<?php esc_attr_e( 'Enable if you want to manage Translation updates', 'mainwp' ); ?>" data-inverted="" data-position="top left">
<input type="checkbox" name="mainwp_show_language_updates" id="mainwp_show_language_updates" <?php echo 1 === $mainwp_show_language_updates ? 'checked="true"' : ''; ?>/>
</div>
</div>
<div class="ui grid field">
<label class="six wide column middle aligned"><?php esc_html_e( 'Update confirmations', 'mainwp' ); ?></label>
<div class="ten wide column ui toggle checkbox" data-tooltip="<?php esc_attr_e( 'Choose if you want to disable the popup confirmations when performing updates.', 'mainwp' ); ?>" data-inverted="" data-position="top left">
<select name="mainwp_disable_update_confirmations" id="mainwp_disable_update_confirmations" class="ui dropdown">
<option value="0" <?php echo 0 === $disableUpdateConfirmations ? 'selected' : ''; ?>><?php esc_html_e( 'Enable', 'mainwp' ); ?></option>
<option value="2" <?php echo 2 === $disableUpdateConfirmations ? 'selected' : ''; ?>><?php esc_html_e( 'Disable', 'mainwp' ); ?></option>
<option value="1" <?php echo 1 === $disableUpdateConfirmations ? 'selected' : ''; ?>><?php esc_html_e( 'Disable for single updates', 'mainwp' ); ?></option>
</select>
</div>
</div>
<div class="ui hidden divider"></div>
<div class="ui hidden divider"></div>
</div>
<div class="actions">
<div class="ui two columns grid">
<div class="left aligned column"></div>
<div class="ui right aligned column">
<input type="submit" class="ui green button" name="btnSubmit" id="submit-manage-updates-settings" value="<?php esc_attr_e( 'Save Settings', 'mainwp' ); ?>" />
</div>
</div>
</div>
</form>
</div>
<?php
}
/**
* Method mainwp_help_content()
*
* Creates the MainWP Help Documentation List for the help component in the sidebar.
*/
public static function mainwp_help_content() {
if ( isset( $_GET['page'] ) && 'UpdatesManage' === $_GET['page'] ) { // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
?>
<p><?php esc_html_e( 'If you need help with managing updates, please review following help documents', 'mainwp' ); ?></p>
<div class="ui list">
<div class="item"><i class="external alternate icon"></i> <a href="https://mainwp.com/kb/manage-updates/#update-plugins" target="_blank">Update Plugins</a></div>
<div class="item"><i class="external alternate icon"></i> <a href="https://mainwp.com/kb/manage-updates/#plugins-auto-updates" target="_blank">Plugins Auto Updates</a></div>
<div class="item"><i class="external alternate icon"></i> <a href="https://mainwp.com/kb/manage-updates/#ignore-plugin-updates" target="_blank">Ignore Plugin Updates</a></div>
<div class="item"><i class="external alternate icon"></i> <a href="https://mainwp.com/kb/manage-updates/#update-themes" target="_blank">Update Themes</a></div>
<div class="item"><i class="external alternate icon"></i> <a href="https://mainwp.com/kb/manage-updates/#themes-auto-updates" target="_blank">Themes Auto Updates</a></div>
<div class="item"><i class="external alternate icon"></i> <a href="https://mainwp.com/kb/manage-updates/#ignore-theme-updates" target="_blank">Ignore Theme Updates</a></div>
<div class="item"><i class="external alternate icon"></i> <a href="https://mainwp.com/kb/manage-updates/#update-wordpress-core" target="_blank">Update WordPress Core</a></div>
<div class="item"><i class="external alternate icon"></i> <a href="https://mainwp.com/kb/manage-updates/#auto-update-wordpress-core" target="_blank">Auto Update WordPress Core</a></div>
<div class="item"><i class="external alternate icon"></i> <a href="https://mainwp.com/kb/manage-updates/#ignore-wordpress-core-update" target="_blank">Ignore WordPress Core Update</a></div>
<div class="item"><i class="external alternate icon"></i> <a href="https://mainwp.com/kb/manage-updates/#safe-updates---updates-rollback" target="_blank">Safe Updates/Updates Rollback</a></div>
<?php
/**
* Action: mainwp_updates_help_item
*
* Fires at the bottom of the help articles list in the Help sidebar on the Updates page.
*
* Suggested HTML markup:
*
* <div class="item"><a href="Your custom URL">Your custom text</a></div>
*
* @since 4.1
*/
do_action( 'mainwp_updates_help_item' );
?>
</div>
<?php
}
}
}