Shortlinks by Pretty Links – Best WordPress Link Tracking Plugin - Version 2.0.5

Version Description

  • Fixed numerous bugs
Download this release

Release Info

Developer supercleanse
Plugin Icon 128x128 Shortlinks by Pretty Links – Best WordPress Link Tracking Plugin
Version 2.0.5
Comparing to
See all releases

Code changes from version 2.0.4 to 2.0.5

app/controllers/PrliAppController.php CHANGED
@@ -149,20 +149,47 @@ class PrliAppController extends PrliBaseController {
149
  $ui = $wp_scripts->query('jquery-ui-core');
150
  $url = "//ajax.googleapis.com/ajax/libs/jqueryui/{$ui->ver}/themes/smoothness/jquery-ui.css";
151
 
152
- if(strstr($hook, 'pretty') !== false) {
153
- wp_enqueue_style('pl-ui-smoothness', $url);
154
- wp_enqueue_script('jquery');
155
- wp_enqueue_script('jquery-ui-datepicker');
156
-
157
- wp_enqueue_style('prli-simplegrid', PRLI_CSS_URL.'/simplegrid.css', array(), PRLI_VERSION);
158
- wp_enqueue_style('prli-admin-shared', PRLI_CSS_URL.'/admin_shared.css', array('wp-pointer','prli-simplegrid'), PRLI_VERSION);
159
- wp_enqueue_style('prli-social', PRLI_CSS_URL.'/social_buttons.css', array(), PRLI_VERSION);
 
 
 
 
 
 
160
 
161
- wp_enqueue_script('prli-tooltip', PRLI_JS_URL.'/tooltip.js', array('jquery', 'wp-pointer'), PRLI_VERSION);
162
- wp_localize_script('prli-tooltip', 'PrliTooltip', array( 'show_about_notice' => $this->show_about_notice(),
163
- 'about_notice' => $this->about_notice() ));
164
 
165
- wp_enqueue_script('prli-admin-shared', PRLI_JS_URL.'/admin_shared.js', array('jquery','jquery-ui-sortable'), PRLI_VERSION);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
166
  }
167
 
168
  if( in_array( $hook, array( 'toplevel_page_pretty-link', 'pretty-link_page_add-new-pretty-link' ) ) ) {
@@ -308,9 +335,15 @@ class PrliAppController extends PrliBaseController {
308
 
309
  // Create the function use in the action hook
310
  public function add_dashboard_widgets() {
 
311
  $current_user = PrliUtils::get_currentuserinfo();
312
 
313
- if($current_user->user_level >= 8) {
 
 
 
 
 
314
  wp_add_dashboard_widget('prli_dashboard_widget', __('Pretty Link Quick Add', 'pretty-link'), array($this,'dashboard_widget_function'));
315
 
316
  // Globalize the metaboxes array, this holds all the widgets for wp-admin
149
  $ui = $wp_scripts->query('jquery-ui-core');
150
  $url = "//ajax.googleapis.com/ajax/libs/jqueryui/{$ui->ver}/themes/smoothness/jquery-ui.css";
151
 
152
+ if(strstr($hook, 'pretty-link') !== false) {
153
+ wp_register_style('pl-ui-smoothness', $url);
154
+ wp_register_style('prli-simplegrid', PRLI_CSS_URL.'/simplegrid.css', array(), PRLI_VERSION);
155
+ wp_register_style('prli-social', PRLI_CSS_URL.'/social_buttons.css', array(), PRLI_VERSION);
156
+ wp_enqueue_style(
157
+ 'prli-admin-shared',
158
+ PRLI_CSS_URL.'/admin_shared.css',
159
+ array(
160
+ 'wp-pointer',
161
+ 'prli-simplegrid',
162
+ 'prli-social',
163
+ ),
164
+ PRLI_VERSION
165
+ );
166
 
 
 
 
167
 
168
+ wp_register_script(
169
+ 'prli-tooltip',
170
+ PRLI_JS_URL.'/tooltip.js',
171
+ array('jquery', 'wp-pointer'),
172
+ PRLI_VERSION
173
+ );
174
+ wp_localize_script(
175
+ 'prli-tooltip',
176
+ 'PrliTooltip',
177
+ array(
178
+ 'show_about_notice' => $this->show_about_notice(),
179
+ 'about_notice' => $this->about_notice()
180
+ )
181
+ );
182
+ wp_enqueue_script(
183
+ 'prli-admin-shared',
184
+ PRLI_JS_URL.'/admin_shared.js',
185
+ array(
186
+ 'jquery',
187
+ 'jquery-ui-datepicker',
188
+ 'jquery-ui-sortable',
189
+ 'prli-tooltip'
190
+ ),
191
+ PRLI_VERSION
192
+ );
193
  }
194
 
195
  if( in_array( $hook, array( 'toplevel_page_pretty-link', 'pretty-link_page_add-new-pretty-link' ) ) ) {
335
 
336
  // Create the function use in the action hook
337
  public function add_dashboard_widgets() {
338
+ global $plp_options;
339
  $current_user = PrliUtils::get_currentuserinfo();
340
 
341
+ $role = 'administrator';
342
+ if(isset($plp_options->min_role)) {
343
+ $role = $plp_options->min_role;
344
+ }
345
+
346
+ if(current_user_can($role)) {
347
  wp_add_dashboard_widget('prli_dashboard_widget', __('Pretty Link Quick Add', 'pretty-link'), array($this,'dashboard_widget_function'));
348
 
349
  // Globalize the metaboxes array, this holds all the widgets for wp-admin
app/controllers/PrliPopupController.php ADDED
@@ -0,0 +1,242 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); }
2
+
3
+ class PrliPopupController extends PrliBaseController {
4
+ public $popup_css, $popup_js, $popups;
5
+
6
+ public function __construct() {
7
+ $cdn_base = 'https://cdnjs.cloudflare.com/ajax/libs/magnific-popup.js/1.1.0/';
8
+ $this->popup_css = "{$cdn_base}/magnific-popup.min.css";
9
+ $this->popup_js = "{$cdn_base}/jquery.magnific-popup.min.js";
10
+
11
+ // This is an array of the currently defined popups ...
12
+ // used to validate that the popup specified actually exists
13
+ $this->popups = array(
14
+ 'upgrade' => array(
15
+ 'after_usage' => true,
16
+ 'user_popup' => true,
17
+ 'lite_only_popup' => true,
18
+ 'delay' => MONTH_IN_SECONDS,
19
+ 'delay_after_last_popup' => WEEK_IN_SECONDS,
20
+ ),
21
+ 'rating' => array(
22
+ 'after_usage' => true,
23
+ 'user_popup' => true,
24
+ 'lite_only_popup' => true,
25
+ 'delay' => MONTH_IN_SECONDS,
26
+ 'delay_after_last_popup' => WEEK_IN_SECONDS,
27
+ ),
28
+ );
29
+ }
30
+
31
+ public function load_hooks() {
32
+ // This is a hidden option to help support in case
33
+ // there's a problem stopping or delaying a popup
34
+ $dap = get_option('prli_disable_all_popups');
35
+ if($dap) { return; }
36
+
37
+ add_action('admin_enqueue_scripts', array($this, 'enqueue_admin_scripts'));
38
+ add_action('wp_ajax_prli_stop_popup', array($this, 'ajax_stop_or_delay_popup'));
39
+ add_action('wp_ajax_prli_delay_popup', array($this, 'ajax_stop_or_delay_popup'));
40
+ add_action('admin_notices', array($this,'display_popups'));
41
+ }
42
+
43
+ public function enqueue_admin_scripts($hook) {
44
+ if(strstr($hook, 'pretty-link') !== false) {
45
+ wp_register_style('prli-magnific-popup', $this->popup_css);
46
+ wp_enqueue_style(
47
+ 'prli-admin-popup',
48
+ PRLI_CSS_URL.'/admin_popup.css',
49
+ array('prli-magnific-popup'),
50
+ PRLI_VERSION
51
+ );
52
+
53
+ wp_register_script('prli-magnific-popup', $this->popup_js, array('jquery'));
54
+ wp_enqueue_script(
55
+ 'prli-admin-popup',
56
+ PRLI_JS_URL.'/admin_popup.js',
57
+ array('jquery','prli-magnific-popup'),
58
+ PRLI_VERSION
59
+ );
60
+ $loc = array(
61
+ 'security' => wp_create_nonce('prli-admin-popup'),
62
+ 'error' => __('An unknown error occurred.', 'pretty-link')
63
+ );
64
+ wp_localize_script('prli-admin-popup','PrliPopup', $loc);
65
+ }
66
+ }
67
+
68
+ public function display_popups() {
69
+ // If this isn't a Pretty Link authorized user then bail
70
+ if(!PrliUtils::is_authorized()) { return; }
71
+
72
+ foreach($this->popups as $popup => $settings) {
73
+ $this->maybe_show_popup($popup);
74
+ }
75
+ }
76
+
77
+ public function ajax_stop_or_delay_popup() {
78
+ PrliUtils::check_ajax_referer('prli-admin-popup','security');
79
+
80
+ // If this isn't a Pretty Link authorized user then bail
81
+ if(!PrliUtils::is_authorized()) {
82
+ PrliUtils::exit_with_status(403,json_encode(array('error'=>__('Forbidden', 'pretty-link'))));
83
+ }
84
+
85
+ if(!isset($_POST['popup'])) {
86
+ PrliUtils::exit_with_status(400,json_encode(array('error'=>__('Must specify a popup', 'pretty-link'))));
87
+ }
88
+
89
+ $popup = sanitize_text_field($_POST['popup']);
90
+
91
+ if(!$this->is_valid_popup($popup)) {
92
+ PrliUtils::exit_with_status(400,json_encode(array('error'=>__('Invalid popup', 'pretty-link'))));
93
+ }
94
+
95
+ if($_POST['action']=='prli_delay_popup') {
96
+ $this->delay_popup($popup);
97
+ $message = __('The popup was successfully delayed', 'pretty-link');
98
+ }
99
+ else {
100
+ $this->stop_popup($popup); // TODO: Error handling
101
+ $message = __('The popup was successfully stopped', 'pretty-link');
102
+ }
103
+
104
+ PrliUtils::exit_with_status(200,json_encode(compact('message')));
105
+ }
106
+
107
+ private function is_valid_popup($popup) {
108
+ return in_array($popup,array_keys($this->popups));
109
+ }
110
+
111
+ private function stop_popup($popup) {
112
+ // TODO: Should we add some error handling?
113
+ if(!$this->is_valid_popup($popup)) { return; }
114
+
115
+ if($this->popups[$popup]['user_popup']) {
116
+ $user_id = PrliUtils::get_current_user_id();
117
+ update_user_meta($user_id, $this->popup_stop_key($popup), 1);
118
+ }
119
+ else {
120
+ update_option($this->popup_stop_key($popup), 1);
121
+ }
122
+ }
123
+
124
+ private function delay_popup($popup) {
125
+ // TODO: Should we add some error handling?
126
+ if(!$this->is_valid_popup($popup)) { return; }
127
+ set_transient(
128
+ $this->popup_delay_key($popup,$this->popups[$popup]['user_popup']),
129
+ 1,
130
+ $this->popups[$popup]['delay']
131
+ );
132
+ }
133
+
134
+ private function is_popup_delayed($popup) {
135
+ if(!$this->is_valid_popup($popup)) { $return; }
136
+
137
+ if($this->popups[$popup]['user_popup']) {
138
+ // check if it's been delayed or stopped
139
+ $user_id = PrliUtils::get_current_user_id();
140
+ return get_transient($this->popup_delay_key($popup));
141
+ }
142
+
143
+ return get_transient($this->popup_delay_key($popup));
144
+ }
145
+
146
+ private function is_popup_stopped($popup) {
147
+ if(!$this->is_valid_popup($popup)) { $return; }
148
+
149
+ if($this->popups[$popup]['user_popup']) {
150
+ $user_id = PrliUtils::get_current_user_id();
151
+ return get_user_meta($user_id, $this->popup_stop_key($popup), true);
152
+ }
153
+
154
+ return get_option($this->popup_stop_key($popup));
155
+ }
156
+
157
+ private function set_popup_last_viewed_timestamp($popup) {
158
+ $timestamp = time();
159
+ return update_option('prli-popup-last-viewed', compact('popup','timestamp'));
160
+ }
161
+
162
+ private function get_popup_last_viewed_timestamp() {
163
+ $default = array('popup'=>false,'timestamp'=>false);
164
+ return get_option('prli-popup-last-viewed',$default);
165
+ }
166
+
167
+ private function maybe_show_popup($popup) {
168
+ if($this->popup_visible($popup)) {
169
+ $this->increment_popup_display_count($popup);
170
+ $this->set_popup_last_viewed_timestamp($popup);
171
+ require(PRLI_VIEWS_PATH."/admin/popups/{$popup}.php");
172
+ }
173
+ }
174
+
175
+ private function popup_visible($popup) {
176
+ // ensure popup only shows up in lite
177
+ $prli_update = new PrliUpdateController();
178
+ if( ( $this->popups[$popup]['lite_only_popup'] &&
179
+ $prli_update->is_installed_and_activated()) ||
180
+ !$this->is_valid_popup($popup)) {
181
+ return false;
182
+ }
183
+
184
+ if($this->popups[$popup]['after_usage']) {
185
+ $click_count = PrliClick::get_count();
186
+ $first_click_date = PrliClick::get_first_date();
187
+ $link_count = PrliLink::get_count();
188
+ $first_link_date = PrliClick::get_first_date();
189
+
190
+ // Make sure user has been using Pretty Link for at least a month
191
+ $month_ago = time() - MONTH_IN_SECONDS;
192
+
193
+ if( $click_count < 10 ||
194
+ ($first_click_date!==false && strtotime($first_click_date) > $month_ago) ||
195
+ $link_count < 3 ||
196
+ strtotime($first_link_date) > $month_ago ) {
197
+ return false;
198
+ }
199
+ }
200
+
201
+ // If we're not yet past the delay threshold for the last viewed popup then don't show it
202
+ $last_viewed = $this->get_popup_last_viewed_timestamp();
203
+ if( !empty($last_viewed) &&
204
+ $last_viewed['popup']!=$popup &&
205
+ ((int)$last_viewed['timestamp'] + (int)$this->popups[$popup]['delay_after_last_popup']) > time() ) {
206
+ return false;
207
+ }
208
+
209
+ // This is for popups that should be displayed and resolved for each individual admin user
210
+ $delayed = $this->is_popup_delayed($popup);
211
+
212
+ // Popups displayed and resolved for any admin user in the system
213
+ $stopped = $this->is_popup_stopped($popup);
214
+
215
+ return (!$delayed && !$stopped);
216
+ }
217
+
218
+ private function increment_popup_display_count($popup) {
219
+ $user_id = PrliUtils::get_current_user_id();
220
+ $count = (int)get_user_meta($user_id, $this->popup_display_count_key($popup), true);
221
+ update_user_meta($user_id, $this->popup_display_count_key($popup), ++$count);
222
+ }
223
+
224
+ private function popup_display_count_key($popup) {
225
+ return "prli-{$popup}-popup-display-count";
226
+ }
227
+
228
+ private function popup_delay_key($popup) {
229
+ if($this->is_valid_popup($popup) && $this->popups[$popup]['user_popup']) {
230
+ $user_id = PrliUtils::get_current_user_id();
231
+ return "prli-delay-{$popup}-popup-for-{$user_id}";
232
+ }
233
+ else {
234
+ return "prli-delay-{$popup}-popup";
235
+ }
236
+ }
237
+
238
+ private function popup_stop_key($popup) {
239
+ return "prli-stop-{$popup}-popup";
240
+ }
241
+ }
242
+
app/models/PrliClick.php CHANGED
@@ -10,6 +10,35 @@ class PrliClick {
10
  $this->table_name = "{$wpdb->prefix}prli_clicks";
11
  }
12
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13
  public function get_exclude_where_clause( $where = '', $abbr = 'cl') {
14
  global $prli_options;
15
  $exclude_list = trim($prli_options->prli_exclude_ips);
10
  $this->table_name = "{$wpdb->prefix}prli_clicks";
11
  }
12
 
13
+ public static function get_count() {
14
+ global $wpdb, $prli_options, $prli_click;
15
+
16
+ if($prli_options->extended_tracking != 'count') {
17
+ $q = "SELECT COUNT(*) FROM {$prli_click->table_name}";
18
+ }
19
+ else {
20
+ $q = "
21
+ SELECT SUM(CAST(meta_value AS SIGNED))
22
+ FROM {$wpdb->prefix}prli_link_metas
23
+ WHERE meta_key='static-clicks'
24
+ ";
25
+ }
26
+
27
+ return $wpdb->get_var($q);
28
+ }
29
+
30
+ public static function get_first_date() {
31
+ global $wpdb, $prli_options, $prli_click;
32
+
33
+ if($prli_options->extended_tracking != 'count') {
34
+ $q = "SELECT min(created_at) FROM {$prli_click->table_name}";
35
+ return $wpdb->get_var($q);
36
+ }
37
+ else {
38
+ return false;
39
+ }
40
+ }
41
+
42
  public function get_exclude_where_clause( $where = '', $abbr = 'cl') {
43
  global $prli_options;
44
  $exclude_list = trim($prli_options->prli_exclude_ips);
app/models/PrliLink.php CHANGED
@@ -2,12 +2,24 @@
2
  if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); }
3
 
4
  class PrliLink {
5
- public $table_name;
6
-
7
- public function __construct() {
8
- global $wpdb;
9
- $this->table_name = "{$wpdb->prefix}prli_links";
10
- }
 
 
 
 
 
 
 
 
 
 
 
 
11
 
12
  public function create( $values ) {
13
  global $wpdb, $prli_link_meta;
2
  if(!defined('ABSPATH')) { die('You are not allowed to call this page directly.'); }
3
 
4
  class PrliLink {
5
+ public $table_name;
6
+
7
+ public function __construct() {
8
+ global $wpdb;
9
+ $this->table_name = "{$wpdb->prefix}prli_links";
10
+ }
11
+
12
+ public static function get_count() {
13
+ global $wpdb, $prli_link;
14
+ $q = "SELECT COUNT(*) FROM {$prli_link->table_name}";
15
+ return $wpdb->get_var($q);
16
+ }
17
+
18
+ public static function get_first_date() {
19
+ global $wpdb, $prli_link;
20
+ $q = "SELECT min(created_at) FROM {$prli_link->table_name}";
21
+ return $wpdb->get_var($q);
22
+ }
23
 
24
  public function create( $values ) {
25
  global $wpdb, $prli_link_meta;
app/models/PrliUtils.php CHANGED
@@ -1159,11 +1159,25 @@ class PrliUtils {
1159
  }
1160
 
1161
  public static function is_admin() {
1162
- return current_user_can('administrator');
1163
  }
1164
 
1165
  public static function is_subscriber() {
1166
- return (current_user_can('subscriber'));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1167
  }
1168
 
1169
  /* PLUGGABLE FUNCTIONS AS TO NOT STEP ON OTHER PLUGINS' CODE */
@@ -1178,6 +1192,11 @@ class PrliUtils {
1178
  return is_user_logged_in();
1179
  }
1180
 
 
 
 
 
 
1181
  public static function get_currentuserinfo() {
1182
  self::include_pluggables('wp_get_current_user');
1183
  $current_user = wp_get_current_user();
@@ -1190,6 +1209,16 @@ class PrliUtils {
1190
  }
1191
  }
1192
 
 
 
 
 
 
 
 
 
 
 
1193
  // Get new messages every 1/2 hour
1194
  public static function get_main_message($message = '',$expiration = 43200) { //43200 = 12 hours
1195
  global $plp_update;
@@ -1260,11 +1289,77 @@ class PrliUtils {
1260
  $prli_cap = 'install_plugins';
1261
 
1262
  if(empty($user_id)) {
1263
- return current_user_can($prli_cap);
1264
  }
1265
  else {
1266
  return user_can($user_id, $prli_cap);
1267
  }
1268
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1269
  }
1270
 
1159
  }
1160
 
1161
  public static function is_admin() {
1162
+ return self::current_user_can('add_users');
1163
  }
1164
 
1165
  public static function is_subscriber() {
1166
+ return (self::current_user_can('subscriber'));
1167
+ }
1168
+
1169
+ // Checks to see that the user is authorized to use Pretty Link based on the minimum role
1170
+ public static function is_authorized() {
1171
+ global $plp_options;
1172
+
1173
+ $prli_update = new PrliUpdateController();
1174
+
1175
+ $role = 'add_users';
1176
+ if($prli_update->is_installed_and_activated() && isset($plp_options) && isset($plp_options->min_role)) {
1177
+ $role = $plp_options->min_role;
1178
+ }
1179
+
1180
+ return self::current_user_can($role);
1181
  }
1182
 
1183
  /* PLUGGABLE FUNCTIONS AS TO NOT STEP ON OTHER PLUGINS' CODE */
1192
  return is_user_logged_in();
1193
  }
1194
 
1195
+ public static function check_ajax_referer($slug,$param) {
1196
+ self::include_pluggables('check_ajax_referer');
1197
+ return check_ajax_referer($slug,$param);
1198
+ }
1199
+
1200
  public static function get_currentuserinfo() {
1201
  self::include_pluggables('wp_get_current_user');
1202
  $current_user = wp_get_current_user();
1209
  }
1210
  }
1211
 
1212
+ public static function get_current_user_id() {
1213
+ self::include_pluggables('wp_get_current_user');
1214
+ return get_current_user_id();
1215
+ }
1216
+
1217
+ public static function current_user_can($role) {
1218
+ self::include_pluggables('wp_get_current_user');
1219
+ return current_user_can($role);
1220
+ }
1221
+
1222
  // Get new messages every 1/2 hour
1223
  public static function get_main_message($message = '',$expiration = 43200) { //43200 = 12 hours
1224
  global $plp_update;
1289
  $prli_cap = 'install_plugins';
1290
 
1291
  if(empty($user_id)) {
1292
+ return self::current_user_can($prli_cap);
1293
  }
1294
  else {
1295
  return user_can($user_id, $prli_cap);
1296
  }
1297
  }
1298
+
1299
+ public static function http_status_codes() {
1300
+ return array(
1301
+ 100 => 'Continue',
1302
+ 101 => 'Switching Protocols',
1303
+ 102 => 'Processing',
1304
+ 200 => 'OK',
1305
+ 201 => 'Created',
1306
+ 202 => 'Accepted',
1307
+ 203 => 'Non-Authoritative Information',
1308
+ 204 => 'No Content',
1309
+ 205 => 'Reset Content',
1310
+ 206 => 'Partial Content',
1311
+ 207 => 'Multi-Status',
1312
+ 300 => 'Multiple Choices',
1313
+ 301 => 'Moved Permanently',
1314
+ 302 => 'Found',
1315
+ 303 => 'See Other',
1316
+ 304 => 'Not Modified',
1317
+ 305 => 'Use Proxy',
1318
+ 306 => 'Switch Proxy',
1319
+ 307 => 'Temporary Redirect',
1320
+ 400 => 'Bad Request',
1321
+ 401 => 'Unauthorized',
1322
+ 402 => 'Payment Required',
1323
+ 403 => 'Forbidden',
1324
+ 404 => 'Not Found',
1325
+ 405 => 'Method Not Allowed',
1326
+ 406 => 'Not Acceptable',
1327
+ 407 => 'Proxy Authentication Required',
1328
+ 408 => 'Request Timeout',
1329
+ 409 => 'Conflict',
1330
+ 410 => 'Gone',
1331
+ 411 => 'Length Required',
1332
+ 412 => 'Precondition Failed',
1333
+ 413 => 'Request Entity Too Large',
1334
+ 414 => 'Request-URI Too Long',
1335
+ 415 => 'Unsupported Media Type',
1336
+ 416 => 'Requested Range Not Satisfiable',
1337
+ 417 => 'Expectation Failed',
1338
+ 418 => 'I\'m a teapot',
1339
+ 422 => 'Unprocessable Entity',
1340
+ 423 => 'Locked',
1341
+ 424 => 'Failed Dependency',
1342
+ 425 => 'Unordered Collection',
1343
+ 426 => 'Upgrade Required',
1344
+ 449 => 'Retry With',
1345
+ 450 => 'Blocked by Windows Parental Controls',
1346
+ 500 => 'Internal Server Error',
1347
+ 501 => 'Not Implemented',
1348
+ 502 => 'Bad Gateway',
1349
+ 503 => 'Service Unavailable',
1350
+ 504 => 'Gateway Timeout',
1351
+ 505 => 'HTTP Version Not Supported',
1352
+ 506 => 'Variant Also Negotiates',
1353
+ 507 => 'Insufficient Storage',
1354
+ 509 => 'Bandwidth Limit Exceeded',
1355
+ 510 => 'Not Extended'
1356
+ );
1357
+ }
1358
+
1359
+ public static function exit_with_status($status,$message='') {
1360
+ $codes = self::http_status_codes();
1361
+ header("HTTP/1.1 {$status} {$codes[$status]}", true, $status);
1362
+ exit($message);
1363
+ }
1364
  }
1365
 
app/views/admin/popups/rating.php ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php if(!defined('ABSPATH')) {die('You are not allowed to call this page directly.');} ?>
2
+
3
+ <div id="prli-rating-popup" class="mfp-hide prli-popup prli-auto-open">
4
+ <p><img src="<?php echo PRLI_IMAGES_URL . '/pl-logo-horiz-RGB.svg'; ?>" width="200" height="32" /></p>
5
+ <div>&nbsp;</div>
6
+ <h2><?php _e('Rate Pretty Link', 'pretty-link'); ?></h2>
7
+ <p><?php _e('If you enjoy using Pretty Link would you mind taking a moment to rate it on WordPress.org? It won\'t take more than a minute.', 'pretty-link'); ?></p>
8
+ <p><?php _e('Thanks for your support!', 'pretty-link'); ?></p>
9
+ <div>&nbsp;</div>
10
+ <div>&nbsp;</div>
11
+
12
+ <center>
13
+ <button data-popup="rating" class="prli-delay-popup button"><?php _e('Remind Me Later', 'pretty-link'); ?></button>
14
+ <button data-popup="rating" data-href="https://wordpress.org/plugins/pretty-link/" class="prli-delay-popup button-primary"><?php _e('Review Pretty Link', 'pretty-link'); ?></button>
15
+ <div>&nbsp;</div>
16
+ <a href="" data-popup="rating" class="prli-stop-popup"><?php _e('Never Remind Me Again', 'pretty-link'); ?></a>
17
+ </center>
18
+
19
+ </div>
20
+
app/views/admin/popups/upgrade.php ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php if(!defined('ABSPATH')) {die('You are not allowed to call this page directly.');} ?>
2
+
3
+ <div id="prli-upgrade-popup" class="mfp-hide prli-popup prli-auto-open">
4
+ <p><img src="<?php echo PRLI_IMAGES_URL . '/pl-logo-horiz-RGB.svg'; ?>" width="200" height="32" /></p>
5
+ <div>&nbsp;</div>
6
+ <h2><?php _e('Upgrade Pretty Link PRO', 'pretty-link'); ?></h2>
7
+ <p><?php _e('Upgrading will enable you to:', 'pretty-link'); ?><br/>
8
+ <ul>
9
+ <li>&nbsp;&nbsp;&nbsp;&bullet;&nbsp;<?php _e('Cloak links', 'pretty-link'); ?></li>
10
+ <li>&nbsp;&nbsp;&nbsp;&bullet;&nbsp;<?php _e('Redirect based on location', 'pretty-link'); ?></li>
11
+ <li>&nbsp;&nbsp;&nbsp;&bullet;&nbsp;<?php _e('Auto-prettylink your Pages &amp; Posts', 'pretty-link'); ?></li>
12
+ <li>&nbsp;&nbsp;&nbsp;&bullet;&nbsp;<?php _e('Auto-replace links throughout your site with Pretty Links', 'pretty-link'); ?></li>
13
+ <li>&nbsp;&nbsp;&nbsp;&bullet;&nbsp;<?php _e('And much, much more!', 'pretty-link'); ?></li>
14
+ </ul>
15
+ </p>
16
+ <p><?php _e('Plus, upgrading is fast, easy and won\'t disrupt any of your existing links or data. And there\'s even a 14 day money back guarantee.', 'pretty-link'); ?></p>
17
+ <p><?php _e('We think you\'ll love it!', 'pretty-link'); ?></p>
18
+ <div>&nbsp;</div>
19
+ <div>&nbsp;</div>
20
+
21
+ <center>
22
+ <button data-popup="upgrade" class="prli-delay-popup button"><?php _e('Remind Me Later', 'pretty-link'); ?></button>
23
+ <button data-popup="upgrade" data-href="https://prettylinkpro.com/pricing/plans/" class="prli-delay-popup button-primary"><?php _e('Upgrade to Pretty Link Pro', 'pretty-link'); ?></button>
24
+ <div>&nbsp;</div>
25
+ <a href="" data-popup="upgrade" class="prli-stop-popup"><?php _e('Never Remind Me Again', 'pretty-link'); ?></a>
26
+ </center>
27
+
28
+ </div>
29
+
css/admin_popup.css ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ .prli-popup {
2
+ position: relative;
3
+ background: #FFF;
4
+ padding: 20px;
5
+ width: auto;
6
+ max-width: 500px;
7
+ margin: 20px auto;
8
+ }
9
+
i18n/pretty-link.pot CHANGED
@@ -2,9 +2,9 @@
2
  # This file is distributed under the same license as the Pretty Link package.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: Pretty Link 2.0.4\n"
6
  "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/pretty-link\n"
7
- "POT-Creation-Date: 2017-02-09 22:28:15+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
@@ -17,7 +17,7 @@ msgstr ""
17
  msgid "Pretty Link | Manage Pretty Links"
18
  msgstr ""
19
 
20
- #. #-#-#-#-# pretty-link.pot (Pretty Link 2.0.4) #-#-#-#-#
21
  #. Plugin Name of the plugin/theme
22
  #: app/controllers/PrliAppController.php:37
23
  #: app/controllers/PrliAppController.php:46 app/views/links/form.php:47
@@ -46,7 +46,7 @@ msgstr ""
46
  msgid "Pretty Link | Clicks"
47
  msgstr ""
48
 
49
- #: app/controllers/PrliAppController.php:73 app/models/PrliClick.php:230
50
  #: app/views/clicks/list.php:4 app/views/groups/list.php:69
51
  #: pro/app/helpers/PlpPostsHelper.php:61 pro/app/views/links/form.php:36
52
  #: pro/app/views/links/form.php:48 pro/app/views/reports/custom-report.php:31
@@ -98,21 +98,21 @@ msgstr ""
98
  msgid "Buy"
99
  msgstr ""
100
 
101
- #: app/controllers/PrliAppController.php:252
102
  msgid ""
103
  "You're almost done!<br/>%1$sFinish your Re-Install of Pretty Link Pro%2$s"
104
  msgstr ""
105
 
106
- #: app/controllers/PrliAppController.php:259
107
  msgid "Pretty Link Pro Successfully Uninstalled."
108
  msgstr ""
109
 
110
- #: app/controllers/PrliAppController.php:314
111
  msgid "Pretty Link Quick Add"
112
  msgstr ""
113
 
114
- #: app/controllers/PrliAppController.php:352
115
- #: app/controllers/PrliAppController.php:371
116
  msgid ""
117
  "Your Pretty Link Pro installation isn't quite complete yet.<br/>"
118
  "%1$sAutomatically Upgrade to Enable Pretty Link Pro%2$s"
@@ -225,6 +225,30 @@ msgid ""
225
  "addresses or ranges."
226
  msgstr ""
227
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
228
  #: app/controllers/PrliToolsController.php:89
229
  msgid "Click Database was Cleared."
230
  msgstr ""
@@ -468,71 +492,71 @@ msgstr ""
468
  msgid "Send %s in an Email"
469
  msgstr ""
470
 
471
- #: app/models/PrliClick.php:208
472
  msgid "group: '%s'"
473
  msgstr ""
474
 
475
- #: app/models/PrliClick.php:211
476
  msgid "all links"
477
  msgstr ""
478
 
479
- #: app/models/PrliClick.php:218
480
  msgid "All clicks"
481
  msgstr ""
482
 
483
- #: app/models/PrliClick.php:221
484
  msgid "Unique hits"
485
  msgstr ""
486
 
487
- #: app/models/PrliClick.php:225 pro/app/helpers/PlpPostsHelper.php:66
488
  msgid "Pretty Link:"
489
  msgstr ""
490
 
491
- #: app/models/PrliClick.php:225
492
  msgid "on"
493
  msgstr ""
494
 
495
- #: app/models/PrliClick.php:225 pro/app/models/PlpReport.php:385
496
  msgid "between"
497
  msgstr ""
498
 
499
- #: app/models/PrliClick.php:225 pro/app/models/PlpReport.php:244
500
  #: pro/app/models/PlpReport.php:385
501
  msgid "and"
502
  msgstr ""
503
 
504
- #: app/models/PrliClick.php:230 pro/app/views/links/form.php:35
505
  #: pro/app/views/links/form.php:68
506
  msgid "Date"
507
  msgstr ""
508
 
509
- #: app/models/PrliLink.php:538
510
  msgid "Target URL can't be blank"
511
  msgstr ""
512
 
513
- #: app/models/PrliLink.php:542
514
  msgid "Pretty Link can't be blank"
515
  msgstr ""
516
 
517
- #: app/models/PrliLink.php:546
518
  msgid "Target URL must be different than the Pretty Link"
519
  msgstr ""
520
 
521
- #: app/models/PrliLink.php:550
522
  msgid "Link URL must be a correctly formatted url"
523
  msgstr ""
524
 
525
- #: app/models/PrliLink.php:554
526
  msgid ""
527
  "Pretty Link slugs must not contain question marks, ampersands or number "
528
  "signs."
529
  msgstr ""
530
 
531
- #: app/models/PrliLink.php:558
532
  msgid "Pretty Link slugs must not end with a slash (\"/\")"
533
  msgstr ""
534
 
535
- #: app/models/PrliLink.php:563
536
  msgid ""
537
  "This Pretty Link Slug is already taken. Check to make sure it isn't being "
538
  "used by another pretty link, post, page, category or tag slug. If none of "
@@ -548,6 +572,74 @@ msgstr ""
548
  msgid "ERROR"
549
  msgstr ""
550
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
551
  #: app/views/admin/update/activation_warning.php:4
552
  msgid "Error with PRETTYLINK_LICENSE_KEY: %s"
553
  msgstr ""
2
  # This file is distributed under the same license as the Pretty Link package.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: Pretty Link 2.0.5\n"
6
  "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/pretty-link\n"
7
+ "POT-Creation-Date: 2017-02-23 04:02:01+00:00\n"
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=UTF-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
17
  msgid "Pretty Link | Manage Pretty Links"
18
  msgstr ""
19
 
20
+ #. #-#-#-#-# pretty-link.pot (Pretty Link 2.0.5) #-#-#-#-#
21
  #. Plugin Name of the plugin/theme
22
  #: app/controllers/PrliAppController.php:37
23
  #: app/controllers/PrliAppController.php:46 app/views/links/form.php:47
46
  msgid "Pretty Link | Clicks"
47
  msgstr ""
48
 
49
+ #: app/controllers/PrliAppController.php:73 app/models/PrliClick.php:259
50
  #: app/views/clicks/list.php:4 app/views/groups/list.php:69
51
  #: pro/app/helpers/PlpPostsHelper.php:61 pro/app/views/links/form.php:36
52
  #: pro/app/views/links/form.php:48 pro/app/views/reports/custom-report.php:31
98
  msgid "Buy"
99
  msgstr ""
100
 
101
+ #: app/controllers/PrliAppController.php:279
102
  msgid ""
103
  "You're almost done!<br/>%1$sFinish your Re-Install of Pretty Link Pro%2$s"
104
  msgstr ""
105
 
106
+ #: app/controllers/PrliAppController.php:286
107
  msgid "Pretty Link Pro Successfully Uninstalled."
108
  msgstr ""
109
 
110
+ #: app/controllers/PrliAppController.php:347
111
  msgid "Pretty Link Quick Add"
112
  msgstr ""
113
 
114
+ #: app/controllers/PrliAppController.php:385
115
+ #: app/controllers/PrliAppController.php:404
116
  msgid ""
117
  "Your Pretty Link Pro installation isn't quite complete yet.<br/>"
118
  "%1$sAutomatically Upgrade to Enable Pretty Link Pro%2$s"
225
  "addresses or ranges."
226
  msgstr ""
227
 
228
+ #: app/controllers/PrliPopupController.php:62
229
+ msgid "An unknown error occurred."
230
+ msgstr ""
231
+
232
+ #: app/controllers/PrliPopupController.php:82
233
+ msgid "Forbidden"
234
+ msgstr ""
235
+
236
+ #: app/controllers/PrliPopupController.php:86
237
+ msgid "Must specify a popup"
238
+ msgstr ""
239
+
240
+ #: app/controllers/PrliPopupController.php:92
241
+ msgid "Invalid popup"
242
+ msgstr ""
243
+
244
+ #: app/controllers/PrliPopupController.php:97
245
+ msgid "The popup was successfully delayed"
246
+ msgstr ""
247
+
248
+ #: app/controllers/PrliPopupController.php:101
249
+ msgid "The popup was successfully stopped"
250
+ msgstr ""
251
+
252
  #: app/controllers/PrliToolsController.php:89
253
  msgid "Click Database was Cleared."
254
  msgstr ""
492
  msgid "Send %s in an Email"
493
  msgstr ""
494
 
495
+ #: app/models/PrliClick.php:237
496
  msgid "group: '%s'"
497
  msgstr ""
498
 
499
+ #: app/models/PrliClick.php:240
500
  msgid "all links"
501
  msgstr ""
502
 
503
+ #: app/models/PrliClick.php:247
504
  msgid "All clicks"
505
  msgstr ""
506
 
507
+ #: app/models/PrliClick.php:250
508
  msgid "Unique hits"
509
  msgstr ""
510
 
511
+ #: app/models/PrliClick.php:254 pro/app/helpers/PlpPostsHelper.php:66
512
  msgid "Pretty Link:"
513
  msgstr ""
514
 
515
+ #: app/models/PrliClick.php:254
516
  msgid "on"
517
  msgstr ""
518
 
519
+ #: app/models/PrliClick.php:254 pro/app/models/PlpReport.php:385
520
  msgid "between"
521
  msgstr ""
522
 
523
+ #: app/models/PrliClick.php:254 pro/app/models/PlpReport.php:244
524
  #: pro/app/models/PlpReport.php:385
525
  msgid "and"
526
  msgstr ""
527
 
528
+ #: app/models/PrliClick.php:259 pro/app/views/links/form.php:35
529
  #: pro/app/views/links/form.php:68
530
  msgid "Date"
531
  msgstr ""
532
 
533
+ #: app/models/PrliLink.php:550
534
  msgid "Target URL can't be blank"
535
  msgstr ""
536
 
537
+ #: app/models/PrliLink.php:554
538
  msgid "Pretty Link can't be blank"
539
  msgstr ""
540
 
541
+ #: app/models/PrliLink.php:558
542
  msgid "Target URL must be different than the Pretty Link"
543
  msgstr ""
544
 
545
+ #: app/models/PrliLink.php:562
546
  msgid "Link URL must be a correctly formatted url"
547
  msgstr ""
548
 
549
+ #: app/models/PrliLink.php:566
550
  msgid ""
551
  "Pretty Link slugs must not contain question marks, ampersands or number "
552
  "signs."
553
  msgstr ""
554
 
555
+ #: app/models/PrliLink.php:570
556
  msgid "Pretty Link slugs must not end with a slash (\"/\")"
557
  msgstr ""
558
 
559
+ #: app/models/PrliLink.php:575
560
  msgid ""
561
  "This Pretty Link Slug is already taken. Check to make sure it isn't being "
562
  "used by another pretty link, post, page, category or tag slug. If none of "
572
  msgid "ERROR"
573
  msgstr ""
574
 
575
+ #: app/views/admin/popups/rating.php:6
576
+ msgid "Rate Pretty Link"
577
+ msgstr ""
578
+
579
+ #: app/views/admin/popups/rating.php:7
580
+ msgid ""
581
+ "If you enjoy using Pretty Link would you mind taking a moment to rate it on "
582
+ "WordPress.org? It won't take more than a minute."
583
+ msgstr ""
584
+
585
+ #: app/views/admin/popups/rating.php:8
586
+ msgid "Thanks for your support!"
587
+ msgstr ""
588
+
589
+ #: app/views/admin/popups/rating.php:13 app/views/admin/popups/upgrade.php:22
590
+ msgid "Remind Me Later"
591
+ msgstr ""
592
+
593
+ #: app/views/admin/popups/rating.php:14
594
+ msgid "Review Pretty Link"
595
+ msgstr ""
596
+
597
+ #: app/views/admin/popups/rating.php:16 app/views/admin/popups/upgrade.php:25
598
+ msgid "Never Remind Me Again"
599
+ msgstr ""
600
+
601
+ #: app/views/admin/popups/upgrade.php:6
602
+ msgid "Upgrade Pretty Link PRO"
603
+ msgstr ""
604
+
605
+ #: app/views/admin/popups/upgrade.php:7
606
+ msgid "Upgrading will enable you to:"
607
+ msgstr ""
608
+
609
+ #: app/views/admin/popups/upgrade.php:9
610
+ msgid "Cloak links"
611
+ msgstr ""
612
+
613
+ #: app/views/admin/popups/upgrade.php:10
614
+ msgid "Redirect based on location"
615
+ msgstr ""
616
+
617
+ #: app/views/admin/popups/upgrade.php:11
618
+ msgid "Auto-prettylink your Pages &amp; Posts"
619
+ msgstr ""
620
+
621
+ #: app/views/admin/popups/upgrade.php:12
622
+ msgid "Auto-replace links throughout your site with Pretty Links"
623
+ msgstr ""
624
+
625
+ #: app/views/admin/popups/upgrade.php:13
626
+ msgid "And much, much more!"
627
+ msgstr ""
628
+
629
+ #: app/views/admin/popups/upgrade.php:16
630
+ msgid ""
631
+ "Plus, upgrading is fast, easy and won't disrupt any of your existing links "
632
+ "or data. And there's even a 14 day money back guarantee."
633
+ msgstr ""
634
+
635
+ #: app/views/admin/popups/upgrade.php:17
636
+ msgid "We think you'll love it!"
637
+ msgstr ""
638
+
639
+ #: app/views/admin/popups/upgrade.php:23
640
+ msgid "Upgrade to Pretty Link Pro"
641
+ msgstr ""
642
+
643
  #: app/views/admin/update/activation_warning.php:4
644
  msgid "Error with PRETTYLINK_LICENSE_KEY: %s"
645
  msgstr ""
js/admin_popup.js ADDED
@@ -0,0 +1,73 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ jQuery(document).ready(function($) {
2
+ $('.prli-popup.prli-auto-open').each( function() {
3
+ var _this = this;
4
+
5
+ $.magnificPopup.open({
6
+ items: {
7
+ src: _this,
8
+ type: 'inline'
9
+ },
10
+ closeOnBgClick: false,
11
+ closeBtnInside: false
12
+ });
13
+ });
14
+
15
+ var prli_stop_popup = function(popup, cb) {
16
+ var args = {
17
+ action: 'prli_stop_popup',
18
+ security: PrliPopup.security,
19
+ popup: popup,
20
+ };
21
+
22
+ $.post(ajaxurl, args, cb, 'json')
23
+ .fail(function(response) {
24
+ alert(PrliPopup.error);
25
+ $.magnificPopup.close();
26
+ });
27
+ };
28
+
29
+ $('.prli-stop-popup').on('click', function(e) {
30
+ e.preventDefault();
31
+
32
+ var _this = this;
33
+ var popup = $(this).data('popup');
34
+
35
+ prli_stop_popup(popup, function(response) {
36
+ $(_this).trigger('prli-popup-stopped',[popup]);
37
+ $.magnificPopup.close();
38
+ if(typeof $(_this).data('href') !== 'undefined') {
39
+ window.location.href = $(_this).data('href');
40
+ }
41
+ });
42
+ });
43
+
44
+ var prli_delay_popup = function(popup, cb) {
45
+ var args = {
46
+ action: 'prli_delay_popup',
47
+ security: PrliPopup.security,
48
+ popup: popup
49
+ };
50
+
51
+ $.post(ajaxurl, args, cb, 'json')
52
+ .fail(function(response) {
53
+ alert(PrliPopup.error);
54
+ $.magnificPopup.close();
55
+ });
56
+ };
57
+
58
+ $('.prli-delay-popup').on('click', function(e) {
59
+ e.preventDefault();
60
+
61
+ var _this = this;
62
+ var popup = $(this).data('popup');
63
+
64
+ prli_delay_popup(popup, function(response) {
65
+ $(_this).trigger('prli-popup-delayed',[popup]);
66
+ $.magnificPopup.close();
67
+ if(typeof $(_this).data('href') !== 'undefined') {
68
+ window.location.href = $(_this).data('href');
69
+ }
70
+ });
71
+ });
72
+ });
73
+
pretty-link.php CHANGED
@@ -3,7 +3,7 @@
3
  Plugin Name: Pretty Link
4
  Plugin URI: http://prettylinkpro.com
5
  Description: Shrink, track and share any URL on the Internet from your WordPress website!
6
- Version: 2.0.4
7
  Author: Blair Williams
8
  Author URI: http://blairwilliams.com
9
  Text Domain: pretty-link
3
  Plugin Name: Pretty Link
4
  Plugin URI: http://prettylinkpro.com
5
  Description: Shrink, track and share any URL on the Internet from your WordPress website!
6
+ Version: 2.0.5
7
  Author: Blair Williams
8
  Author URI: http://blairwilliams.com
9
  Text Domain: pretty-link
readme.txt CHANGED
@@ -66,6 +66,9 @@ http://blairwilliams.com/w7a
66
 
67
  == Changelog ==
68
 
 
 
 
69
  = 2.0.4 =
70
  * Fix URI params not sticking
71
  * PRO Fix apostrophe in keywords
@@ -154,6 +157,9 @@ http://blairwilliams.com/w7a
154
 
155
  == Upgrade Notice ==
156
 
 
 
 
157
  = 2.0.3 =
158
  * Important performance fix ... every user should upgrade.
159
 
66
 
67
  == Changelog ==
68
 
69
+ = 2.0.5 =
70
+ * Fixed numerous bugs
71
+
72
  = 2.0.4 =
73
  * Fix URI params not sticking
74
  * PRO Fix apostrophe in keywords
157
 
158
  == Upgrade Notice ==
159
 
160
+ = 2.0.5 =
161
+ * Important bug fixes, every user should upgrade.
162
+
163
  = 2.0.3 =
164
  * Important performance fix ... every user should upgrade.
165