Dropbox2
6 years ago
Google
6 years ago
checkout-embed
6 years ago
cloudfiles
12 years ago
handlebars
6 years ago
images
9 years ago
jquery.serializeJSON
7 years ago
jstree
6 years ago
labelauty
6 years ago
tether
6 years ago
tether-shepherd
7 years ago
updraftclone
6 years ago
S3.php
6 years ago
S3compat.php
6 years ago
cacert.pem
6 years ago
class-backup-history.php
6 years ago
class-commands.php
6 years ago
class-database-utility.php
6 years ago
class-filesystem-functions.php
6 years ago
class-job-scheduler.php
6 years ago
class-manipulation-functions.php
7 years ago
class-partialfileservlet.php
9 years ago
class-remote-send.php
6 years ago
class-semaphore.php
6 years ago
class-storage-methods-interface.php
6 years ago
class-udrpc.php
6 years ago
class-updraft-dashboard-news.php
6 years ago
class-updraftcentral-updraftplus-commands.php
8 years ago
class-updraftplus-encryption.php
6 years ago
class-wpadmin-commands.php
6 years ago
class-zip.php
6 years ago
ftp.class.php
7 years ago
get-cpanel-quota-usage.pl
12 years ago
google-extensions.php
9 years ago
jquery-ui.custom.css
7 years ago
jquery-ui.custom.min.css
7 years ago
jquery-ui.custom.min.css.map
7 years ago
jquery.blockUI.js
8 years ago
jquery.blockUI.min.js
8 years ago
updraft-admin-common.js
6 years ago
updraft-admin-common.min.js
6 years ago
updraft-notices.php
6 years ago
updraft-restorer-skin-compatibility.php
6 years ago
updraft-restorer-skin.php
6 years ago
updraftcentral.php
7 years ago
updraftplus-clone.php
6 years ago
updraftplus-login.php
7 years ago
updraftplus-notices.php
6 years ago
updraftplus-tour.php
7 years ago
updraftvault.php
6 years ago
updraft-notices.php
146 lines
| 1 | <?php |
| 2 | |
| 3 | if (!defined('ABSPATH')) die('No direct access allowed'); |
| 4 | |
| 5 | /** |
| 6 | * If we ever change the API of the Updraft_Notices class, then we'll need to rename and version it, e.g. Updraft_Notices_1_0, because otherwise a plugin may find that it's loaded an older instance than it wanted from another plugin. |
| 7 | */ |
| 8 | abstract class Updraft_Notices { |
| 9 | |
| 10 | protected $notices_content; |
| 11 | |
| 12 | // These variables are just short-hands to be used in advert content. |
| 13 | protected $dashboard_top = array('top'); |
| 14 | |
| 15 | protected $dashboard_top_or_report = array('top', 'report', 'report-plain'); |
| 16 | |
| 17 | protected $dashboard_bottom_or_report = array('bottom', 'report', 'report-plain'); |
| 18 | |
| 19 | protected $anywhere = array('top', 'bottom', 'report', 'report-plain'); |
| 20 | |
| 21 | protected $autobackup = array('autobackup'); |
| 22 | |
| 23 | protected $autobackup_bottom_or_report = array('autobackup', 'bottom', 'report', 'report-plain'); |
| 24 | |
| 25 | protected function populate_notices_content() { |
| 26 | // Global adverts that appear in all products will be returned to the child to display |
| 27 | return array(); |
| 28 | } |
| 29 | |
| 30 | /** |
| 31 | * Call this method to setup the notices |
| 32 | */ |
| 33 | abstract protected function notices_init(); |
| 34 | |
| 35 | protected function translation_needed($plugin_base_dir, $product_name) { |
| 36 | $wplang = get_locale(); |
| 37 | if (strlen($wplang) < 1 || 'en_US' == $wplang || 'en_GB' == $wplang) return false; |
| 38 | if (defined('WP_LANG_DIR') && is_file(WP_LANG_DIR.'/plugins/'.$product_name.'-'.$wplang.'.mo')) return false; |
| 39 | if (is_file($plugin_base_dir.'/languages/'.$product_name.'-'.$wplang.'.mo')) return false; |
| 40 | return true; |
| 41 | } |
| 42 | |
| 43 | protected function url_start($html_allowed = false, $url, $https = false, $website_home = null) { |
| 44 | $proto = ($https) ? 'https' : 'http'; |
| 45 | if (strpos($url, $website_home) !== false) { |
| 46 | return $html_allowed ? "<a href=".apply_filters(str_replace('.', '_', $website_home).'_link', $proto.'://'.$url).">" : ""; |
| 47 | } else { |
| 48 | return $html_allowed ? "<a href=\"$proto://$url\">" : ""; |
| 49 | } |
| 50 | } |
| 51 | |
| 52 | protected function url_end($html_allowed, $url, $https = false) { |
| 53 | $proto = ($https) ? 'https' : 'http'; |
| 54 | return $html_allowed ? '</a>' : " ($proto://$url)"; |
| 55 | } |
| 56 | |
| 57 | public function do_notice($notice = false, $position = 'top', $return_instead_of_echo = false) { |
| 58 | |
| 59 | $this->notices_init(); |
| 60 | |
| 61 | if (false === $notice) $notice = apply_filters('updraft_notices_force_id', false, $this); |
| 62 | |
| 63 | $notice_content = $this->get_notice_data($notice, $position); |
| 64 | |
| 65 | if (false != $notice_content) { |
| 66 | return $this->render_specified_notice($notice_content, $return_instead_of_echo, $position); |
| 67 | } |
| 68 | } |
| 69 | |
| 70 | /** |
| 71 | * This method will return a notice ready for display. |
| 72 | * |
| 73 | * @param boolean $notice the notice to grab the data |
| 74 | * @param string $position position of notice |
| 75 | * @return array |
| 76 | */ |
| 77 | protected function get_notice_data($notice = false, $position = 'top') { |
| 78 | |
| 79 | // If a specific notice has been passed to this method then return that notice. |
| 80 | if ($notice) { |
| 81 | if (!isset($this->notices_content[$notice])) return false; |
| 82 | |
| 83 | // Does the notice support the position specified? |
| 84 | if (isset($this->notices_content[$notice]['supported_positions']) && !in_array($position, $this->notices_content[$notice]['supported_positions'])) return false; |
| 85 | |
| 86 | /* |
| 87 | First check if the advert passed can be displayed and hasn't been dismissed, we do this by checking what dismissed value we should be checking. |
| 88 | */ |
| 89 | $dismiss_time = $this->notices_content[$notice]['dismiss_time']; |
| 90 | |
| 91 | $dismiss = $this->check_notice_dismissed($dismiss_time); |
| 92 | |
| 93 | if ($dismiss) return false; |
| 94 | |
| 95 | // If the advert has a validity function, then require the advert to be valid |
| 96 | if (!empty($this->notices_content[$notice]['validity_function']) && !call_user_func(array($this, $this->notices_content[$notice]['validity_function']))) return false; |
| 97 | |
| 98 | return $this->notices_content[$notice]; |
| 99 | } |
| 100 | |
| 101 | // create an array to add non-seasonal adverts to so that if a seasonal advert can't be returned we can choose a random advert from this array. |
| 102 | $available_notices = array(); |
| 103 | |
| 104 | // If Advert wasn't passed then next we should check to see if a seasonal advert can be returned. |
| 105 | foreach ($this->notices_content as $notice_id => $notice_data) { |
| 106 | // Does the notice support the position specified? |
| 107 | if (isset($this->notices_content[$notice_id]['supported_positions']) && !in_array($position, $this->notices_content[$notice_id]['supported_positions'])) continue; |
| 108 | |
| 109 | // If the advert has a validity function, then require the advert to be valid |
| 110 | if (!empty($notice_data['validity_function']) && !call_user_func(array($this, $notice_data['validity_function']))) continue; |
| 111 | |
| 112 | if (isset($notice_data['valid_from']) && isset($notice_data['valid_to'])) { |
| 113 | |
| 114 | if ($this->skip_seasonal_notices($notice_data)) return $notice_data; |
| 115 | |
| 116 | } else { |
| 117 | |
| 118 | $dismiss_time = $this->notices_content[$notice_id]['dismiss_time']; |
| 119 | $dismiss = $this->check_notice_dismissed($dismiss_time); |
| 120 | |
| 121 | if (!$dismiss) $available_notices[$notice_id] = $notice_data; |
| 122 | } |
| 123 | } |
| 124 | |
| 125 | if (empty($available_notices)) return false; |
| 126 | |
| 127 | // If a seasonal advert can't be returned then we will return a random advert |
| 128 | |
| 129 | // Here we give a 25% chance for the rate advert to be returned before selecting a random advert from the entire collection which also includes the rate advert |
| 130 | if (0 == rand(0, 3) && isset($available_notices['rate'])) return $available_notices['rate']; |
| 131 | |
| 132 | /* |
| 133 | Using shuffle here as something like rand which produces a random number and uses that as the array index fails, this is because in future an advert may not be numbered and could have a string as its key which will then cause errors. |
| 134 | */ |
| 135 | |
| 136 | shuffle($available_notices); |
| 137 | return $available_notices[0]; |
| 138 | } |
| 139 | |
| 140 | protected function skip_seasonal_notices($notice_data) {// phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable |
| 141 | return false; |
| 142 | } |
| 143 | |
| 144 | abstract protected function check_notice_dismissed($dismiss_time); |
| 145 | } |
| 146 |