Post Expirator - Version 1.4

Version Description

Download this release

Release Info

Developer axelseaa
Plugin Icon 128x128 Post Expirator
Version 1.4
Comparing to
See all releases

Code changes from version 1.3.1 to 1.4

Files changed (2) hide show
  1. post-expirator.php +165 -26
  2. readme.txt +15 -5
post-expirator.php CHANGED
@@ -2,9 +2,9 @@
2
/*
3
Plugin Name: Post Expirator
4
Plugin URI: http://wordpress.org/extend/plugins/post-expirator/
5
- Description: Allows you to add an expiration date (hourly) to posts which you can configure to either delete the post or change it to a draft.
6
Author: Aaron Axelsen
7
- Version: 1.3.1
8
Author URI: http://www.frozenpc.net
9
*/
10
@@ -14,22 +14,47 @@ $expirationdateDefaultTimeFormat = 'g:ia';
14
$expirationdateDefaultFooterContents = 'Post expires at EXPIRATIONTIME on EXPIRATIONDATE';
15
$expirationdateDefaultFooterStyle = 'font-style: italic;';
16
17
- # Save for future use
18
- #function blah_blah_blah($array) {
19
- # $array['minute'] = array(
20
- # 'interval' => 60,
21
- # 'display' => __('Once a Minute')
22
- # );
23
- # return $array;
24
- #}
25
- #add_filter('cron_schedules','blah_blah_blah');
26
- #print_r(wp_get_schedules());
27
28
/**
29
* Function that does the actualy deleting - called by wp_cron
30
*/
31
function expirationdate_delete_expired_posts() {
32
global $wpdb;
33
$result = $wpdb->get_results('select post_id, meta_value from ' . $wpdb->postmeta . ' as postmeta, '.$wpdb->posts.' as posts where postmeta.post_id = posts.ID AND posts.post_status = "publish" AND postmeta.meta_key = "expiration-date" AND postmeta.meta_value <= "' . mktime() . '"');
34
if (!empty($result)) foreach ($result as $a) {
35
$post_result = $wpdb->get_var('select post_type from ' . $wpdb->posts .' where ID = '. $a->post_id);
@@ -50,7 +75,10 @@ function expirationdate_delete_expired_posts() {
50
}
51
}
52
}
53
- add_action ('expirationdate_delete_'.$current_blog->blog_id, 'expirationdate_delete_expired_posts');
54
55
/**
56
* Called at plugin activation
@@ -64,8 +92,12 @@ function expirationdate_activate () {
64
update_option('expirationdateFooterContents',$expirationdateDefaultFooterContents);
65
update_option('expirationdateFooterStyle',$expirationdateDefaultFooterStyle);
66
update_option('expirationdateDisplayFooter',0);
67
68
- wp_schedule_event(mktime(date('H'),0,0,date('m'),date('d'),date('Y')), 'hourly', 'expirationdate_delete_'.$current_blog->blog_id);
69
}
70
register_activation_hook (__FILE__, 'expirationdate_activate');
71
@@ -81,7 +113,10 @@ function expirationdate_deactivate () {
81
delete_option('expirationdateDisplayFooter');
82
delete_option('expirationdateFooterContents');
83
delete_option('expirationdateFooterStyle');
84
- wp_clear_scheduled_hook('expirationdate_delete_'.$current_blog->blog_id);
85
}
86
register_deactivation_hook (__FILE__, 'expirationdate_deactivate');
87
@@ -89,7 +124,7 @@ register_deactivation_hook (__FILE__, 'expirationdate_deactivate');
89
* adds an 'Expires' column to the post display table.
90
*/
91
function expirationdate_add_column ($columns) {
92
- $columns['expirationdate'] = 'Expires <br/><span style="font-size: 0.8em; font-weight: normal;">(YYYY/MM/DD HH)</span>';
93
return $columns;
94
}
95
add_filter ('manage_posts_columns', 'expirationdate_add_column');
@@ -102,9 +137,10 @@ function expirationdate_show_value ($column_name) {
102
global $wpdb, $post;
103
$id = $post->ID;
104
if ($column_name === 'expirationdate') {
105
$query = "SELECT meta_value FROM $wpdb->postmeta WHERE meta_key = \"expiration-date\" AND post_id=$id";
106
$ed = $wpdb->get_var($query);
107
- echo ($ed ? date('Y/m/d H',$ed) : "Never");
108
}
109
}
110
add_action ('manage_posts_custom_column', 'expirationdate_show_value');
@@ -131,18 +167,21 @@ add_action ('edit_page_form','expirationdate_meta_page');
131
*/
132
function expirationdate_meta_box($post) {
133
// Get default month
134
$expirationdatets = get_post_meta($post->ID,'expiration-date',true);
135
if (empty($expirationdatets)) {
136
$defaultmonth = date('F');
137
$defaultday = date('d');
138
$defaulthour = date('H');
139
$defaultyear = date('Y');
140
$disabled = 'disabled="disabled"';
141
} else {
142
$defaultmonth = date('F',$expirationdatets);
143
$defaultday = date('d',$expirationdatets);
144
$defaultyear = date('Y',$expirationdatets);
145
$defaulthour = date('H',$expirationdatets);
146
147
$enabled = ' checked="checked"';
148
$disabled = '';
@@ -157,6 +196,7 @@ function expirationdate_meta_box($post) {
157
$rv[] = '<th style="text-align: left;">Year</th>';
158
$rv[] = '<th style="text-align: left;"></th>';
159
$rv[] = '<th style="text-align: left;">Hour (24 Hour Format)</th>';
160
$rv[] = '</tr><tr>';
161
$rv[] = '<td>';
162
$rv[] = '<select name="expirationdate_month" id="expirationdate_month"'.$disabled.'">';
@@ -185,6 +225,8 @@ function expirationdate_meta_box($post) {
185
$rv[] = '</select>';
186
$rv[] = '</td><td>@</td><td>';
187
$rv[] = '<input type="text" id="expirationdate_hour" name="expirationdate_hour" value="'.$defaulthour.'" size="2"'.$disabled.'" />';
188
$rv[] = '<input type="hidden" name="expirationdate_formcheck" value="true" />';
189
$rv[] = '</td></tr></table>';
190
@@ -227,11 +269,13 @@ function expirationdate_ajax_add_meta(expireenable) {
227
document.getElementById('expirationdate_day').disabled = false;
228
document.getElementById('expirationdate_year').disabled = false;
229
document.getElementById('expirationdate_hour').disabled = false;
230
} else {
231
document.getElementById('expirationdate_month').disabled = true;
232
document.getElementById('expirationdate_day').disabled = true;
233
document.getElementById('expirationdate_year').disabled = true;
234
document.getElementById('expirationdate_hour').disabled = true;
235
var enable = 'false';
236
}
237
@@ -257,7 +301,11 @@ add_action('admin_print_scripts', 'expirationdate_js_admin_header' );
257
function expirationdate_get_blog_url() {
258
global $current_blog;
259
$schema = ( isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on' ) ? 'https://' : 'http://';
260
- echo $schema.$current_blog->domain.$current_blog->path;
261
}
262
263
/**
@@ -271,10 +319,12 @@ function expirationdate_update_post_meta($id) {
271
$day = $_POST['expirationdate_day'];
272
$year = $_POST['expirationdate_year'];
273
$hour = $_POST['expirationdate_hour'];
274
275
if (isset($_POST['enable-expirationdate'])) {
276
// Format Date
277
- $ts = mktime($hour,0,0,$month,$day,$year);
278
// Update Post Meta
279
delete_post_meta($id, 'expiration-date');
280
update_post_meta($id, 'expiration-date', $ts, true);
@@ -284,18 +334,45 @@ function expirationdate_update_post_meta($id) {
284
}
285
add_action('save_post','expirationdate_update_post_meta');
286
287
/**
288
* Hook's to add plugin page menu
289
*/
290
- function expirationdate_plugin_menu() {
291
- add_submenu_page('options-general.php','Post Expirator Options','Post Expirator',9,basename(__FILE__),'expirationdate_show_options');
292
}
293
- add_action('admin_menu', 'expirationdate_plugin_menu');
294
295
/**
296
* Show the Expiration Date options page
297
*/
298
- function expirationdate_show_options() {
299
300
if ($_POST['expirationdateSave']) {
301
update_option('expirationdateExpiredPostStatus',$_POST['expired-post-status']);
@@ -353,8 +430,6 @@ function expirationdate_show_options() {
353
}
354
355
?>
356
- <div class="wrap">
357
- <h2><?php _e('Post Expirator Options'); ?></h2>
358
<p>
359
The post expirator plugin sets a custom meta value, and then optionally allows you to select if you want the post
360
changed to a draft status or deleted when it expires.
@@ -450,10 +525,74 @@ function expirationdate_show_options() {
450
<input type="submit" name="expirationdateSave" value="Save" />
451
</p>
452
</form>
453
- </div>
454
<?php
455
}
456
457
// [postexpirator format="l F jS, Y g:ia" tz="foo"]
458
function postexpirator_shortcode($atts) {
459
global $post;
2
/*
3
Plugin Name: Post Expirator
4
Plugin URI: http://wordpress.org/extend/plugins/post-expirator/
5
+ Description: Allows you to add an expiration date to posts which you can configure to either delete the post or change it to a draft.
6
Author: Aaron Axelsen
7
+ Version: 1.4
8
Author URI: http://www.frozenpc.net
9
*/
10
14
$expirationdateDefaultFooterContents = 'Post expires at EXPIRATIONTIME on EXPIRATIONDATE';
15
$expirationdateDefaultFooterStyle = 'font-style: italic;';
16
17
+ // Detect WPMU
18
+ function postExpirator_is_wpmu() {
19
+ return file_exists(ABSPATH."/wpmu-settings.php");
20
+ }
21
+
22
+ // Timezone Setup
23
+ function postExpiratorTimezoneSetup() {
24
+ if ( !$timezone_string = get_option( 'timezone_string' ) ) {
25
+ return false;
26
+ }
27
+
28
+ @date_default_timezone_set($timezone_string);
29
+ }
30
+
31
+ // Add cron interval of 60 seconds
32
+ function postExpiratorAddCronMinutes($array) {
33
+ $array['postexpiratorminute'] = array(
34
+ 'interval' => 60,
35
+ 'display' => __('Once a Minute')
36
+ );
37
+ return $array;
38
+ }
39
+ add_filter('cron_schedules','postExpiratorAddCronMinutes');
40
+
41
+ /**
42
+ * Add admin notice hook if cron schedule needs to be reset
43
+ */
44
+ function postExpirationAdminNotice() {
45
+ if (postExpiratorCronStatus() === false) {
46
+ echo '<div class="error fade" style="background-color:red;"><p><strong>Post Expirator cron schedules need to be reset.
47
+ <a href="'.admin_url('options-general.php?page=post-expirator.php&tab=upgrade').'" style="color: blue;">Click here to reset</a></strong></p></div>';
48
+ }
49
+ }
50
+ add_action('admin_notices','postExpirationAdminNotice');
51
52
/**
53
* Function that does the actualy deleting - called by wp_cron
54
*/
55
function expirationdate_delete_expired_posts() {
56
global $wpdb;
57
+ postExpiratorTimezoneSetup();
58
$result = $wpdb->get_results('select post_id, meta_value from ' . $wpdb->postmeta . ' as postmeta, '.$wpdb->posts.' as posts where postmeta.post_id = posts.ID AND posts.post_status = "publish" AND postmeta.meta_key = "expiration-date" AND postmeta.meta_value <= "' . mktime() . '"');
59
if (!empty($result)) foreach ($result as $a) {
60
$post_result = $wpdb->get_var('select post_type from ' . $wpdb->posts .' where ID = '. $a->post_id);
75
}
76
}
77
}
78
+ if (postExpirator_is_wpmu())
79
+ add_action ('expirationdate_delete_'.$current_blog->blog_id, 'expirationdate_delete_expired_posts');
80
+ else
81
+ add_action ('expirationdate_delete', 'expirationdate_delete_expired_posts');
82
83
/**
84
* Called at plugin activation
92
update_option('expirationdateFooterContents',$expirationdateDefaultFooterContents);
93
update_option('expirationdateFooterStyle',$expirationdateDefaultFooterStyle);
94
update_option('expirationdateDisplayFooter',0);
95
+ postExpiratorTimezoneSetup();
96
97
+ if (postExpirator_is_wpmu())
98
+ wp_schedule_event(mktime(date('H'),0,0,date('m'),date('d'),date('Y')), 'postexpiratorminute', 'expirationdate_delete_'.$current_blog->blog_id);
99
+ else
100
+ wp_schedule_event(mktime(date('H'),0,0,date('m'),date('d'),date('Y')), 'postexpiratorminute', 'expirationdate_delete');
101
}
102
register_activation_hook (__FILE__, 'expirationdate_activate');
103
113
delete_option('expirationdateDisplayFooter');
114
delete_option('expirationdateFooterContents');
115
delete_option('expirationdateFooterStyle');
116
+ if (postExpirator_is_wpmu())
117
+ wp_clear_scheduled_hook('expirationdate_delete_'.$current_blog->blog_id);
118
+ else
119
+ wp_clear_scheduled_hook('expirationdate_delete');
120
}
121
register_deactivation_hook (__FILE__, 'expirationdate_deactivate');
122
124
* adds an 'Expires' column to the post display table.
125
*/
126
function expirationdate_add_column ($columns) {
127
+ $columns['expirationdate'] = 'Expires <br/><span style="font-size: 0.8em; font-weight: normal;">(YYYY/MM/DD HH:MM)</span>';
128
return $columns;
129
}
130
add_filter ('manage_posts_columns', 'expirationdate_add_column');
137
global $wpdb, $post;
138
$id = $post->ID;
139
if ($column_name === 'expirationdate') {
140
+ postExpiratorTimezoneSetup();
141
$query = "SELECT meta_value FROM $wpdb->postmeta WHERE meta_key = \"expiration-date\" AND post_id=$id";
142
$ed = $wpdb->get_var($query);
143
+ echo ($ed ? date('Y/m/d H:i',$ed) : "Never");
144
}
145
}
146
add_action ('manage_posts_custom_column', 'expirationdate_show_value');
167
*/
168
function expirationdate_meta_box($post) {
169
// Get default month
170
+ postExpiratorTimezoneSetup();
171
$expirationdatets = get_post_meta($post->ID,'expiration-date',true);
172
if (empty($expirationdatets)) {
173
$defaultmonth = date('F');
174
$defaultday = date('d');
175
$defaulthour = date('H');
176
$defaultyear = date('Y');
177
+ $defaultminute = date('i');
178
$disabled = 'disabled="disabled"';
179
} else {
180
$defaultmonth = date('F',$expirationdatets);
181
$defaultday = date('d',$expirationdatets);
182
$defaultyear = date('Y',$expirationdatets);
183
$defaulthour = date('H',$expirationdatets);
184
+ $defaultminute = date('i',$expirationdatets);
185
186
$enabled = ' checked="checked"';
187
$disabled = '';
196
$rv[] = '<th style="text-align: left;">Year</th>';
197
$rv[] = '<th style="text-align: left;"></th>';
198
$rv[] = '<th style="text-align: left;">Hour (24 Hour Format)</th>';
199
+ $rv[] = '<th style="text-align: left;">Minute</th>';
200
$rv[] = '</tr><tr>';
201
$rv[] = '<td>';
202
$rv[] = '<select name="expirationdate_month" id="expirationdate_month"'.$disabled.'">';
225
$rv[] = '</select>';
226
$rv[] = '</td><td>@</td><td>';
227
$rv[] = '<input type="text" id="expirationdate_hour" name="expirationdate_hour" value="'.$defaulthour.'" size="2"'.$disabled.'" />';
228
+ $rv[] = '</td><td>';
229
+ $rv[] = '<input type="text" id="expirationdate_minute" name="expirationdate_minute" value="'.$defaultminute.'" size="2"'.$disabled.'" />';
230
$rv[] = '<input type="hidden" name="expirationdate_formcheck" value="true" />';
231
$rv[] = '</td></tr></table>';
232
269
document.getElementById('expirationdate_day').disabled = false;
270
document.getElementById('expirationdate_year').disabled = false;
271
document.getElementById('expirationdate_hour').disabled = false;
272
+ document.getElementById('expirationdate_minute').disabled = false;
273
} else {
274
document.getElementById('expirationdate_month').disabled = true;
275
document.getElementById('expirationdate_day').disabled = true;
276
document.getElementById('expirationdate_year').disabled = true;
277
document.getElementById('expirationdate_hour').disabled = true;
278
+ document.getElementById('expirationdate_minute').disabled = true;
279
var enable = 'false';
280
}
281
301
function expirationdate_get_blog_url() {
302
global $current_blog;
303
$schema = ( isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on' ) ? 'https://' : 'http://';
304
+
305
+ if (postExpirator_is_wpmu())
306
+ echo $schema.$current_blog->domain.$current_blog->path;
307
+ else
308
+ echo get_bloginfo('siteurl').'/';
309
}
310
311
/**
319
$day = $_POST['expirationdate_day'];
320
$year = $_POST['expirationdate_year'];
321
$hour = $_POST['expirationdate_hour'];
322
+ $minute = $_POST['expirationdate_minute'];
323
324
if (isset($_POST['enable-expirationdate'])) {
325
+ postExpiratorTimezoneSetup();
326
// Format Date
327
+ $ts = mktime($hour,$minute,0,$month,$day,$year);
328
// Update Post Meta
329
delete_post_meta($id, 'expiration-date');
330
update_post_meta($id, 'expiration-date', $ts, true);
334
}
335
add_action('save_post','expirationdate_update_post_meta');
336
337
+ /**
338
+ * Build the menu for the options page
339
+ */
340
+ function postExpiratorMenuTabs($tab) {
341
+ echo '<h2>'._('Post Expirator Options').'</h2>';
342
+ echo '<p>';
343
+ echo '<a href="'.admin_url('options-general.php?page=post-expirator.php&tab=general').'"'.(empty($tab) || $tab == 'general' ? ' style="font-weight: bold; text-decoration:none;"' : '').'>General Settings</a> | ';
344
+ echo '<a href="'.admin_url('options-general.php?page=post-expirator.php&tab=upgrade').'"'.($tab == 'upgrade' ? ' style="font-weight: bold; text-decoration:none;"' : '').'>Upgrade</a>';
345
+ echo '</p><hr/>';
346
+ }
347
+
348
+ /**
349
+ *
350
+ */
351
+ function postExpiratorMenu() {
352
+ $tab = $_GET['tab'];
353
+
354
+ echo '<div class="wrap">';
355
+ postExpiratorMenuTabs($tab);
356
+ if (empty($tab) || $tab == 'general') {
357
+ postExpiratorMenuGeneral();
358
+ } elseif ($tab == 'upgrade') {
359
+ postExpiratorMenuUpgrade();
360
+ }
361
+ echo '</div>';
362
+ }
363
+
364
/**
365
* Hook's to add plugin page menu
366
*/
367
+ function postExpiratorPluginMenu() {
368
+ add_submenu_page('options-general.php','Post Expirator Options','Post Expirator',9,basename(__FILE__),'postExpiratorMenu');
369
}
370
+ add_action('admin_menu', 'postExpiratorPluginMenu');
371
372
/**
373
* Show the Expiration Date options page
374
*/
375
+ function postExpiratorMenuGeneral() {
376
377
if ($_POST['expirationdateSave']) {
378
update_option('expirationdateExpiredPostStatus',$_POST['expired-post-status']);
430
}
431
432
?>
433
<p>
434
The post expirator plugin sets a custom meta value, and then optionally allows you to select if you want the post
435
changed to a draft status or deleted when it expires.
525
<input type="submit" name="expirationdateSave" value="Save" />
526
</p>
527
</form>
528
<?php
529
}
530
531
+ function postExpiratorCronStatus() {
532
+ $names = array('expirationdate_delete','expirationdate_delete_');
533
+ // WPMU
534
+ if (postExpirator_is_wpmu()) {
535
+ global $current_blog;
536
+ $names[] = 'expirationdate_delete_'.$current_blog->blog_id;
537
+ }
538
+ $results = array();
539
+ foreach ( $names as $name ) {
540
+ array_push($results,wp_get_schedule($name));
541
+ }
542
+
543
+ foreach ( $results as $result ) {
544
+ if ($result == 'hourly') return false;
545
+ }
546
+ return true;
547
+ }
548
+
549
+ /**
550
+ * Reset all cron schedules for Post Expirator Plugin
551
+ */
552
+ function postExpiratorResetCron() {
553
+ postExpiratorTimezoneSetup();
554
+ if (postExpirator_is_wpmu()) {
555
+ global $current_blog;
556
+ wp_clear_scheduled_hook('expirationdate_delete_'.$current_blog->blog_id);
557
+ wp_schedule_event(mktime(date('H'),0,0,date('m'),date('d'),date('Y')), 'postexpiratorminute', 'expirationdate_delete_'.$current_blog->blog_id);
558
+ } else {
559
+ wp_clear_scheduled_hook('expirationdate_delete');
560
+ wp_clear_scheduled_hook('expirationdate_delete_');
561
+ wp_schedule_event(mktime(date('H'),0,0,date('m'),date('d'),date('Y')), 'postexpiratorminute', 'expirationdate_delete');
562
+ }
563
+ }
564
+
565
+ function postExpiratorMenuUpgrade() {
566
+ if (isset($_POST['reset-cron-schedules'])) {
567
+ postExpiratorResetCron();
568
+ echo "<div id='message' class='updated fade'><p>Reset Cron Scheules!</p></div>";
569
+ }
570
+
571
+ $status = postExpiratorCronStatus();
572
+ if ($status)
573
+ $cronstatus = '<span style="color:green">OK</span>';
574
+ else
575
+ $cronstatus = '<span style="color:red">RESET NEEDED</span>';
576
+
577
+ ?>
578
+ <form method="post" id="postExpiratorMenuUpgrade">
579
+ <h3>Upgrade</h3>
580
+ <table class="form-table">
581
+ <tr valign-"top">
582
+ <th scope="row"><label for="reset-cron-schedules">Reset Cron Schedules:</label></th>
583
+ <td>
584
+ <input type="submit" name="reset-cron-schedules" id="reset-cron-schedules" value="Reset" />
585
+ Status: <?php echo $cronstatus; ?>
586
+ <br/>
587
+ Resets the cron scheduler and removes any old or stray entries.
588
+ </td>
589
+ </tr>
590
+ </table>
591
+ </form>
592
+ <?php
593
+ }
594
+
595
+
596
// [postexpirator format="l F jS, Y g:ia" tz="foo"]
597
function postexpirator_shortcode($atts) {
598
global $post;
readme.txt CHANGED
@@ -1,11 +1,11 @@
1
=== Post Expirator ===
2
Contributors: axelseaa
3
- Tags: expire, posts, pages
4
- Requires at least: 2.5
5
- Tested up to: 2.7
6
- Stable tag: trunk
7
8
- Allows you to add an expiration date (hourly) to posts which you can configure to either delete the post or change it to a draft.
9
10
== Description ==
11
@@ -23,6 +23,8 @@ default display format. See the [PHP Date Function](http://us2.php.net/manual/e
23
* dateformat - format set here will override the value set on the settings page
24
* timeformat - format set here will override the value set on the settings page
25
26
== Wordpress MU ==
27
28
This plugin is compataibile with Wordpress MU 1.5+, however currently it will not work in the mu-plugins folder due to the plugin activation
@@ -41,6 +43,14 @@ This section describes how to install the plugin and get it working.
41
42
== Changelog ==
43
44
**Version 1.3.1**
45
46
* Fixed sporadic issue of expired posts not being removed
1
=== Post Expirator ===
2
Contributors: axelseaa
3
+ Tags: expire, posts, pages, schedule
4
+ Requires at least: 2.8
5
+ Tested up to: 3.0
6
+ Stable tag: 1.4
7
8
+ Allows you to add an expiration date (minute) to posts which you can configure to either delete the post or change it to a draft.
9
10
== Description ==
11
23
* dateformat - format set here will override the value set on the settings page
24
* timeformat - format set here will override the value set on the settings page
25
26
+ Note on upgrading to 1.4: After upgrading, you may need to reset the cron schedules. Following onscreen notice if prompted. Previously scheduled posts will not be updated, they will be deleted referncing the old timezone setting. If you wish to update them, you will need to manually update the expiration time.
27
+
28
== Wordpress MU ==
29
30
This plugin is compataibile with Wordpress MU 1.5+, however currently it will not work in the mu-plugins folder due to the plugin activation
43
44
== Changelog ==
45
46
+ **Version 1.4**
47
+
48
+ NOTE: After upgrading, you may need to reset the cron schedules. Following onscreen notice if prompted. Previously scheduled posts will not be updated, they will be deleted referncing the old timezone setting. If you wish to update them, you will need to manually update the expiration time.
49
+
50
+ * Fixed compatability issues with Wordpress - plugin was originally coded for WPMU - should now work on both
51
+ * Added ability to schedule post expiration by minute
52
+ * Fixed timezone - now uses the same timezone as configured by the blog
53
+
54
**Version 1.3.1**
55
56
* Fixed sporadic issue of expired posts not being removed