Current Path : /var/www/html/wp-content/plugins/duplicator-pro/src/Views/ |
Current File : /var/www/html/wp-content/plugins/duplicator-pro/src/Views/DashboardWidget.php |
<?php namespace Duplicator\Views; use DUP_PRO_Package; use DUP_PRO_Package_Template_Entity; use DUP_PRO_PackageStatus; use DUP_PRO_Schedule_Entity; use Duplicator\Core\CapMng; use Duplicator\Core\Views\TplMng; use Duplicator\Models\Storages\AbstractStorageEntity; use Duplicator\Package\Recovery\RecoveryPackage; /** * Dashboard widget */ class DashboardWidget { const LAST_PACKAGE_TIME_WARNING = 86400; // 24 hours const LAST_PACKAGES_LIMIT = 3; const RECOMMENDED_PLUGIN_ENABLED = false; const RECOMMENDED_PLUGIN_DISMISSED_OPT_KEY = 'duplicator_recommended_plugin_dismissed'; /** * Add the dashboard widget * * @return void */ public static function init() { if (is_multisite()) { add_action('wp_network_dashboard_setup', array(__CLASS__, 'addDashboardWidget')); } else { add_action('wp_dashboard_setup', array(__CLASS__, 'addDashboardWidget')); } } /** * Render the dashboard widget * * @return void */ public static function addDashboardWidget() { if (!CapMng::can(CapMng::CAP_BASIC, false)) { return; } wp_add_dashboard_widget( 'duplicator_dashboard_widget', __('Duplicator', 'duplicator-pro'), array( __CLASS__, 'renderContent', ) ); } /** * Render the dashboard widget content * * @return void */ public static function renderContent() { TplMng::getInstance()->setStripSpaces(true); ?> <div class="dup-dashboard-widget-content"> <?php self::renderPackageCreate(); self::renderRecentlyPackages(); self::renderSections(); if (self::RECOMMENDED_PLUGIN_ENABLED) { // @phpstan-ignore-line self::renderRecommendedPluginSection(); } ?> </div> <?php } /** * Render the package create button * * @return void */ protected static function renderPackageCreate() { TplMng::getInstance()->render( 'parts/DashboardWidget/package-create-section', [ 'lastBackupString' => self::getLastBackupString(), ] ); } /** * Render the last packages * * @return void */ protected static function renderRecentlyPackages() { /** @var DUP_PRO_Package[] */ $packages = DUP_PRO_Package::get_packages_by_status( [ [ 'op' => '>=', 'status' => DUP_PRO_PackageStatus::COMPLETE, ], ], self::LAST_PACKAGES_LIMIT, 0, 'created DESC' ); $totalsIds = DUP_PRO_Package::get_ids_by_status( [ [ 'op' => '>=', 'status' => DUP_PRO_PackageStatus::COMPLETE, ], ] ); $failuresIds = DUP_PRO_Package::get_ids_by_status( [ [ 'op' => '<', 'status' => 0, ], ] ); TplMng::getInstance()->render( 'parts/DashboardWidget/recently-packages', [ 'packages' => $packages, 'totalPackages' => count($totalsIds), 'totalFailures' => count($failuresIds), ] ); } /** * Render Duplicate sections * * @return void */ protected static function renderSections() { if (($storages = AbstractStorageEntity::getIds()) === false) { $storages = []; } if (($templates = DUP_PRO_Package_Template_Entity::getAllWithoutManualMode()) === false) { $templates = []; } if (($schedules = DUP_PRO_Schedule_Entity::getIds()) === false) { $schedules = []; } $schedulesEnabled = DUP_PRO_Schedule_Entity::get_active(); $nextRunTime = -1; foreach ($schedulesEnabled as $schedule) { if ($schedule->next_run_time < $nextRunTime || $nextRunTime === -1) { $nextRunTime = $schedule->next_run_time; } } $nextDate = date(get_option('date_format'), $nextRunTime); $nextHours = date(get_option('time_format'), $nextRunTime); if ( ($recoverId = RecoveryPackage::getRecoverPackageId()) !== false && ($recoverPackage = DUP_PRO_Package::get_by_id($recoverId)) !== false ) { $recoverTime = (int) strtotime($recoverPackage->getCreated()); $recoverDate = date(get_option('date_format'), $recoverTime); $recoverHours = date(get_option('time_format'), $recoverTime); $recoverDateString = $recoverDate . ' ' . $recoverHours; } else { $recoverDateString = ''; } TplMng::getInstance()->render( 'parts/DashboardWidget/sections-section', [ 'numSchedules' => count($schedules), 'numSchedulesEnabled' => count($schedulesEnabled), 'numTemplates' => count($templates), 'numStorages' => count($storages), 'nextScheduleString' => ($nextRunTime >= 0 ? $nextDate . ' ' . $nextHours : ''), 'recoverDateString' => $recoverDateString, ] ); } /** * Get the last backup string * * @return string HTML string */ public static function getLastBackupString() { if (DUP_PRO_Package::isPackageRunning()) { return '<span class="spinner"></span> <b>' . esc_html__('A package is currently running.', 'duplicator-pro') . '</b>'; } /** @var DUP_PRO_Package[] */ $lastPackage = DUP_PRO_Package::get_packages_by_status( [ [ 'op' => '>=', 'status' => DUP_PRO_PackageStatus::COMPLETE, ], ], 1, 0, 'created DESC' ); if (empty($lastPackage)) { return '<b>' . esc_html__('No packages have been created yet.', 'duplicator-pro') . '</b>'; } $createdTime = date(get_option('date_format'), (int) strtotime($lastPackage[0]->getCreated())); if ($lastPackage[0]->getPackageLife() > self::LAST_PACKAGE_TIME_WARNING) { $timeDiffClass = 'maroon'; } else { $timeDiffClass = 'green'; } $timeDiff = sprintf( _x('%s ago', '%s represents the time diff, eg. 2 days', 'duplicator-pro'), $lastPackage[0]->getPackageLife('human') ); return '<b>' . $createdTime . '</b> ' . " (" . '<span class="' . $timeDiffClass . '"><b>' . $timeDiff . '</b></span>' . ")"; } /** * Return randomly chosen one of recommended plugins. * * @return false|array{name: string,slug: string,more: string,pro: array{file: string}} */ protected static function getRecommendedPluginData() { $plugins = [ 'google-analytics-for-wordpress/googleanalytics.php' => [ 'name' => __('MonsterInsights', 'duplicator-pro'), 'slug' => 'google-analytics-for-wordpress', 'more' => 'https://www.monsterinsights.com/', 'pro' => ['file' => 'google-analytics-premium/googleanalytics-premium.php'], ], 'all-in-one-seo-pack/all_in_one_seo_pack.php' => [ 'name' => __('AIOSEO', 'duplicator-pro'), 'slug' => 'all-in-one-seo-pack', 'more' => 'https://aioseo.com/', 'pro' => ['file' => 'all-in-one-seo-pack-pro/all_in_one_seo_pack.php'], ], 'coming-soon/coming-soon.php' => [ 'name' => __('SeedProd', 'duplicator-pro'), 'slug' => 'coming-soon', 'more' => 'https://www.seedprod.com/', 'pro' => ['file' => 'seedprod-coming-soon-pro-5/seedprod-coming-soon-pro-5.php'], ], 'wp-mail-smtp/wp_mail_smtp.php' => [ 'name' => __('WP Mail SMTP', 'duplicator-pro'), 'slug' => 'wp-mail-smtp', 'more' => 'https://wpmailsmtp.com/', 'pro' => ['file' => 'wp-mail-smtp-pro/wp_mail_smtp.php'], ], ]; $installed = get_plugins(); foreach ($plugins as $id => $plugin) { if (isset($installed[$id])) { unset($plugins[$id]); } if (isset($installed[$plugin['pro']['file']])) { unset($plugins[$id]); } } return ($plugins ? $plugins[ array_rand($plugins) ] : false); } /** * Recommended plugin block HTML. * * @return void */ public static function renderRecommendedPluginSection() { if (get_user_meta(get_current_user_id(), self::RECOMMENDED_PLUGIN_DISMISSED_OPT_KEY, true) != false) { return; } $plugin = self::getRecommendedPluginData(); if (empty($plugin)) { return; } $installUrl = wp_nonce_url( self_admin_url('update.php?action=install-plugin&plugin=' . rawurlencode($plugin['slug'])), 'install-plugin_' . $plugin['slug'] ); TplMng::getInstance()->render( 'parts/DashboardWidget/recommended-section', [ 'plugin' => $plugin, 'installUrl' => $installUrl, ] ); } }