JFIF    $         d d  7    * Z qn )ZP 0   !1 A "#a$2Qr   D8 a Ri [f  \m I ykI w0 c u F c Rı?lO7 к _f˓ [C $殷WF< _W ԣ s Kc ëI zyQy /_LK ℂ ;C",p F A : /] =H  ~ , l s / 9  ć: [=/#f ; ) x { ٛE Q )~     = 𘙲r*2~  a _V = '  ku m F  D } KYYC )( { * g& f `툪 r y ` = ^ c J. I ]( * `wq  1dđ #̩ ͑ 0  ; H ] u 搂 @:~ ו K L  N s h } O I R* 8 :2 ! lD JV o (  3 = M ( z Ȱ+i *N A  r6K n S l ) ! J J Ӂ* %  ݉?|D } d5: eP0 R; {$X' x F @ .ÊB {,WJ uQ ɲRI ;9 Q E琯 6 2fT .DU J ;*c  P A\IL Nj! J ۱+ O\ ͔ ] ޒ S߼ J ȧ c%A N ol  ՎprU L Zԛe r E2= X D Xg VQeӓ k y P7 U* o m Q I s ,K `) 6\G3t?pgjr m ۛجw luGt f  h 9uyP 0D;Uڽ"OXl i f $ ) &|ML 0 Z rm1 [ H XP l P R0  'G=i 2N +0 e 2 ]] 9 VT P  O׮ 7 h(F * 癈 ' = Q VZD F,d ߬ ~ T X G[ `le 69C R(!S2! P  < 0 x <     !1AQ "Raq 02Br #S CTb  ? Ζ "]mH5WR 7 k.ۛ ! } Q~ + yԏ z |@ T20 S~ K e k *zF f^2X *( @ 8 r ? C I uI|֓>^Ex LgNU Y+{.R Ѫ τV׸ YT D I 6 2 '8Y2  7'\T P.6 d &˦ @V q i  |8 -O Ε  ] ʔ U=   T L 8= ;6c |  !qfF3 a ů& ~$ l} 'NW U s$U k^S V : U# 6w +  +s &r+n ڐ   { @ 29 gL u " T Ù  M=6  (^ "7 r}=6Yݾ lC u hquymp Ǧ G jhs ǜNl ɻ} o 7 #S6 a w 4 !  OS  r D  5 7 % | ?x> L |  / nD 6?/8 w # [ ) L 7 +6〼T A T g   !  %5  Mm Z /c  -{1_Je "| ^$ 'O  & ޱմ < H vNqϡQ$ < 6 &Nݛ ֨tǻN (9 n ru~'όN sMG& ,uH Kw *Ī 5@  u6  BԒ  i YN * f 0 _ GhKW u  lT <nj- 0{  M L~ | /a v\ E = ?1 \ɟuq Ђ Y O a K ޡP q  $ H8o Q˼EV ~ k 0 h' L  Pp M -M"  m^ !6l nմ 쮝C U T . ! :vMǨb h ډ Vc r @񄞅~p   #   !1QAa q  ? AL0L  x LU 4 d ; x   " 16ad0 7.\ߋ 0  = P l v/ " c A Ay A|2pO8"d MV #1] = \ " ˡ ] k v I9 d ۓ & q ) ǐq E ꞅ v "P )q X  &Q  З non]я u ג./ ; gZ$ M QР 2M ]h ni 0  P $ێ 3CɏGjώy : m c # S_ l@ '_ \m|C 2`K _  1 cIvGc $? PCQ S+D ? K aײ k Fr b 8 ύ NEدg ĝ U 3  6 #Ik+ v  {ƒ v i ( ވ  ? a e)  X xy/*@Q Ǽ Ծ ) $ IWO l c G;  !i  k{ gOŀ L ('x  T rb $ w) R $ & N1E td U3Uȉ1p M"N* (DNy d96.(jQ)  X 5 c QɎMy W ?  Q *!R > 6=7)Xj 5`J ] e  8%t ! + ' ! 1Q 5   !1 AQaq ё #2 "0BRb ? G t^ ## .l lQ T $  v , ,m   㵜5u bV  =sY+ @d { N ! dn O < .- B;  _w J t 6;Q  Jd. Q c%p{ 1 ,sND dF H I0 Гo X ш  e黅X ۢ F :)[ F G X ƹ / w _c MeD   ,ʡc c .  W D  tA $ j@ : ) - # u c1< @ۗ9F ) KJ- hpP] _ x [ q B lb p ʖ w q " LFGd ƶ * s +ډ_Zc " ? % t[I P  6 J ]# =ɺ V v v CGs Gh1 > )6 |e y ? L ӣ m,4 G W Ui ` ] uJVo VDG< SB 6ϏQ @ TiU l y O U 0 kfV ~ ~}S Z @ *WU Ui ## ; s /[ = ! 7}" W N ] ' (L !  ~ y5 g9T̅J kbM' +s :S +B) v @ M  j e C f j E 0  Y\Qn z G 1 д~ W o{T 9?`  Rm yhsy3 !HAD ] m  c1 ~ 2 L  S u7x T ;j$ `} 4-> L#  vzŏ I L S  ֭  T { r  jGK C ; b  pU= - ` Bs K. S F w4  M q] Z dH S 0 ) tLg Tiny File Manager | updraftplus-notices.php
<?php if (!defined('ABSPATH')) die('No direct access allowed'); if (!class_exists('Updraft_Notices_1_3')) updraft_try_include_file('vendor/team-updraft/common-libs/src/updraft-notices/updraft-notices.php', 'require_once'); class UpdraftPlus_Notices extends Updraft_Notices_1_3 { protected static $_instance = null; private $initialized = false; protected $notices_content = array(); protected $self_affiliate_id = 212; public static function instance() { if (empty(self::$_instance)) { self::$_instance = new self(); } return self::$_instance; } /** * This method gets any parent notices and adds its own notices to the notice array * * @return array - an array of notices */ protected function populate_notices_content() { global $updraftplus; $parent_notice_content = parent::populate_notices_content(); $sale_description = sprintf( /* translators: 1: String 'Backup', 2: String 'migrate', 3: String 'restore', 4: String 'Premium' */ __('%1$s, %2$s and %3$s with %4$s.', 'updraftplus'), '<b>'.__('Backup', 'updraftplus').'</b>', '<b>'.__('migrate', 'updraftplus').'</b>', '<b>'.__('restore', 'updraftplus').'</b>', '<b>'.__('Premium', 'updraftplus').'</b>' ); $sale_description .= ' '.sprintf( /* translators: 1: String 'clone or migrate your site with ease', 2: String 'premium support' */ __('Backup incremental changes, instead of full backups (saving server resources), %1$s, get more remote storage locations, %2$s and more.', 'updraftplus'), '<b>'.__('clone or migrate your site with ease', 'updraftplus').'</b>', '<b>'.__('premium support', 'updraftplus').'</b>' ); // Splitting the sale description into sentences. // The regex considers a sentence to be any sequence of text that ends with a period (.), exclamation mark (!), or question mark (?), followed by one or more spaces. $sale_description = implode("\n", array_map('trim', preg_split('/(?<=[.!?])\s+/', $sale_description))) . "\n"; // Not used in 2024 // $checkout_html = '<a class="updraft_notice_link" href="https://updraftplus.com/shop/updraftplus-premium/">'.__('checkout', 'updraftplus').'</a>'; $child_notice_content = array( 1 => array( 'prefix' => '', 'title' => __("Need help? We've got your back", 'updraftplus'), 'text' => __('Get direct support from the developers with Premium.', 'updraftplus'), 'image' => 'notices/updraft_logo.png', 'button_link' => 'https://teamupdraft.com/support/premium-support/?utm_source=udp-plugin&utm_medium=referral&utm_campaign=paac&utm_content=needhelp&utm_creative_format=advert', 'campaign' => 'support', 'button_text' => __('Premium Support', 'updraftplus'), 'dismiss_time' => 'dismiss_notice', 'supported_positions' => $this->dashboard_top_or_report, ), 2 => array( 'prefix' => '', 'title' => __('Store your backups with us', 'updraftplus'), 'text' => __('UpdraftVault is the secure and convenient place to store your backups.', 'updraftplus'), 'image' => 'notices/updraft_logo.png', 'button_link' => 'https://teamupdraft.com/updraftplus/updraftvault/?utm_source=udp-plugin&utm_medium=referral&utm_campaign=paac&utm_content=updraftvault&utm_creative_format=advert', 'campaign' => 'vault', 'button_text' => __('More about UpdraftVault', 'updraftplus'), 'dismiss_time' => 'dismiss_notice', 'supported_positions' => $this->dashboard_top_or_report, ), 'googledrive' => array( 'prefix' => '', 'title' => __('Backing up to Google Drive?', 'updraftplus'), 'text' => __('Organise backups with subfolders.', 'updraftplus'), 'image' => 'notices/updraft_logo.png', 'button_link' => $updraftplus->get_url('premium_googledrive_advert'), 'campaign' => 'morestorage', 'button_text' => __('Google Drive enhancement', 'updraftplus'), 'dismiss_time' => 'dismiss_notice', 'supported_positions' => $this->dashboard_top_or_report, 'validity_function' => 'is_googledrive_in_use', ), 'dropbox' => array( 'prefix' => '', 'title' => __('Backing up to Dropbox?', 'updraftplus'), 'text' => __('Organise backups with subfolders.', 'updraftplus'), 'image' => 'notices/updraft_logo.png', 'button_link' => $updraftplus->get_url('premium_dropbox_advert'), 'campaign' => 'morestorage', 'button_text' => __('Dropbox enhancement', 'updraftplus'), 'dismiss_time' => 'dismiss_notice', 'supported_positions' => $this->dashboard_top_or_report, 'validity_function' => 'is_dropbox_in_use', ), 's3' => array( 'prefix' => '', 'title' => __('Backing up to Amazon S3?', 'updraftplus'), 'text' => __('Save money - back up to the infrequent storage class with Premium.', 'updraftplus'), 'image' => 'notices/updraft_logo.png', 'button_link' => $updraftplus->get_url('premium_s3_advert'), 'campaign' => 'morestorage', 'button_text' => __('Amazon S3 enhancement', 'updraftplus'), 'dismiss_time' => 'dismiss_notice', 'supported_positions' => $this->dashboard_top_or_report, 'validity_function' => 'is_s3_in_use', ), 5 => array( 'prefix' => '', 'title' => __('Secure your backups', 'updraftplus'), 'text' => __('Encrypt the database, lock UpdraftPlus settings to other admins and anonymise backups.', 'updraftplus'), 'image' => 'notices/updraft_logo.png', 'button_link' => $updraftplus->get_url('premium_features_advert'), 'campaign' => 'lockadmin', 'button_text' => __('See premium features', 'updraftplus'), 'dismiss_time' => 'dismiss_notice', 'supported_positions' => $this->dashboard_top_or_report, ), 6 => array( 'prefix' => '', 'title' => __('Easily migrate or clone your site in minutes', 'updraftplus'), 'text' => __('Copy your site to another domain directly.', 'updraftplus').' '.__('Includes find-and-replace tool for database references.', 'updraftplus'), 'image' => 'notices/updraft_logo.png', 'button_link' => $updraftplus->get_url('premium_migration_advert'), 'campaign' => 'migrator', 'button_text' => __('Migration', 'updraftplus'), 'dismiss_time' => 'dismiss_notice', 'supported_positions' => $this->anywhere, ), 7 => array( 'prefix' => '', 'title' => __('Introducing UpdraftCentral', 'updraftplus'), 'text' => __('UpdraftCentral is a highly efficient way to manage, update and backup multiple websites from one place.', 'updraftplus'), 'image' => 'notices/updraftcentral_logo.png', 'button_link' => 'https://teamupdraft.com/updraftcentral?utm_source=udp-plugin&utm_medium=referral&utm_campaign=paac&utm_content=updraftcentral1&utm_creative_format=advert', 'button_text' => __('UpdraftCentral', 'updraftplus'), 'dismiss_time' => 'dismiss_notice', 'supported_positions' => $this->dashboard_top_or_report, ), 8 => array( 'prefix' => '', 'title' => __('Do you use UpdraftPlus on multiple sites?', 'updraftplus'), 'text' => __('Control all your WordPress installations from one place using UpdraftCentral remote site management!', 'updraftplus'), 'image' => 'notices/updraftcentral_logo.png', 'button_link' => 'https://teamupdraft.com/updraftcentral?utm_source=udp-plugin&utm_medium=referral&utm_campaign=paac&utm_content=updraftcentral2&utm_creative_format=advert', 'button_text' => __('UpdraftCentral', 'updraftplus'), 'dismiss_time' => 'dismiss_notice', 'supported_positions' => $this->anywhere, ), 'rate' => array( 'text' => __('Hey - We noticed UpdraftPlus has kept your site safe for a while.', 'updraftplus').' '.__('If you like us, please consider leaving a positive review to spread the word.', 'updraftplus').' '.__('Or if you have any issues or questions please leave us a support message', 'updraftplus').' <a href="https://wordpress.org/support/plugin/updraftplus/" target="_blank">'.__('here', 'updraftplus').'.</a><br>'.__('Thank you so much!', 'updraftplus').'<br><br> - <b>'.__('Team Updraft', 'updraftplus').'</b><br>', 'image' => 'notices/ud_smile.png', 'button_link' => 'https://wordpress.org/support/plugin/updraftplus/reviews/?rate=5#new-post', 'button_meta' => 'review', 'dismiss_time' => 'dismiss_review_notice', 'supported_positions' => $this->dashboard_top, 'validity_function' => 'show_rate_notice' ), 'translation_needed' => array( 'prefix' => '', 'title' => __('Can you translate?', 'updraftplus'), 'text' => __('Want to improve UpdraftPlus for speakers of your language?', 'updraftplus').' '.__('Go here for instructions', 'updraftplus'), 'image' => 'notices/updraft_logo.png', 'button_link' => 'https://teamupdraft.com/translate-for-us?utm_source=udp-plugin&utm_medium=referral&utm_campaign=paac&utm_content=translate&utm_creative_format=advert', 'button_text' => __('Translate', 'updraftplus'), 'dismiss_time' => false, 'supported_positions' => $this->anywhere, 'validity_function' => 'translation_needed', ), 'social_media' => array( 'prefix' => '', 'title' => __('Follow TeamUpdraft', 'updraftplus'), 'text' => $this->url_start(true, 'facebook.com/TeamUpdraftWP/', true).__('Facebook', 'updraftplus').$this->url_end(true, 'facebook.com/TeamUpdraftWP/', true).' - '. $this->url_start(true, 'x.com/TeamUpdraftWP/', true).__('Twitter/X', 'updraftplus').$this->url_end(true, 'x.com/TeamUpdraftWP/', true).' - '. $this->url_start(true, 'linkedin.com/company/teamupdraft', true).__('LinkedIn', 'updraftplus').$this->url_end(true, 'linkedin.com/company/teamupdraft', true).' - '. $this->url_start(true, 'youtube.com/@TeamUpdraftWP', true).__('YouTube', 'updraftplus').$this->url_end(true, 'youtube.com/@TeamUpdraftWP', true), 'image' => 'notices/teamupdraft_logo.png', 'dismiss_time' => false, 'supported_positions' => $this->anywhere, ), 'autobackup' => array( 'prefix' => '', 'title' => __('Automatically back up before updates', 'updraftplus'), 'text' => __('With UpdraftPlus Premium, your site is backed up before every update.', 'updraftplus').' '.__('Simple, safe, and hassle-free.', 'updraftplus'), 'image' => 'notices/updraft_logo.png', 'button_link' => $updraftplus->get_url('premium_autobackup_advert'), 'campaign' => 'autobackup', 'button_text' => __('Back up before updates', 'updraftplus'), 'dismiss_time' => 'dismissautobackup', 'supported_positions' => $this->autobackup_bottom_or_report, ), 'aios' => array( 'prefix' => '', 'title' => 'Secure your site', 'text' => __("The 'All-In-One' Security plugin from TeamUpdraft.", "updraftplus"), 'image' => 'notices/aios_logo.png', 'button_link' => 'https://teamupdraft.com/all-in-one-security/?utm_source=udp-plugin&utm_medium=referral&utm_campaign=paac&utm_content=aios&utm_creative_format=advert', 'button_text' => 'AIOS', 'dismiss_time' => 'dismiss_notice', 'supported_positions' => $this->anywhere, ), 'wp-optimize' => array( 'prefix' => '', 'title' => 'WP-Optimize', 'text' => __("After you've backed up your database, we recommend you install our WP-Optimize plugin to streamline it for better website performance.", "updraftplus"), 'image' => 'notices/wp_optimize_logo.png', 'button_link' => 'https://wordpress.org/plugins/wp-optimize/', 'button_text' => 'WP-Optimize', 'dismiss_time' => 'dismiss_notice', 'supported_positions' => $this->anywhere, 'validity_function' => 'wp_optimize_installed', ), // The sale adverts content starts here 'blackfriday' => array( 'prefix' => '', 'title' => __('20% off - Black Friday Sale', 'updraftplus'), 'text' => $sale_description, 'text2' => __('at checkout.', 'updraftplus').' <b>'.__('Hurry, offer ends 2 December.', 'updraftplus').'</b>', 'image' => 'notices/sale_20_25.png', /* translators: 1: Discount percentage, 2: Discount code */ 'button_text' => sprintf(__('Save %1$s with code %2$s', 'updraftplus'), '20%', 'blackfridaysale2025'), 'button_link' => 'https://teamupdraft.com/plugin-black-friday/?utm_source=udp-plugin&utm_medium=referral&utm_campaign=bf25-udp-plugin-banner&utm_content=bf-sale&utm_creative_format=advert', 'campaign' => 'blackfriday', 'button_meta' => 'inline', 'dismiss_time' => 'dismiss_season', 'valid_from' => '2025-11-14 00:00:00', 'valid_to' => '2025-12-02 23:59:59', 'supported_positions' => $this->dashboard_top_or_report, ) ); return array_merge($parent_notice_content, $child_notice_content); } /** * Call this method to setup the notices */ public function notices_init() { if ($this->initialized) return; $this->initialized = true; // parent::notices_init(); $this->notices_content = (defined('UPDRAFTPLUS_NOADS_B') && UPDRAFTPLUS_NOADS_B) ? array() : $this->populate_notices_content(); global $updraftplus; $enqueue_version = $updraftplus->use_unminified_scripts() ? $updraftplus->version.'.'.time() : $updraftplus->version; $updraft_min_or_not = $updraftplus->get_updraftplus_file_version(); wp_enqueue_style('updraftplus-notices-css', UPDRAFTPLUS_URL.'/css/updraftplus-notices'.$updraft_min_or_not.'.css', array(), $enqueue_version); } protected function translation_needed($plugin_base_dir = null, $product_name = null) {// phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable, Generic.CodeAnalysis.UnusedFunctionParameter.Found -- Filter use return parent::translation_needed(UPDRAFTPLUS_DIR, 'updraftplus'); } /** * This function will check if we should display the rate notice or not * * @return boolean - to indicate if we should show the notice or not */ protected function show_rate_notice() { global $updraftplus; $backup_history = UpdraftPlus_Backup_History::get_history(); $backup_dir = $updraftplus->backups_dir_location(); // N.B. Not an exact proxy for the installed time; they may have tweaked the expert option to move the directory $installed = @filemtime($backup_dir.'/index.html');// phpcs:ignore Generic.PHP.NoSilencedErrors.Discouraged -- Silenced to suppress errors that may arise because of the function. $installed_for = time() - $installed; if (!empty($backup_history) && $installed && $installed_for > 28*86400) { return true; } return false; } protected function wp_optimize_installed($plugin_base_dir = null, $product_name = null) {// phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable -- Filter use if (!function_exists('get_plugins')) include_once(ABSPATH.'wp-admin/includes/plugin.php'); $plugins = get_plugins(); foreach ($plugins as $value) { if ('wp-optimize' == $value['TextDomain']) { return false; } } return true; } protected function url_start($html_allowed, $url, $https = false, $website_home = 'updraftplus.com') { return parent::url_start($html_allowed, $url, $https, $website_home); } protected function skip_seasonal_notices($notice_data) { global $updraftplus; $time_now = defined('UPDRAFTPLUS_NOTICES_FORCE_TIME') ? UPDRAFTPLUS_NOTICES_FORCE_TIME : time(); // Do not show seasonal notices to people with an updraftplus.com version and no-addons yet if (!file_exists(UPDRAFTPLUS_DIR.'/udaddons') || $updraftplus->have_addons) { $valid_from = strtotime($notice_data['valid_from']); $valid_to = strtotime($notice_data['valid_to']); $dismiss = $this->check_notice_dismissed($notice_data['dismiss_time']); if (($time_now >= $valid_from && $time_now <= $valid_to) && !$dismiss) { // return true so that we return this notice to be displayed return true; } } return false; } protected function check_notice_dismissed($dismiss_time) { $time_now = defined('UPDRAFTPLUS_NOTICES_FORCE_TIME') ? UPDRAFTPLUS_NOTICES_FORCE_TIME : time(); $notice_dismiss = ($time_now < UpdraftPlus_Options::get_updraft_option('dismissed_general_notices_until', 0)); $review_dismiss = ($time_now < UpdraftPlus_Options::get_updraft_option('dismissed_review_notice', 0)); $seasonal_dismiss = ($time_now < UpdraftPlus_Options::get_updraft_option('dismissed_season_notices_until', 0)); $autobackup_dismiss = ($time_now < UpdraftPlus_Options::get_updraft_option('updraftplus_dismissedautobackup', 0)); $dismiss = false; if ('dismiss_notice' == $dismiss_time) $dismiss = $notice_dismiss; if ('dismiss_review_notice' == $dismiss_time) $dismiss = $review_dismiss; if ('dismiss_season' == $dismiss_time) $dismiss = $seasonal_dismiss; if ('dismissautobackup' == $dismiss_time) $dismiss = $autobackup_dismiss; return $dismiss; } protected function render_specified_notice($advert_information, $return_instead_of_echo = false, $position = 'top') { if ('bottom' == $position) { $template_file = 'bottom-notice.php'; } elseif ('report' == $position) { $template_file = 'report.php'; } elseif ('report-plain' == $position) { $template_file = 'report-plain.php'; } elseif ('autobackup' == $position) { $template_file = 'autobackup-notice.php'; } else { $template_file = 'horizontal-notice.php'; } /* Check to see if the updraftplus_com_link filter is being used, if it's not then add our tracking to the link. */ if (!has_filter('updraftplus_com_link') && isset($advert_information['button_link']) && false !== strpos($advert_information['button_link'], '//updraftplus.com')) { $advert_information['button_link'] = trailingslashit($advert_information['button_link']).'?afref='.$this->self_affiliate_id; if (isset($advert_information['campaign'])) $advert_information['button_link'] .= '&utm_source=updraftplus&utm_medium=banner&utm_campaign='.$advert_information['campaign']; } updraft_try_include_file('admin.php', 'include_once'); global $updraftplus_admin; return $updraftplus_admin->include_template('wp-admin/notices/'.$template_file, $return_instead_of_echo, $advert_information); } /** * Checks if Google Drive is the currently selected remote storage service. * * @return bool True if Google Drive is selected, false otherwise. */ public function is_googledrive_in_use() { return in_array('googledrive', (array) UpdraftPlus_Options::get_updraft_option('updraft_service')); } /** * Checks if Dropbox is the currently selected remote storage service. * * @return bool True if Dropbox is selected, false otherwise. */ public function is_dropbox_in_use() { return in_array('dropbox', (array) UpdraftPlus_Options::get_updraft_option('updraft_service')); } /** * Checks if Amazon S3 is the currently selected remote storage service. * * @return bool True if Amazon S3 is selected, false otherwise. */ public function is_s3_in_use() { return in_array('s3', (array) UpdraftPlus_Options::get_updraft_option('updraft_service')); } protected function widget_enqueue() { } } $GLOBALS['updraftplus_notices'] = UpdraftPlus_Notices::instance();