AdRotate Banner Manager - Version 4.1

Version Description

  • Note: Graphs may show cluttered for previously collected stats.
  • [change] Stats now stored in daily increments again
  • [fix] Stats graphs now show more accurate dates/numbers for days
  • [fix] Close link for 'upgrade to AdRotate Pro' banner
  • [fix] Tracker data cleanup should now work

All recent changes are available on the AdRotate website.

=

Download this release

Release Info

Developer adegans
Plugin Icon 128x128 AdRotate Banner Manager
Version 4.1
Comparing to
See all releases

Code changes from version 4.0 to 4.1

adrotate-output.php CHANGED
@@ -687,7 +687,7 @@ function adrotate_notifications_dashboard() {
687
  echo ' <div class="ajdg_notification">';
688
  echo ' <div class="button_div"><a class="button" target="_blank" href="https://ajdg.solutions/products/adrotate-for-wordpress/?add-to-cart=1126&utm_campaign=adrotate-page&utm_medium=upgrade-banner-button&utm_source=adrotate-free">'.__('Buy now', 'adrotate').'</a></div>';
689
  echo ' <div class="text">'.__("You've been using <strong>AdRotate</strong> for a while now. Why not upgrade to the <strong>PRO</strong> version", 'adrotate').'?<br /><span>'.__('Use discount code <b>getadrotatepro</b> for 10% off on any AdRotate license!', 'adrotate' ).' '.__('Thank you for your purchase!', 'adrotate' ).'</span></div>';
690
- echo ' <a class="close_notification" href="admin.php?page=adrotate-pro&hide=1"><img title="Close" src="'.plugins_url('/images/icon-close.png', __FILE__).'" alt=""/></a>';
691
  echo ' <div class="icon"><img title="" src="'.plugins_url('/images/logo-60x60.png', __FILE__).'" alt=""/></div>';
692
  echo ' </div>';
693
  echo '</div>';
687
  echo ' <div class="ajdg_notification">';
688
  echo ' <div class="button_div"><a class="button" target="_blank" href="https://ajdg.solutions/products/adrotate-for-wordpress/?add-to-cart=1126&utm_campaign=adrotate-page&utm_medium=upgrade-banner-button&utm_source=adrotate-free">'.__('Buy now', 'adrotate').'</a></div>';
689
  echo ' <div class="text">'.__("You've been using <strong>AdRotate</strong> for a while now. Why not upgrade to the <strong>PRO</strong> version", 'adrotate').'?<br /><span>'.__('Use discount code <b>getadrotatepro</b> for 10% off on any AdRotate license!', 'adrotate' ).' '.__('Thank you for your purchase!', 'adrotate' ).'</span></div>';
690
+ echo ' <a class="close_notification" href="admin.php?page=adrotate&hide=1"><img title="Close" src="'.plugins_url('/images/icon-close.png', __FILE__).'" alt=""/></a>';
691
  echo ' <div class="icon"><img title="" src="'.plugins_url('/images/logo-60x60.png', __FILE__).'" alt=""/></div>';
692
  echo ' </div>';
693
  echo '</div>';
adrotate-setup.php CHANGED
@@ -418,6 +418,7 @@ function adrotate_database_install() {
418
  `responsive` char(1) NOT NULL default 'N',
419
  `type` varchar(10) NOT NULL default '0',
420
  `weight` int(3) NOT NULL default '6',
 
421
  `budget` double NOT NULL default '0',
422
  `crate` double NOT NULL default '0',
423
  `irate` double NOT NULL default '0',
@@ -486,6 +487,7 @@ function adrotate_database_install() {
486
  `day_fri` char(1) NOT NULL default 'Y',
487
  `day_sat` char(1) NOT NULL default 'Y',
488
  `day_sun` char(1) NOT NULL default 'Y',
 
489
  PRIMARY KEY (`id`),
490
  KEY `starttime` (`starttime`)
491
  ) ".$charset_collate.$engine.";");
@@ -945,6 +947,13 @@ function adrotate_database_upgrade() {
945
  $wpdb->query("DELETE FROM `{$wpdb->prefix}options` WHERE `option_name` LIKE '\_transient\_timeout\_adrotate\_%'");
946
  }
947
 
 
 
 
 
 
 
 
948
  update_option("adrotate_db_version", array('current' => ADROTATE_DB_VERSION, 'previous' => $adrotate_db_version['current']));
949
  }
950
 
@@ -1129,6 +1138,11 @@ function adrotate_core_upgrade() {
1129
  if(!wp_next_scheduled('adrotate_empty_trackerdata')) wp_schedule_event($firstrun, 'hourly', 'adrotate_empty_trackerdata');
1130
  }
1131
 
 
 
 
 
 
1132
  update_option("adrotate_version", array('current' => ADROTATE_VERSION, 'previous' => $adrotate_version['current']));
1133
  }
1134
 
@@ -1223,7 +1237,9 @@ function adrotate_empty_trackerdata() {
1223
  $clicks = $now - 86400;
1224
  $impressions = $now - 3600;
1225
 
1226
- $wpdb->query("DELETE FROM `{$wpdb->prefix}adrotate_tracker` WHERE (`timer` < {$clicks} AND `stat` = 'c') OR (`timer` < {$impressions} AND `stat` = 'i') OR `ipaddress` = 'unknown' OR `ipaddress` = '';");
 
 
1227
  }
1228
 
1229
  /*-------------------------------------------------------------
418
  `responsive` char(1) NOT NULL default 'N',
419
  `type` varchar(10) NOT NULL default '0',
420
  `weight` int(3) NOT NULL default '6',
421
+ `autodelete` char(1) NOT NULL default 'N',
422
  `budget` double NOT NULL default '0',
423
  `crate` double NOT NULL default '0',
424
  `irate` double NOT NULL default '0',
487
  `day_fri` char(1) NOT NULL default 'Y',
488
  `day_sat` char(1) NOT NULL default 'Y',
489
  `day_sun` char(1) NOT NULL default 'Y',
490
+ `autodelete` char(1) NOT NULL default 'N',
491
  PRIMARY KEY (`id`),
492
  KEY `starttime` (`starttime`)
493
  ) ".$charset_collate.$engine.";");
947
  $wpdb->query("DELETE FROM `{$wpdb->prefix}options` WHERE `option_name` LIKE '\_transient\_timeout\_adrotate\_%'");
948
  }
949
 
950
+ // Database: 63
951
+ // AdRotate: 4.1
952
+ if($adrotate_db_version['current'] < 63) {
953
+ adrotate_add_column("{$wpdb->prefix}adrotate", 'autodelete', 'char(1) NOT NULL default \'N\' AFTER `weight`');
954
+ adrotate_add_column("{$wpdb->prefix}adrotate_schedule", 'autodelete', 'char(1) NOT NULL default \'N\' AFTER `day_sun`');
955
+ }
956
+
957
  update_option("adrotate_db_version", array('current' => ADROTATE_DB_VERSION, 'previous' => $adrotate_db_version['current']));
958
  }
959
 
1138
  if(!wp_next_scheduled('adrotate_empty_trackerdata')) wp_schedule_event($firstrun, 'hourly', 'adrotate_empty_trackerdata');
1139
  }
1140
 
1141
+ // 4.1
1142
+ if($adrotate_version['current'] < 389) {
1143
+ adrotate_check_schedules();
1144
+ }
1145
+
1146
  update_option("adrotate_version", array('current' => ADROTATE_VERSION, 'previous' => $adrotate_version['current']));
1147
  }
1148
 
1237
  $clicks = $now - 86400;
1238
  $impressions = $now - 3600;
1239
 
1240
+ $wpdb->query("DELETE FROM `{$wpdb->prefix}adrotate_tracker` WHERE `timer` < {$impressions} AND `stat` = 'i';");
1241
+ $wpdb->query("DELETE FROM `{$wpdb->prefix}adrotate_tracker` WHERE `timer` < {$clicks} AND `stat` = 'c';");
1242
+ $wpdb->query("DELETE FROM `{$wpdb->prefix}adrotate_tracker` WHERE `ipaddress` = 'unknown' OR `ipaddress` = '';");
1243
  }
1244
 
1245
  /*-------------------------------------------------------------
adrotate-statistics.php CHANGED
@@ -173,6 +173,20 @@ function adrotate_stats_graph($type, $id, $chartid, $start, $end) {
173
  }
174
 
175
  if($stats) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
176
  $dates = $clicks = $impressions = ''; // To store the final graph data
177
  $day_start = $start; // Midnight of the day (start)
178
  $day_end = $day_start + 86399; // 1 second before midnight of the next day
@@ -186,17 +200,17 @@ function adrotate_stats_graph($type, $id, $chartid, $start, $end) {
186
  if(empty($graph[$i]['clicks'])) $graph[$i]['clicks'] = '0';
187
  if(empty($graph[$i]['impressions'])) $graph[$i]['impressions'] = '0';
188
 
189
- $count_clicks = $graph[$i]['clicks'] + $result['clicks'];
190
- $count_impressions = $graph[$i]['impressions'] + $result['impressions'];
191
  } else {
192
- $day_start += 86400;
193
- $day_end += 86400;
194
- $count_clicks = $result['clicks'];
195
- $count_impressions = $result['impressions'];
196
  $i++;
197
  }
198
- $graph[$i] = array('thetime' => $day_start, 'clicks' => $count_clicks, 'impressions' => $count_impressions);
199
- unset($count_clicks, $count_impressions);
200
  }
201
 
202
  foreach($graph as $result) {
@@ -204,6 +218,7 @@ function adrotate_stats_graph($type, $id, $chartid, $start, $end) {
204
  $clicks .= ','.$result['clicks'];
205
  $impressions .= ','.$result['impressions'];
206
  }
 
207
 
208
  $dates = trim($dates, ",");
209
  $clicks = trim($clicks, ",");
@@ -212,7 +227,7 @@ function adrotate_stats_graph($type, $id, $chartid, $start, $end) {
212
  $output = '';
213
  $output .= '<div id="chart-1" style="height:300px; width:100%;"></div>';
214
  $output .= adrotate_draw_graph($chartid, $dates, $clicks, $impressions);
215
- unset($stats, $dates, $clicks, $impressions);
216
  } else {
217
  $output = __('No data to show!', 'adrotate');
218
  }
173
  }
174
 
175
  if($stats) {
176
+ /* -- Add in 4.7 or so -- //
177
+ $dates = $clicks = $impressions = '';
178
+
179
+ foreach($stats as $result) {
180
+ if(empty($result['clicks'])) $result['clicks'] = '0';
181
+ if(empty($result['impressions'])) $result['impressions'] = '0';
182
+
183
+ $dates .= ',"'.date_i18n("d M", $result['thetime']).'"';
184
+ $clicks .= ','.$result['clicks'];
185
+ $impressions .= ','.$result['impressions'];
186
+ }
187
+ // -- End Add -- */
188
+
189
+ // -- Remove in 4.7 or so -- //
190
  $dates = $clicks = $impressions = ''; // To store the final graph data
191
  $day_start = $start; // Midnight of the day (start)
192
  $day_end = $day_start + 86399; // 1 second before midnight of the next day
200
  if(empty($graph[$i]['clicks'])) $graph[$i]['clicks'] = '0';
201
  if(empty($graph[$i]['impressions'])) $graph[$i]['impressions'] = '0';
202
 
203
+ $sum_clicks = $graph[$i]['clicks'] + $result['clicks'];
204
+ $sum_impressions = $graph[$i]['impressions'] + $result['impressions'];
205
  } else {
206
+ $day_start = $result['thetime'];
207
+ $day_end = $day_start + 86399;
208
+ $sum_clicks = $result['clicks'];
209
+ $sum_impressions = $result['impressions'];
210
  $i++;
211
  }
212
+ $graph[$i] = array('thetime' => $day_start, 'clicks' => $sum_clicks, 'impressions' => $sum_impressions);
213
+ unset($sum_clicks, $sum_impressions);
214
  }
215
 
216
  foreach($graph as $result) {
218
  $clicks .= ','.$result['clicks'];
219
  $impressions .= ','.$result['impressions'];
220
  }
221
+ // -- End Remove -- //
222
 
223
  $dates = trim($dates, ",");
224
  $clicks = trim($clicks, ",");
227
  $output = '';
228
  $output .= '<div id="chart-1" style="height:300px; width:100%;"></div>';
229
  $output .= adrotate_draw_graph($chartid, $dates, $clicks, $impressions);
230
+ unset($stats, $graph, $dates, $clicks, $impressions);
231
  } else {
232
  $output = __('No data to show!', 'adrotate');
233
  }
adrotate.php CHANGED
@@ -7,7 +7,7 @@ Author URI: http://ajdg.solutions/?utm_campaign=homepage&utm_medium=plugin-info&
7
  Description: The popular choice for monetizing your website with adverts while keeping things simple. Start making money today!
8
  Text Domain: adrotate
9
  Domain Path: /languages/
10
- Version: 4.0
11
  License: GPLv3
12
  */
13
 
@@ -22,9 +22,9 @@ License: GPLv3
22
  ------------------------------------------------------------------------------------ */
23
 
24
  /*--- AdRotate values ---------------------------------------*/
25
- define("ADROTATE_DISPLAY", '4.0');
26
- define("ADROTATE_VERSION", 388);
27
- define("ADROTATE_DB_VERSION", 62);
28
  /*-----------------------------------------------------------*/
29
 
30
  /*--- Load Files --------------------------------------------*/
@@ -51,6 +51,7 @@ register_activation_hook(__FILE__, 'adrotate_activate');
51
  register_deactivation_hook(__FILE__, 'adrotate_deactivate');
52
  register_uninstall_hook(__FILE__, 'adrotate_uninstall');
53
  add_action('adrotate_evaluate_ads', 'adrotate_evaluate_ads');
 
54
  add_action('widgets_init', create_function('', 'return register_widget("adrotate_widgets");'));
55
  /*-----------------------------------------------------------*/
56
 
7
  Description: The popular choice for monetizing your website with adverts while keeping things simple. Start making money today!
8
  Text Domain: adrotate
9
  Domain Path: /languages/
10
+ Version: 4.1
11
  License: GPLv3
12
  */
13
 
22
  ------------------------------------------------------------------------------------ */
23
 
24
  /*--- AdRotate values ---------------------------------------*/
25
+ define("ADROTATE_DISPLAY", '4.1');
26
+ define("ADROTATE_VERSION", 389);
27
+ define("ADROTATE_DB_VERSION", 63);
28
  /*-----------------------------------------------------------*/
29
 
30
  /*--- Load Files --------------------------------------------*/
51
  register_deactivation_hook(__FILE__, 'adrotate_deactivate');
52
  register_uninstall_hook(__FILE__, 'adrotate_uninstall');
53
  add_action('adrotate_evaluate_ads', 'adrotate_evaluate_ads');
54
+ add_action('adrotate_empty_trackerdata', 'adrotate_empty_trackerdata');
55
  add_action('widgets_init', create_function('', 'return register_widget("adrotate_widgets");'));
56
  /*-----------------------------------------------------------*/
57
 
dashboard/info.php CHANGED
@@ -49,7 +49,7 @@ $data = get_option("adrotate_advert_status");
49
  <a href="http://www.arnan.me/?pk_campaign=adrotate-free&pk_kwd=infopage" title="arnan.me - Nomadic in the Philippines"><img src="<?php echo plugins_url('/images/arnan-credits.jpg', dirname(__FILE__)); ?>" alt="Arnan de Gans" align="center" class="ajdg-photo" width="100%" /></a></p>
50
 
51
  <p><strong><?php _e('Get paid as a publisher', 'adrotate'); ?></strong></p>
52
- <p><a href='http://bit.ly/2leh9sW'><img alt="Media.net" height="125" src="<?php echo plugins_url('/images/medianet.jpg', dirname(__FILE__)); ?>" /></a>&nbsp;&nbsp;<a href="http://signup.clicksor.com/advertise_here.php?nid=1&srid=&ref=381832" target="_blank"><img alt="Clicksor" height="125"src="<?php echo plugins_url('/images/clicksor.png', dirname(__FILE__)); ?>"></a>&nbsp;&nbsp;<a href="https://www.viglink.com/?vgref=2984797&amp;vgtag=banner"><img alt="VigLink" height="125" src="<?php echo plugins_url('/images/viglink.png', dirname(__FILE__)); ?>" /></a></p>
53
  </td>
54
  </tr>
55
  </tbody>
49
  <a href="http://www.arnan.me/?pk_campaign=adrotate-free&pk_kwd=infopage" title="arnan.me - Nomadic in the Philippines"><img src="<?php echo plugins_url('/images/arnan-credits.jpg', dirname(__FILE__)); ?>" alt="Arnan de Gans" align="center" class="ajdg-photo" width="100%" /></a></p>
50
 
51
  <p><strong><?php _e('Get paid as a publisher', 'adrotate'); ?></strong></p>
52
+ <p><a href='http://ajdg.link/medianet'><img alt="Media.net" height="125" src="<?php echo plugins_url('/images/medianet.jpg', dirname(__FILE__)); ?>" /></a>&nbsp;&nbsp;<a href="http://ajdg.link/clicksor" target="_blank"><img alt="Clicksor" height="125"src="<?php echo plugins_url('/images/clicksor.png', dirname(__FILE__)); ?>"></a>&nbsp;&nbsp;<a href="http://ajdg.link/viglink"><img alt="VigLink" height="125" src="<?php echo plugins_url('/images/viglink.png', dirname(__FILE__)); ?>" /></a></p>
53
  </td>
54
  </tr>
55
  </tbody>
dashboard/publisher/adverts-edit.php CHANGED
@@ -12,10 +12,10 @@
12
  if(!$ad_edit_id) {
13
  $edit_id = $wpdb->get_var("SELECT `id` FROM `{$wpdb->prefix}adrotate` WHERE `type` = 'empty' ORDER BY `id` DESC LIMIT 1;");
14
  if($edit_id == 0) {
15
- $wpdb->insert($wpdb->prefix."adrotate", array('title' => '', 'bannercode' => '', 'thetime' => $now, 'updated' => $now, 'author' => $userdata->user_login, 'imagetype' => 'dropdown', 'image' => '', 'paid' => 'U', 'tracker' => 'N', 'desktop' => 'Y', 'mobile' => 'Y', 'tablet' => 'Y', 'os_ios' => 'Y', 'os_android' => 'Y', 'os_other' => 'Y', 'responsive' => 'N', 'type' => 'empty', 'weight' => 6, 'budget' => 0, 'crate' => 0, 'irate' => 0, 'cities' => serialize(array()), 'countries' => serialize(array())));
16
  $edit_id = $wpdb->insert_id;
17
 
18
- $wpdb->insert($wpdb->prefix.'adrotate_schedule', array('name' => 'Schedule for ad '.$edit_id, 'starttime' => $now, 'stoptime' => $in84days, 'maxclicks' => 0, 'maximpressions' => 0, 'spread' => 'N', 'daystarttime' => '0000', 'daystoptime' => '0000', 'day_mon' => 'Y', 'day_tue' => 'Y', 'day_wed' => 'Y', 'day_thu' => 'Y', 'day_fri' => 'Y', 'day_sat' => 'Y', 'day_sun' => 'Y'));
19
  $schedule_id = $wpdb->insert_id;
20
  $wpdb->insert($wpdb->prefix.'adrotate_linkmeta', array('ad' => $edit_id, 'group' => 0, 'user' => 0, 'schedule' => $schedule_id));
21
  }
@@ -41,17 +41,17 @@ foreach($linkmeta as $meta) {
41
  // Affiliate Partners
42
  $partners = array(
43
  "medianet" => array(
44
- "url" => "http://bit.ly/2leh9sW",
45
  "alt" => "Media.net",
46
  "image" => "medianet.jpg"
47
  ),
48
  "clicksor" => array(
49
- "url" => "http://signup.clicksor.com/advertise_here.php?nid=1&srid=&ref=381832",
50
  "alt" => "Clicksor",
51
  "image" => "clicksor.png"
52
  ),
53
  "viglink" => array(
54
- "url" => "https://www.viglink.com/?vgref=2984797&amp;vgtag=banner",
55
  "alt" => "VigLink",
56
  "image" => "viglink.png"
57
  ),
12
  if(!$ad_edit_id) {
13
  $edit_id = $wpdb->get_var("SELECT `id` FROM `{$wpdb->prefix}adrotate` WHERE `type` = 'empty' ORDER BY `id` DESC LIMIT 1;");
14
  if($edit_id == 0) {
15
+ $wpdb->insert($wpdb->prefix."adrotate", array('title' => '', 'bannercode' => '', 'thetime' => $now, 'updated' => $now, 'author' => $userdata->user_login, 'imagetype' => 'dropdown', 'image' => '', 'paid' => 'U', 'tracker' => 'N', 'desktop' => 'Y', 'mobile' => 'Y', 'tablet' => 'Y', 'os_ios' => 'Y', 'os_android' => 'Y', 'os_other' => 'Y', 'responsive' => 'N', 'type' => 'empty', 'weight' => 6, 'autodelete' => 'N', 'budget' => 0, 'crate' => 0, 'irate' => 0, 'cities' => serialize(array()), 'countries' => serialize(array())));
16
  $edit_id = $wpdb->insert_id;
17
 
18
+ $wpdb->insert($wpdb->prefix.'adrotate_schedule', array('name' => 'Schedule for ad '.$edit_id, 'starttime' => $now, 'stoptime' => $in84days, 'maxclicks' => 0, 'maximpressions' => 0, 'spread' => 'N', 'daystarttime' => '0000', 'daystoptime' => '0000', 'day_mon' => 'Y', 'day_tue' => 'Y', 'day_wed' => 'Y', 'day_thu' => 'Y', 'day_fri' => 'Y', 'day_sat' => 'Y', 'day_sun' => 'Y', 'autodelete' => 'N'));
19
  $schedule_id = $wpdb->insert_id;
20
  $wpdb->insert($wpdb->prefix.'adrotate_linkmeta', array('ad' => $edit_id, 'group' => 0, 'user' => 0, 'schedule' => $schedule_id));
21
  }
41
  // Affiliate Partners
42
  $partners = array(
43
  "medianet" => array(
44
+ "url" => "http://ajdg.link/medianet",
45
  "alt" => "Media.net",
46
  "image" => "medianet.jpg"
47
  ),
48
  "clicksor" => array(
49
+ "url" => "http://ajdg.link/clicksor",
50
  "alt" => "Clicksor",
51
  "image" => "clicksor.png"
52
  ),
53
  "viglink" => array(
54
+ "url" => "http://ajdg.link/viglink",
55
  "alt" => "VigLink",
56
  "image" => "viglink.png"
57
  ),
readme.txt CHANGED
@@ -1,10 +1,10 @@
1
  === AdRotate ===
2
  Contributors: adegans
3
  Donate link: http://www.arnan.me/donate/?utm_campaign=donations&utm_medium=readme&utm_source=adrotate-free
4
- Tags: ads, advert, banner, advertise, adrotator, rotator, advertising, advertisement, advertiser, publisher, adsense, chitika, clickbank, geotargeting, banner manager, advert manager, campaign manager, statistics, stats, html5, javascript advert, tracking, clicks, impressions
5
  Requires at least: 3.8
6
  Tested up to: 4.7.3
7
- Stable tag: 4.0
8
  License: GPLv3
9
 
10
  The popular choice for monetizing your website with adverts while keeping things simple. Start making money today!
@@ -97,19 +97,26 @@ You can also post your questions on the [forum](https://ajdg.solutions/forums/?u
97
 
98
  Be a Pro and go Pro. With [AdRotate Pro](https://ajdg.solutions/products/adrotate-for-wordpress/?utm_campaign=adrotate-page&utm_medium=readme&utm_source=adrotate-free)!
99
 
100
- = 4.0 FREE =
101
- * [new] Re-enable schedules from Maintenance
102
- * [change] moved tracker data back to it's own system
103
- * [change] Updated the database installer
104
- * [change] Don't count impressions for unknown IP addresses
105
-
106
- = 4.4 PRO =
107
- * [new] Re-enable schedules from Maintenance
108
- * [fix] invalid AdRotate Geo Url
109
- * [fix] Correct date range for advertiser stats on summary
110
- * [change] moved tracker data back to it's own system
111
- * [change] Updated the database installer
112
- * [change] Don't count impressions for unknown IP addresses
 
 
 
 
 
 
 
113
 
114
  All recent changes are available on the [AdRotate website](https://ajdg.solutions/products/adrotate-for-wordpress/development/?utm_campaign=development&utm_medium=readme&utm_source=adrotate-free).
115
 
@@ -117,11 +124,12 @@ NOTE: Unsolicited offers, parnterships, job offers, promotional emails or produc
117
 
118
  == Upgrade Notice ==
119
 
120
- = 4.0 =
121
- * [new] Re-enable schedules from Maintenance
122
- * [change] moved tracker data back to it's own system
123
- * [change] Updated the database installer
124
- * [change] Don't count impressions for unknown IP addresses
 
125
 
126
  All recent changes are available on the [AdRotate website](https://ajdg.solutions/products/adrotate-for-wordpress/development/?utm_campaign=development&utm_medium=readme&utm_source=adrotate-free).
127
 
1
  === AdRotate ===
2
  Contributors: adegans
3
  Donate link: http://www.arnan.me/donate/?utm_campaign=donations&utm_medium=readme&utm_source=adrotate-free
4
+ Tags: ads, advert, banner, advertise, adrotator, advertising, adsense, geotargeting, banner manager, advert manager, statistics, html5
5
  Requires at least: 3.8
6
  Tested up to: 4.7.3
7
+ Stable tag: 4.1
8
  License: GPLv3
9
 
10
  The popular choice for monetizing your website with adverts while keeping things simple. Start making money today!
97
 
98
  Be a Pro and go Pro. With [AdRotate Pro](https://ajdg.solutions/products/adrotate-for-wordpress/?utm_campaign=adrotate-page&utm_medium=readme&utm_source=adrotate-free)!
99
 
100
+ = 4.1 FREE =
101
+ * Note: Graphs may show cluttered for previously collected stats.
102
+ * [change] Stats now stored in daily increments again
103
+ * [fix] Stats graphs now show more accurate dates/numbers for days
104
+ * [fix] Close link for 'upgrade to AdRotate Pro' banner
105
+ * [fix] Tracker data cleanup should now work
106
+
107
+ = 4.5 PRO =
108
+ * Note: Graphs may show cluttered for previously collected stats.
109
+ * Note: Exports may be hard to read for previously collected stats.
110
+ * [new] Option to automatically delete expired adverts
111
+ * [new] Option to automatically delete expired schedules
112
+ * [change] Stats now stored in daily increments again
113
+ * [fix] Stats graphs now show more accurate dates/numbers for days
114
+ * [fix] Improved PHP7 compatibility
115
+ * [fix] Close link for 'rate AdRotate Pro' banner
116
+ * [fix] Impression spread indicator when selecting schedules
117
+ * [fix] Tracker data cleanup should now work
118
+ * [fix] Network widget showing correct settings after saving
119
+ * [fix] Network widget showing correct advert for single adverts
120
 
121
  All recent changes are available on the [AdRotate website](https://ajdg.solutions/products/adrotate-for-wordpress/development/?utm_campaign=development&utm_medium=readme&utm_source=adrotate-free).
122
 
124
 
125
  == Upgrade Notice ==
126
 
127
+ = 4.1 =
128
+ * Note: Graphs may show cluttered for previously collected stats.
129
+ * [change] Stats now stored in daily increments again
130
+ * [fix] Stats graphs now show more accurate dates/numbers for days
131
+ * [fix] Close link for 'upgrade to AdRotate Pro' banner
132
+ * [fix] Tracker data cleanup should now work
133
 
134
  All recent changes are available on the [AdRotate website](https://ajdg.solutions/products/adrotate-for-wordpress/development/?utm_campaign=development&utm_medium=readme&utm_source=adrotate-free).
135