Ad Injection - Version 0.9.3.1

Version Description

Fix chmod comparison problem.

Download this release

Release Info

Developer reviewmylife
Plugin Icon wp plugin Ad Injection
Version 0.9.3.1
Comparing to
See all releases

Code changes from version 0.9.3 to 0.9.3.1

Files changed (3) hide show
  1. ad-injection-admin.php +5 -5
  2. ad-injection.php +79 -79
  3. readme.txt +8 -2
ad-injection-admin.php CHANGED
@@ -94,7 +94,6 @@ case 'Save all settings':
94
 
95
  adinj_update_options($options);
96
 
97
- // TODO could stop this if not mfunc mode
98
  adinj_write_config_file();
99
 
100
  break;
@@ -167,10 +166,11 @@ function adinj_write_file($path, $content, $permission){
167
 
168
  function adinj_chmod($path, $permission){
169
  global $adinj_warning_msg_chmod;
170
- $oldperm = fileperms($path);
171
- if ($permission == $oldperm) return;
172
- chmod($path, $permission) or $adinj_warning_msg_chmod .= "<br />Warning: chmod ".decoct($permission).
173
- " on $path failed. Current permissions: ".substr(decoct($oldperm), -4).'.<br /> Try manually updating the permission if problems occur.';
 
174
  }
175
 
176
  function adinj_get_logo(){
94
 
95
  adinj_update_options($options);
96
 
 
97
  adinj_write_config_file();
98
 
99
  break;
166
 
167
  function adinj_chmod($path, $permission){
168
  global $adinj_warning_msg_chmod;
169
+ $oldperm = substr(decoct(fileperms($path)), -3);
170
+ $newperm = decoct($permission);
171
+ if ($newperm == $oldperm) return;
172
+ chmod($path, $permission) or $adinj_warning_msg_chmod .= "<br />Warning: chmod $permission " .
173
+ "on $path failed. Current permissions: $oldperm<br /> Try manually updating the permission if problems occur.";
174
  }
175
 
176
  function adinj_get_logo(){
ad-injection.php CHANGED
@@ -3,7 +3,7 @@
3
  Plugin Name: Ad Injection
4
  Plugin URI: http://www.reviewmylife.co.uk/blog/2010/12/06/ad-injection-plugin-wordpress/
5
  Description: Injects any advert (e.g. AdSense) into your WordPress posts or widget area. Restrict who sees the ads by post length, age, referrer or IP. Cache compatible.
6
- Version: 0.9.3
7
  Author: reviewmylife
8
  Author URI: http://www.reviewmylife.co.uk/
9
  License: GPLv2
@@ -59,8 +59,8 @@ function adinj_options($reset=false){
59
  }
60
 
61
  function adinj_option($option){
62
- $options = adinj_options();
63
- return $options[$option];
64
  }
65
 
66
  // TODO make the cookie domain from wp-config.php accessible to script
@@ -83,8 +83,8 @@ SCRIPT;
83
  }
84
 
85
  function adinj_quote_list($option){
86
- $options = adinj_options();
87
- $list = $options[$option];
88
 
89
  // I'm sure this whole thing could be done with a much simpler single
90
  // line of PHP - but right now my brain isn't up to thinking about it!
@@ -118,111 +118,111 @@ function adinj_get_mfunc_code($adfile){
118
  ";
119
  }
120
 
121
- function adinj_ad_code_eval($adcode){
122
- if (stripos($adcode, '<?php') !== false){
123
- return adinj_eval_php($adcode);
124
  }
125
- return $adcode;
126
  }
127
 
128
  function adinj_ad_code_include(){
129
  $plugin_dir = ADINJ_PATH;
130
- $options = adinj_options();
131
- $adcode = "";
132
- if ($options['ad_insertion_mode'] == 'mfunc'){
133
  // WP Super Cache's support for mclude assumes that we will be including
134
  // files from within ABSPATH. To remove this limitation we do the include
135
  // using mfunc instead.
136
- $adcode = "\n
137
  <!--mfunc include_once('$plugin_dir/adshow.php') -->
138
  <?php include_once('$plugin_dir/adshow.php'); ?>
139
  <!--/mfunc-->
140
  ";
141
  }
142
- return adinj_eval_php($adcode);
143
  }
144
 
145
- function adinj_add_tags($adcode, $prefix, $func=NULL){
146
- $options = adinj_options();
147
- if ($options[$prefix . 'align'] !== ADINJ_RULE_DISABLED ||
148
- $options[$prefix . 'margin_top'] !== ADINJ_RULE_DISABLED ||
149
- $options[$prefix . 'margin_bottom'] !== ADINJ_RULE_DISABLED) {
150
  $top = "";
151
  $bottom = "";
152
- if ($options[$prefix . 'margin_top'] !== ADINJ_RULE_DISABLED) $top="margin-top:" . $options[$prefix . 'margin_top'] . "px;";
153
- if ($options[$prefix . 'margin_bottom'] !== ADINJ_RULE_DISABLED) $bottom="margin-bottom:" . $options[$prefix . 'margin_bottom'] . "px;";
154
 
155
- if ($options[$prefix . 'align'] == 'left'){
156
  $div = "<div style='float:left;" . $top . $bottom . "'>ADCODE</div><br clear='all' />";
157
- } else if ($options[$prefix . 'align'] == 'center'){
158
  $div = "<div style='" . $top . $bottom . "'><center>ADCODE</center></div>";
159
- } else if ($options[$prefix . 'align'] == 'right'){
160
  $div = "<div style='float:right;" . $top . $bottom . "'>ADCODE</div><br clear='all' />";
161
- } else if ($options[$prefix . 'align'] == 'float left'){
162
  $div = "<div style='float:left;" . $top . $bottom . "margin-right:5px;'>ADCODE</div>";
163
- } else if ($options[$prefix . 'align'] == 'float right'){
164
  $div = "<div style='float:right;" . $top . $bottom . "margin-left:5px;'>ADCODE</div>";
165
  } else {
166
  $div = "<div style='" . $top . $bottom . "'>ADCODE</div>";
167
  }
168
  if (empty($func)){
169
- return str_replace("ADCODE", $adcode, $div);
170
  } else {
171
- $ad = str_replace("ADCODE", "\$adcode", $div);
172
- return "function $func(\$adcode) { return \"$ad\"; }";
173
  }
174
  }
175
  if (!empty($func)){
176
- return "function $func(\$adcode){return \$adcode;}";
177
  }
178
- return $adcode;
179
  }
180
 
181
  function adinj_ad_code_random(){
182
- $options = adinj_options();
183
- $adcode = "";
184
- if ($options['ad_insertion_mode'] == 'mfunc'){
185
- $adcode = adinj_get_mfunc_code(ADINJ_AD_RANDOM_FILE);
186
  } else {
187
- $adcode = $options['ad_code_random_1'];
188
- $adcode = adinj_add_tags($adcode, 'rnd_');
189
  }
190
- return adinj_ad_code_eval($adcode);
191
  }
192
 
193
  function adinj_ad_code_top(){
194
  global $adinj_total_all_ads_used;
195
  ++$adinj_total_all_ads_used;
196
- $options = adinj_options();
197
- $adcode = "";
198
- if ($options['ad_insertion_mode'] == 'mfunc'){
199
- $adcode = adinj_get_mfunc_code(ADINJ_AD_TOP_FILE);
200
  } else {
201
- $adcode = $options['ad_code_top_1'];
202
- $adcode = adinj_add_tags($adcode, 'top_');
203
  }
204
- return adinj_ad_code_eval($adcode);
205
  }
206
 
207
  function adinj_ad_code_bottom(){
208
  global $adinj_total_all_ads_used;
209
  ++$adinj_total_all_ads_used;
210
- $options = adinj_options();
211
- $adcode = "";
212
- if ($options['ad_insertion_mode'] == 'mfunc'){
213
- $adcode = adinj_get_mfunc_code(ADINJ_AD_BOTTOM_FILE);
214
  } else {
215
- $adcode = $options['ad_code_bottom_1'];
216
- $adcode = adinj_add_tags($adcode, 'bottom_');
217
  }
218
- return adinj_ad_code_eval($adcode);
219
  }
220
 
221
  function read_ad_from_file($ad_path){
222
  $contents = "";
223
  if (file_exists($ad_path)){
224
  $contents = file_get_contents($ad_path);
225
- if ($contents === false) die("can't read from file: $ad_path");
226
  }
227
  return $contents;
228
  }
@@ -230,8 +230,8 @@ function read_ad_from_file($ad_path){
230
  // Based on: http://www.wprecipes.com/wordpress-hack-how-to-display-ads-on-old-posts-only
231
  // Only use for pages and posts. Not for archives, categories, home page, etc.
232
  function adinj_is_old_post(){
233
- $options = adinj_options();
234
- $days = $options['ads_on_page_older_than'];
235
  if ($days == 0) return true;
236
  if(is_single() || is_page()) {
237
  $current_date = time();
@@ -307,8 +307,8 @@ function adinj($content, $message){
307
  global $adinj_total_rand_ads_used, $adinj_total_all_ads_used;
308
  $path = ADINJ_AD_PATH;
309
  $path2 = ADINJ_AD_PATH2;
310
- $options = adinj_options();
311
- $mode = $options['ad_insertion_mode'];
312
  return $content."
313
  <!--
314
  [ADINJ DEBUG]
@@ -363,31 +363,31 @@ function adinj_inject_hook($content){
363
  return adinj($content, $reason);
364
  }
365
 
366
- $options = adinj_options();
367
 
368
- if ($options['ad_insertion_mode'] == 'direct_dynamic'){
369
  $showads = adinj_show_adverts();
370
  if ($showads !== true){
371
  return adinj($content, "NOADS: ad blocked at run time reason=$showads");
372
  }
373
  }
374
 
375
- $adcode_include = adinj_ad_code_include();
376
 
377
  # Ad sandwich mode
378
  if(is_page() || is_single()){
379
- if(stripos($content, "<!--adsandwich-->") !== false) return adinj($adcode_include.adinj_ad_code_top().$content.adinj_ad_code_bottom(), "Ads=adsandwich");
380
- if(stripos($content, "<!--adfooter-->") !== false) return adinj($content.$adcode_include.adinj_ad_code_bottom(), "Ads=adfooter");
381
  }
382
 
383
  # Insert top and bottom ads if necesary
384
  $length = strlen($content);
385
  if(is_page() || is_single()){
386
- if (adinj_do_rule_if($options['top_ad_if_longer_than'], '<', $length)){
387
- $content = $adcode_include.adinj_ad_code_top().$content;
388
- $adcode_include = false;
389
  }
390
- if (adinj_do_rule_if($options['bottom_ad_if_longer_than'], '<', $length)){
391
  $content = $content.adinj_ad_code_bottom();
392
  }
393
  }
@@ -395,9 +395,9 @@ function adinj_inject_hook($content){
395
  $num_rand_ads_to_insert = adinj_num_rand_ads_to_insert($length);
396
  if ($num_rand_ads_to_insert <= 0) return adinj($content, "all ads used up");
397
 
398
- if ($adcode_include !== false) $content = $adcode_include.$content;
399
 
400
- $debug_on = $options['debug_mode'];
401
  if (!$debug_on) $debugtags=false;
402
 
403
  $content_adfree_header = "";
@@ -499,10 +499,10 @@ function adinj_inject_hook($content){
499
  sort($inj_positions);
500
 
501
  // Insert ads in reverse order
502
- $adcode = adinj_ad_code_random();
503
  global $adinj_total_rand_ads_used, $adinj_total_all_ads_used;
504
  for ($adnum=sizeof($inj_positions)-1; $adnum>=0; $adnum--){
505
- $content = substr_replace($content, $adcode, $inj_positions[$adnum], 0);
506
  ++$adinj_total_rand_ads_used;
507
  ++$adinj_total_all_ads_used;
508
  }
@@ -525,11 +525,11 @@ function adinj_split_by_tag($content, $tag, &$debugtags){
525
 
526
  function adinj_num_rand_ads_to_insert($content_length){
527
  global $adinj_total_rand_ads_used; // a page can be more than one post
528
- $options = adinj_options();
529
  if (is_single() || is_page()){
530
- $max_num_rand_ads_to_insert = $options['max_num_of_ads'] - $adinj_total_rand_ads_used;
531
  } else if (is_home()){
532
- $max_num_rand_ads_to_insert = $options['max_num_of_ads_home_page'] - $adinj_total_rand_ads_used;
533
  } else {
534
  return 0;
535
  //TODO Allow ads in other page types later
@@ -543,16 +543,16 @@ function adinj_num_rand_ads_to_insert($content_length){
543
  return 1;
544
  }
545
  $length = $content_length;
546
- if (adinj_do_rule_if($options['no_random_ads_if_shorter_than'], '>', $length)){
547
  return 0;
548
  }
549
- if (adinj_do_rule_if($options['one_ad_if_shorter_than'], '>', $length)){
550
  return 1;
551
  }
552
- if (adinj_do_rule_if($options['two_ads_if_shorter_than'], '>', $length)){
553
  return min(2, $max_num_rand_ads_to_insert);
554
  }
555
- if (adinj_do_rule_if($options['three_ads_if_shorter_than'], '>', $length)){
556
  return min(3, $max_num_rand_ads_to_insert);
557
  }
558
  return $max_num_rand_ads_to_insert;
@@ -570,8 +570,8 @@ function adinj_do_rule_if($rule_value, $condition, $content_length){
570
  }
571
 
572
  function adinj_ticked($option){
573
- $options = adinj_options();
574
- if (!empty($options[$option])) return 'checked="checked"';
575
  return false;
576
  }
577
 
3
  Plugin Name: Ad Injection
4
  Plugin URI: http://www.reviewmylife.co.uk/blog/2010/12/06/ad-injection-plugin-wordpress/
5
  Description: Injects any advert (e.g. AdSense) into your WordPress posts or widget area. Restrict who sees the ads by post length, age, referrer or IP. Cache compatible.
6
+ Version: 0.9.3.1
7
  Author: reviewmylife
8
  Author URI: http://www.reviewmylife.co.uk/
9
  License: GPLv2
59
  }
60
 
61
  function adinj_option($option){
62
+ $ops = adinj_options();
63
+ return $ops[$option];
64
  }
65
 
66
  // TODO make the cookie domain from wp-config.php accessible to script
83
  }
84
 
85
  function adinj_quote_list($option){
86
+ $ops = adinj_options();
87
+ $list = $ops[$option];
88
 
89
  // I'm sure this whole thing could be done with a much simpler single
90
  // line of PHP - but right now my brain isn't up to thinking about it!
118
  ";
119
  }
120
 
121
+ function adinj_ad_code_eval($ad){
122
+ if (stripos($ad, '<?php') !== false){
123
+ return adinj_eval_php($ad);
124
  }
125
+ return $ad;
126
  }
127
 
128
  function adinj_ad_code_include(){
129
  $plugin_dir = ADINJ_PATH;
130
+ $ops = adinj_options();
131
+ $ad = "";
132
+ if ($ops['ad_insertion_mode'] == 'mfunc'){
133
  // WP Super Cache's support for mclude assumes that we will be including
134
  // files from within ABSPATH. To remove this limitation we do the include
135
  // using mfunc instead.
136
+ $ad = "\n
137
  <!--mfunc include_once('$plugin_dir/adshow.php') -->
138
  <?php include_once('$plugin_dir/adshow.php'); ?>
139
  <!--/mfunc-->
140
  ";
141
  }
142
+ return adinj_eval_php($ad);
143
  }
144
 
145
+ function adinj_add_tags($ad, $prefix, $func=NULL){
146
+ $ops = adinj_options();
147
+ if ($ops[$prefix . 'align'] !== ADINJ_RULE_DISABLED ||
148
+ $ops[$prefix . 'margin_top'] !== ADINJ_RULE_DISABLED ||
149
+ $ops[$prefix . 'margin_bottom'] !== ADINJ_RULE_DISABLED) {
150
  $top = "";
151
  $bottom = "";
152
+ if ($ops[$prefix . 'margin_top'] !== ADINJ_RULE_DISABLED) $top="margin-top:" . $ops[$prefix . 'margin_top'] . "px;";
153
+ if ($ops[$prefix . 'margin_bottom'] !== ADINJ_RULE_DISABLED) $bottom="margin-bottom:" . $ops[$prefix . 'margin_bottom'] . "px;";
154
 
155
+ if ($ops[$prefix . 'align'] == 'left'){
156
  $div = "<div style='float:left;" . $top . $bottom . "'>ADCODE</div><br clear='all' />";
157
+ } else if ($ops[$prefix . 'align'] == 'center'){
158
  $div = "<div style='" . $top . $bottom . "'><center>ADCODE</center></div>";
159
+ } else if ($ops[$prefix . 'align'] == 'right'){
160
  $div = "<div style='float:right;" . $top . $bottom . "'>ADCODE</div><br clear='all' />";
161
+ } else if ($ops[$prefix . 'align'] == 'float left'){
162
  $div = "<div style='float:left;" . $top . $bottom . "margin-right:5px;'>ADCODE</div>";
163
+ } else if ($ops[$prefix . 'align'] == 'float right'){
164
  $div = "<div style='float:right;" . $top . $bottom . "margin-left:5px;'>ADCODE</div>";
165
  } else {
166
  $div = "<div style='" . $top . $bottom . "'>ADCODE</div>";
167
  }
168
  if (empty($func)){
169
+ return str_replace("ADCODE", $ad, $div);
170
  } else {
171
+ $ad = str_replace("ADCODE", "\$ad", $div);
172
+ return "function $func(\$ad) { return \"$ad\"; }";
173
  }
174
  }
175
  if (!empty($func)){
176
+ return "function $func(\$ad){return \$ad;}";
177
  }
178
+ return $ad;
179
  }
180
 
181
  function adinj_ad_code_random(){
182
+ $ops = adinj_options();
183
+ $ad = "";
184
+ if ($ops['ad_insertion_mode'] == 'mfunc'){
185
+ $ad = adinj_get_mfunc_code(ADINJ_AD_RANDOM_FILE);
186
  } else {
187
+ $ad = $ops['ad_code_random_1'];
188
+ $ad = adinj_add_tags($ad, 'rnd_');
189
  }
190
+ return adinj_ad_code_eval($ad);
191
  }
192
 
193
  function adinj_ad_code_top(){
194
  global $adinj_total_all_ads_used;
195
  ++$adinj_total_all_ads_used;
196
+ $ops = adinj_options();
197
+ $ad = "";
198
+ if ($ops['ad_insertion_mode'] == 'mfunc'){
199
+ $ad = adinj_get_mfunc_code(ADINJ_AD_TOP_FILE);
200
  } else {
201
+ $ad = $ops['ad_code_top_1'];
202
+ $ad = adinj_add_tags($ad, 'top_');
203
  }
204
+ return adinj_ad_code_eval($ad);
205
  }
206
 
207
  function adinj_ad_code_bottom(){
208
  global $adinj_total_all_ads_used;
209
  ++$adinj_total_all_ads_used;
210
+ $ops = adinj_options();
211
+ $ad = "";
212
+ if ($ops['ad_insertion_mode'] == 'mfunc'){
213
+ $ad = adinj_get_mfunc_code(ADINJ_AD_BOTTOM_FILE);
214
  } else {
215
+ $ad = $ops['ad_code_bottom_1'];
216
+ $ad = adinj_add_tags($ad, 'bottom_');
217
  }
218
+ return adinj_ad_code_eval($ad);
219
  }
220
 
221
  function read_ad_from_file($ad_path){
222
  $contents = "";
223
  if (file_exists($ad_path)){
224
  $contents = file_get_contents($ad_path);
225
+ if ($contents === false) return "Error: can't read from file: $ad_path";
226
  }
227
  return $contents;
228
  }
230
  // Based on: http://www.wprecipes.com/wordpress-hack-how-to-display-ads-on-old-posts-only
231
  // Only use for pages and posts. Not for archives, categories, home page, etc.
232
  function adinj_is_old_post(){
233
+ $ops = adinj_options();
234
+ $days = $ops['ads_on_page_older_than'];
235
  if ($days == 0) return true;
236
  if(is_single() || is_page()) {
237
  $current_date = time();
307
  global $adinj_total_rand_ads_used, $adinj_total_all_ads_used;
308
  $path = ADINJ_AD_PATH;
309
  $path2 = ADINJ_AD_PATH2;
310
+ $ops = adinj_options();
311
+ $mode = $ops['ad_insertion_mode'];
312
  return $content."
313
  <!--
314
  [ADINJ DEBUG]
363
  return adinj($content, $reason);
364
  }
365
 
366
+ $ops = adinj_options();
367
 
368
+ if ($ops['ad_insertion_mode'] == 'direct_dynamic'){
369
  $showads = adinj_show_adverts();
370
  if ($showads !== true){
371
  return adinj($content, "NOADS: ad blocked at run time reason=$showads");
372
  }
373
  }
374
 
375
+ $ad_include = adinj_ad_code_include();
376
 
377
  # Ad sandwich mode
378
  if(is_page() || is_single()){
379
+ if(stripos($content, "<!--adsandwich-->") !== false) return adinj($ad_include.adinj_ad_code_top().$content.adinj_ad_code_bottom(), "Ads=adsandwich");
380
+ if(stripos($content, "<!--adfooter-->") !== false) return adinj($content.$ad_include.adinj_ad_code_bottom(), "Ads=adfooter");
381
  }
382
 
383
  # Insert top and bottom ads if necesary
384
  $length = strlen($content);
385
  if(is_page() || is_single()){
386
+ if (adinj_do_rule_if($ops['top_ad_if_longer_than'], '<', $length)){
387
+ $content = $ad_include.adinj_ad_code_top().$content;
388
+ $ad_include = false;
389
  }
390
+ if (adinj_do_rule_if($ops['bottom_ad_if_longer_than'], '<', $length)){
391
  $content = $content.adinj_ad_code_bottom();
392
  }
393
  }
395
  $num_rand_ads_to_insert = adinj_num_rand_ads_to_insert($length);
396
  if ($num_rand_ads_to_insert <= 0) return adinj($content, "all ads used up");
397
 
398
+ if ($ad_include !== false) $content = $ad_include.$content;
399
 
400
+ $debug_on = $ops['debug_mode'];
401
  if (!$debug_on) $debugtags=false;
402
 
403
  $content_adfree_header = "";
499
  sort($inj_positions);
500
 
501
  // Insert ads in reverse order
502
+ $ad = adinj_ad_code_random();
503
  global $adinj_total_rand_ads_used, $adinj_total_all_ads_used;
504
  for ($adnum=sizeof($inj_positions)-1; $adnum>=0; $adnum--){
505
+ $content = substr_replace($content, $ad, $inj_positions[$adnum], 0);
506
  ++$adinj_total_rand_ads_used;
507
  ++$adinj_total_all_ads_used;
508
  }
525
 
526
  function adinj_num_rand_ads_to_insert($content_length){
527
  global $adinj_total_rand_ads_used; // a page can be more than one post
528
+ $ops = adinj_options();
529
  if (is_single() || is_page()){
530
+ $max_num_rand_ads_to_insert = $ops['max_num_of_ads'] - $adinj_total_rand_ads_used;
531
  } else if (is_home()){
532
+ $max_num_rand_ads_to_insert = $ops['max_num_of_ads_home_page'] - $adinj_total_rand_ads_used;
533
  } else {
534
  return 0;
535
  //TODO Allow ads in other page types later
543
  return 1;
544
  }
545
  $length = $content_length;
546
+ if (adinj_do_rule_if($ops['no_random_ads_if_shorter_than'], '>', $length)){
547
  return 0;
548
  }
549
+ if (adinj_do_rule_if($ops['one_ad_if_shorter_than'], '>', $length)){
550
  return 1;
551
  }
552
+ if (adinj_do_rule_if($ops['two_ads_if_shorter_than'], '>', $length)){
553
  return min(2, $max_num_rand_ads_to_insert);
554
  }
555
+ if (adinj_do_rule_if($ops['three_ads_if_shorter_than'], '>', $length)){
556
  return min(3, $max_num_rand_ads_to_insert);
557
  }
558
  return $max_num_rand_ads_to_insert;
570
  }
571
 
572
  function adinj_ticked($option){
573
+ $ops = adinj_options();
574
+ if (!empty($ops[$option])) return 'checked="checked"';
575
  return false;
576
  }
577
 
readme.txt CHANGED
@@ -4,9 +4,9 @@ Donate link: http://www.reviewmylife.co.uk/blog/2010/12/06/ad-injection-plugin-w
4
  Tags: ad injection, adsense, advert injection, advert, ad, injection, advertising, affiliate, inject, injection, insert, widget, monetize, monetise, banner, Amazon, ClickBank, TradeDoubler, Google, adBrite, post, WordPress, automatically, plugin, Adsense Injection, free
5
  Requires at least: 3.0.0
6
  Tested up to: 3.0.3
7
- Stable tag: 0.9.3
8
 
9
- Injects any advert (e.g. AdSense) into your WordPress posts or widget area. Restrict who sees the ads by post length, age, referrer or IP. Cache compatible.
10
 
11
  == Description ==
12
 
@@ -171,6 +171,9 @@ For more information visit [reviewmylife](http://www.reviewmylife.co.uk/blog/201
171
 
172
  == Changelog ==
173
 
 
 
 
174
  = 0.9.3 =
175
  Invalidate the options cache after saving.
176
 
@@ -216,6 +219,9 @@ Fix 'Something badly wrong in num_rand_ads_to_insert' message that occurs on pag
216
 
217
  == Upgrade Notice ==
218
 
 
 
 
219
  = 0.9.3 =
220
  If you are using mfunc mode and have added ad widgets please re-save them to regenerate the ad files (fixed from 0.9.2).
221
 
4
  Tags: ad injection, adsense, advert injection, advert, ad, injection, advertising, affiliate, inject, injection, insert, widget, monetize, monetise, banner, Amazon, ClickBank, TradeDoubler, Google, adBrite, post, WordPress, automatically, plugin, Adsense Injection, free
5
  Requires at least: 3.0.0
6
  Tested up to: 3.0.3
7
+ Stable tag: 0.9.3.1
8
 
9
+ Injects any adverts (e.g. AdSense) into the WordPress posts or widget area. Restrict who sees ads by post length/age/referrer or IP. Cache compatible.
10
 
11
  == Description ==
12
 
171
 
172
  == Changelog ==
173
 
174
+ = 0.9.3.1 =
175
+ Fix chmod comparison problem.
176
+
177
  = 0.9.3 =
178
  Invalidate the options cache after saving.
179
 
219
 
220
  == Upgrade Notice ==
221
 
222
+ = 0.9.3.1 =
223
+ If you are using mfunc mode and have added ad widgets with a version prior to 0.9.2 please re-save them to regenerate the ad files (fixed for upgrades from 0.9.2).
224
+
225
  = 0.9.3 =
226
  If you are using mfunc mode and have added ad widgets please re-save them to regenerate the ad files (fixed from 0.9.2).
227