| 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_1_0 { |
| 9 |
|
| 10 |
protected $notices_content; |
| 11 |
|
| 12 |
/** |
| 13 |
* These variables are just short-hands to be used in advert content. |
| 14 |
* |
| 15 |
* @var array |
| 16 |
*/ |
| 17 |
protected $dashboard_top = array('top'); |
| 18 |
|
| 19 |
protected $dashboard_top_or_report = array('top', 'report', 'report-plain'); |
| 20 |
|
| 21 |
protected $dashboard_bottom_or_report = array('bottom', 'report', 'report-plain'); |
| 22 |
|
| 23 |
protected $anywhere = array('top', 'bottom', 'report', 'report-plain'); |
| 24 |
|
| 25 |
protected $autobackup = array('autobackup'); |
| 26 |
|
| 27 |
protected $autobackup_bottom_or_report = array('autobackup', 'bottom', 'report', 'report-plain'); |
| 28 |
|
| 29 |
protected function populate_notices_content() { |
| 30 |
// Global adverts that appear in all products will be returned to the child to display. |
| 31 |
return array(); |
| 32 |
} |
| 33 |
|
| 34 |
/** |
| 35 |
* Call this method to setup the notices. |
| 36 |
*/ |
| 37 |
abstract protected function notices_init(); |
| 38 |
|
| 39 |
public function is_plugin_installed($product = null, $also_require_active = false) { |
| 40 |
if ($also_require_active) return class_exists($product); |
| 41 |
if (!function_exists('get_plugins')) include_once(ABSPATH.'wp-admin/includes/plugin.php'); |
| 42 |
$plugins = get_plugins(); |
| 43 |
$product_file = false; |
| 44 |
foreach ($plugins as $key => $value) { |
| 45 |
if ($value['TextDomain'] == $product) { |
| 46 |
// We have found the plugin so return false so that we do not display this advert. |
| 47 |
return false; |
| 48 |
} |
| 49 |
} |
| 50 |
return true; |
| 51 |
} |
| 52 |
|
| 53 |
protected function translation_needed($plugin_base_dir, $product_name) { |
| 54 |
$wplang = get_locale(); |
| 55 |
if (strlen($wplang) < 1 || 'en_US' == $wplang || 'en_GB' == $wplang) return false; |
| 56 |
if (defined('WP_LANG_DIR') && is_file(WP_LANG_DIR.'/plugins/'.$product_name.'-'.$wplang.'.mo')) return false; |
| 57 |
if (is_file($plugin_base_dir.'/languages/'.$product_name.'-'.$wplang.'.mo')) return false; |
| 58 |
return true; |
| 59 |
} |
| 60 |
|
| 61 |
protected function url_start($html_allowed = false, $url, $https = false, $website_home = null) { |
| 62 |
$proto = ($https) ? 'https' : 'http'; |
| 63 |
if (strpos($url, $website_home) !== false) { |
| 64 |
return (($html_allowed) ? "<a href=".apply_filters(str_replace('.', '_', $website_home).'_link', $proto.'://'.$url).">" : ""); |
| 65 |
} else { |
| 66 |
return (($html_allowed) ? '<a href="'.$proto.'://'.$url.'">' : ""); |
| 67 |
} |
| 68 |
} |
| 69 |
|
| 70 |
protected function url_end($html_allowed, $url, $https = false) { |
| 71 |
$proto = (($https) ? 'https' : 'http'); |
| 72 |
return (($html_allowed) ? '</a>' : " (".$proto."://".$url.")"); |
| 73 |
} |
| 74 |
|
| 75 |
public function do_notice($notice = false, $position = 'top', $return_instead_of_echo = false) { |
| 76 |
|
| 77 |
$this->notices_init(); |
| 78 |
|
| 79 |
if (false === $notice) $notice = apply_filters('updraft_notices_force_id', false, $this); |
| 80 |
|
| 81 |
$notice_content = $this->get_notice_data($notice, $position); |
| 82 |
|
| 83 |
if (false != $notice_content) { |
| 84 |
return $this->render_specified_notice($notice_content, $return_instead_of_echo, $position); |
| 85 |
} |
| 86 |
} |
| 87 |
|
| 88 |
/** |
| 89 |
* This method will return a notice ready for display. |
| 90 |
* |
| 91 |
* @param boolean $notice Sends True or False if there are notices to show. |
| 92 |
* @param string $position Which screen position the notice is. |
| 93 |
* @return array Returns Notice data. |
| 94 |
*/ |
| 95 |
protected function get_notice_data($notice = false, $position = 'top') { |
| 96 |
|
| 97 |
// If a specific notice has been passed to this method then return that notice. |
| 98 |
if ($notice) { |
| 99 |
if (!isset($this->notices_content[$notice])) return false; |
| 100 |
|
| 101 |
// Does the notice support the position specified? |
| 102 |
if (isset($this->notices_content[$notice]['supported_positions']) && !in_array($position, $this->notices_content[$notice]['supported_positions'])) return false; |
| 103 |
|
| 104 |
// 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. |
| 105 |
$dismiss_time = $this->notices_content[$notice]['dismiss_time']; |
| 106 |
|
| 107 |
$dismiss = $this->check_notice_dismissed($dismiss_time); |
| 108 |
|
| 109 |
if ($dismiss) return false; |
| 110 |
|
| 111 |
return $this->notices_content[$notice]; |
| 112 |
} |
| 113 |
|
| 114 |
// 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. |
| 115 |
$available_notices = array(); |
| 116 |
|
| 117 |
// If Advert wasn't passed then next we should check to see if a seasonal advert can be returned. |
| 118 |
foreach ($this->notices_content as $notice_id => $notice_data) { |
| 119 |
// Does the notice support the position specified? |
| 120 |
if (isset($this->notices_content[$notice_id]['supported_positions']) && !in_array($position, $this->notices_content[$notice_id]['supported_positions'])) continue; |
| 121 |
|
| 122 |
// If the advert has a validity function, then require the advert to be valid. |
| 123 |
if (!empty($notice_data['validity_function']) && !call_user_func(array($this, $notice_data['validity_function']))) continue; |
| 124 |
|
| 125 |
|
| 126 |
if (isset($notice_data['valid_from']) && isset($notice_data['valid_to'])) { |
| 127 |
if ($this->skip_seasonal_notices($notice_data)) return $notice_data; |
| 128 |
} else { |
| 129 |
$dismiss_time = $this->notices_content[$notice_id]['dismiss_time']; |
| 130 |
$dismiss = $this->check_notice_dismissed($dismiss_time); |
| 131 |
|
| 132 |
if (!$dismiss) $available_notices[$notice_id] = $notice_data; |
| 133 |
} |
| 134 |
} |
| 135 |
|
| 136 |
if (empty($available_notices)) return false; |
| 137 |
|
| 138 |
// If a seasonal advert can't be returned then we will return a random advert. |
| 139 |
// 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. |
| 140 |
shuffle($available_notices); |
| 141 |
return $available_notices[0]; |
| 142 |
} |
| 143 |
|
| 144 |
protected function skip_seasonal_notices($notice_data) { |
| 145 |
return false; |
| 146 |
} |
| 147 |
|
| 148 |
public function get_affiliate_id() { |
| 149 |
return $this->self_affiliate_id; |
| 150 |
} |
| 151 |
|
| 152 |
abstract protected function check_notice_dismissed($dismiss_time); |
| 153 |
} |
| 154 |
|