Advanced Automatic Updates - Version 0.3

Version Description

  • ADDED: Extra update checks, updates will now occur as soon as is humanly possible
  • ADDED: Much nicer notification emails when upgrades occur
  • ADDED: Option to display debug inforamtion in the notification email
  • FIXED: Use ouput buffering to ensure nothing is printed during upgrades
Download this release

Release Info

Developer pento
Plugin Icon wp plugin Advanced Automatic Updates
Version 0.3
Comparing to
See all releases

Code changes from version 0.2 to 0.3

Files changed (4) hide show
  1. admin.php +11 -0
  2. automatic-updater.php +119 -27
  3. readme.txt +7 -1
  4. updater-skin.php +11 -2
admin.php CHANGED
@@ -63,7 +63,13 @@ function auto_updater_settings() {
63
 
64
  echo "<p><input type='checkbox' id='$type' name='$type' value='1'$checked> <label for='$type'>{$messages[$type]}</label></p>";
65
  }
 
 
 
 
66
  ?>
 
 
67
  <p><input class="button button-primary" type="submit" name="submit" id="submit" value="<?php esc_attr_e( 'Save Changes', 'automatic-updater' ); ?>" /></p>
68
  </form>
69
  </div>
@@ -81,5 +87,10 @@ function auto_updater_save_settings() {
81
  $options['update'][$type] = false;
82
  }
83
 
 
 
 
 
 
84
  update_option( 'automatic-updater', $options );
85
  }
63
 
64
  echo "<p><input type='checkbox' id='$type' name='$type' value='1'$checked> <label for='$type'>{$messages[$type]}</label></p>";
65
  }
66
+
67
+ $checked = '';
68
+ if ( $option['debug'] )
69
+ $checked = ' checked="checked"';
70
  ?>
71
+ <br/><br/>
72
+ <p input type="checkbox" id="debug" name="debug" value="1"<?php echo $checked; ?>> <label for="debug"><?php _e( 'Show debug inforamtion in the notification email.', 'automatic-updater' ); ?></label></p>
73
  <p><input class="button button-primary" type="submit" name="submit" id="submit" value="<?php esc_attr_e( 'Save Changes', 'automatic-updater' ); ?>" /></p>
74
  </form>
75
  </div>
87
  $options['update'][$type] = false;
88
  }
89
 
90
+ if ( ! empty( $_REQUEST['debug'] ) )
91
+ $options['debug'] = true;
92
+ else
93
+ $options['debug'] = false;
94
+
95
  update_option( 'automatic-updater', $options );
96
  }
automatic-updater.php CHANGED
@@ -4,7 +4,7 @@
4
  * Plugin URI: http://pento.net/
5
  * Description: Automatically update your WordPress site, as soon as updates are released! Never worry about falling behing on updating again!
6
  * Author: pento
7
- * Version: 0.2
8
  * Author URI: http://pento.net
9
  * License: GPL2+
10
  * Text Domain: automatic-updater
@@ -27,30 +27,41 @@ function auto_updater_init() {
27
  'plugins' => false,
28
  'themes' => false,
29
  ),
 
30
  );
31
  update_option( 'automatic-updater', $options );
32
  }
33
 
 
 
 
 
 
 
34
  global $auto_updater_running;
35
  // If the update check was one we called manually, don't get into a crazy recusive loop.
36
  if ( $auto_updater_running )
37
  return;
38
 
39
- // Only do this during the wp-cron version check, it'd suck if the upgrade was interrupted.
40
- if ( ! defined( 'DOING_CRON' ) || ! DOING_CRON )
41
- return;
42
-
43
- if ( ! empty( $options['update']['core'] ) ) {
44
- add_action( 'set_site_transient_update_core', 'auto_updater_core');
45
- add_action( 'set_site_transient__site_transient_update_core', 'auto_updater_core');
46
- }
47
- if ( ! empty( $options['update']['plugins'] ) ) {
48
- add_action( 'set_site_transient_update_plugins', 'auto_updater_plugins' );
49
- add_action( 'set_site_transient__site_transient_update_plugins', 'auto_updater_plugins' );
50
  }
51
- if ( ! empty( $options['update']['themes'] ) ) {
52
- add_action( 'set_site_transient_update_themes', 'auto_updater_themes' );
53
- add_action( 'set_site_transient__site_transient_update_themes', 'auto_updater_themes' );
 
 
 
 
 
 
54
  }
55
  }
56
  add_action( 'init', 'auto_updater_init' );
@@ -61,7 +72,6 @@ function auto_updater_core() {
61
  return;
62
 
63
  // Forgive me father, for I have sinned. I have included wp-admin files in a plugin.
64
- // It's behind a DOING_CRON check, so won't cause much trouble.
65
  include_once( ABSPATH . 'wp-admin/includes/update.php' );
66
  include_once( ABSPATH . 'wp-admin/includes/file.php' );
67
 
@@ -75,22 +85,35 @@ function auto_updater_core() {
75
  if ( empty( $update ) )
76
  return;
77
 
 
 
78
  $auto_updater_running = true;
79
 
80
  do_action( 'auto_updater_before_update', 'core' );
81
 
82
  $skin = new Auto_Updater_Skin();
83
  $upgrader = new Core_Upgrader( $skin );
84
- $upgrader->upgrade( $update );
85
 
86
  do_action( 'auto_updater_after_update', 'core' );
87
 
88
- $message = join( "\r\n", $skin->messages );
 
 
 
 
 
 
 
 
 
 
89
 
90
- wp_mail( get_option( 'admin_email' ), __( 'Core Update', 'automatic-updater' ), $message );
91
 
92
  wp_version_check();
93
  }
 
94
 
95
  function auto_updater_plugins() {
96
  global $auto_updater_running;
@@ -98,11 +121,12 @@ function auto_updater_plugins() {
98
  return;
99
 
100
  include_once( ABSPATH . 'wp-admin/includes/update.php' );
 
101
  include_once( ABSPATH . 'wp-admin/includes/file.php' );
102
 
103
  include_once( dirname( __FILE__ ) . '/updater-skin.php' );
104
 
105
- $plugins = apply_filters( 'auto_updater_plugin_updates', array_keys( get_plugin_updates() ) );
106
  if ( empty( $plugins ) )
107
  return;
108
 
@@ -112,16 +136,38 @@ function auto_updater_plugins() {
112
 
113
  $skin = new Auto_Updater_Skin();
114
  $upgrader = new Plugin_Upgrader( $skin );
115
- $upgrader->bulk_upgrade( $plugins );
116
 
117
  do_action( 'auto_updater_after_update', 'plugins' );
118
 
119
- $message = join( "\r\n", $skin->messages );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
120
 
121
- wp_mail( get_option( 'admin_email' ), __( 'Plugin Update', 'automatic-updater' ), $message );
122
 
123
  wp_update_plugins();
124
  }
 
125
 
126
  function auto_updater_themes() {
127
  global $auto_updater_running;
@@ -133,7 +179,7 @@ function auto_updater_themes() {
133
 
134
  include_once( dirname( __FILE__ ) . '/updater-skin.php' );
135
 
136
- $themes = apply_filters( 'auto_updater_theme_updates', array_keys( get_theme_updates() ) );
137
  if ( empty( $themes ) )
138
  return;
139
 
@@ -143,14 +189,60 @@ function auto_updater_themes() {
143
 
144
  $skin = new Auto_Updater_Skin();
145
  $upgrader = new Theme_Upgrader( $skin );
146
- $upgrader->bulk_upgrade( $themes );
147
 
148
  do_action( 'auto_updater_after_update', 'themes' );
149
 
150
- $message = join( "\r\n", $skin->messages );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
151
 
152
- wp_mail( get_option( 'admin_email' ), __( 'Theme Update', 'automatic-updater' ), $message );
153
 
154
  wp_update_themes();
155
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
156
 
4
  * Plugin URI: http://pento.net/
5
  * Description: Automatically update your WordPress site, as soon as updates are released! Never worry about falling behing on updating again!
6
  * Author: pento
7
+ * Version: 0.3
8
  * Author URI: http://pento.net
9
  * License: GPL2+
10
  * Text Domain: automatic-updater
27
  'plugins' => false,
28
  'themes' => false,
29
  ),
30
+ 'debug' => false,
31
  );
32
  update_option( 'automatic-updater', $options );
33
  }
34
 
35
+ // 'debug' option added in version 0.3
36
+ if ( ! array_key_exists( 'debug', $options ) ) {
37
+ $options['debug'] = false;
38
+ update_option( 'automatic-updater', $options );
39
+ }
40
+
41
  global $auto_updater_running;
42
  // If the update check was one we called manually, don't get into a crazy recusive loop.
43
  if ( $auto_updater_running )
44
  return;
45
 
46
+ $types = array( 'wordpress' => 'core', 'plugins' => 'plugins', 'themes' => 'themes' );
47
+ if ( defined( 'DOING_CRON' ) && DOING_CRON ) {
48
+ // We're in a cron, do updates now
49
+ foreach ( $types as $type ) {
50
+ if ( ! empty( $options['update'][$type] ) ) {
51
+ add_action( "set_site_transient_update_$type", "auto_updater_$type" );
52
+ add_action( "set_site_transient__site_transient_update_$type", "auto_updater_$type" );
53
+ }
54
+ }
 
 
55
  }
56
+ else {
57
+ include_once( ABSPATH . 'wp-admin/includes/update.php' );
58
+ $update_data = wp_get_update_data();
59
+ // Not in a cron, schedule updates to happen in the next cron run
60
+ foreach ( $types as $internal => $type ) {
61
+ if ( ! empty( $options['update'][$type] ) && $update_data['counts'][$internal] > 0 ) {
62
+ wp_schedule_single_event( time(), "auto_updater_{$type}_event" );
63
+ }
64
+ }
65
  }
66
  }
67
  add_action( 'init', 'auto_updater_init' );
72
  return;
73
 
74
  // Forgive me father, for I have sinned. I have included wp-admin files in a plugin.
 
75
  include_once( ABSPATH . 'wp-admin/includes/update.php' );
76
  include_once( ABSPATH . 'wp-admin/includes/file.php' );
77
 
85
  if ( empty( $update ) )
86
  return;
87
 
88
+ $old_version = get_bloginfo( 'version' );
89
+
90
  $auto_updater_running = true;
91
 
92
  do_action( 'auto_updater_before_update', 'core' );
93
 
94
  $skin = new Auto_Updater_Skin();
95
  $upgrader = new Core_Upgrader( $skin );
96
+ $result = $upgrader->upgrade( $update );
97
 
98
  do_action( 'auto_updater_after_update', 'core' );
99
 
100
+ if ( is_wp_error( $result ) ) {
101
+ $message = __( "While trying to upgrade WordPress, we ran into the following error:", 'automatic-updater' );
102
+ $message .= "\r\n\r\n" . $result->get_error_message() . "\r\n\r\n";
103
+ $message .= __( "We're sorry it didn't work out. Please try upgrading manually, instead.", 'automatic-updater' );
104
+ }
105
+ else {
106
+ $message = sprintf( __( "We've successfully upgraded WordPress from version %1s to version %2s!", 'automatic-updater' ), $old_version, $update->current );
107
+ $message .= "\r\n\r\n" . __( 'Have fun!', 'automatic-updater' );
108
+ }
109
+
110
+ $debug = join( "\r\n", $skin->messages );
111
 
112
+ auto_updater_notification( $message, $debug );
113
 
114
  wp_version_check();
115
  }
116
+ add_action( 'auto_updater_core_event', 'auto_updater_core' );
117
 
118
  function auto_updater_plugins() {
119
  global $auto_updater_running;
121
  return;
122
 
123
  include_once( ABSPATH . 'wp-admin/includes/update.php' );
124
+ include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
125
  include_once( ABSPATH . 'wp-admin/includes/file.php' );
126
 
127
  include_once( dirname( __FILE__ ) . '/updater-skin.php' );
128
 
129
+ $plugins = apply_filters( 'auto_updater_plugin_updates', get_plugin_updates() );
130
  if ( empty( $plugins ) )
131
  return;
132
 
136
 
137
  $skin = new Auto_Updater_Skin();
138
  $upgrader = new Plugin_Upgrader( $skin );
139
+ $result = $upgrader->bulk_upgrade( array_keys( $plugins ) );
140
 
141
  do_action( 'auto_updater_after_update', 'plugins' );
142
 
143
+ $message = _n( 'We found a plugin upgrade!', 'We found upgrades for some plugins!', count( $plugins ), 'automatic-updater' );
144
+ $message .= "\r\n\r\n";
145
+
146
+ foreach ( $plugins as $id => $plugin ) {
147
+ if ( is_wp_error( $result[$id] ) ) {
148
+ /* translators: First argument is the Plugin name, second argument is the error encountered while upgrading */
149
+ $message .= sprintf( __( "%1s: We encounted an error upgrading this plugin: %2s", 'automatic-updater' ),
150
+ $plugin->Name,
151
+ $result[$id]->get_error_message() );
152
+ }
153
+ else {
154
+ /* tranlators: First argument is the Plugin name, second argument is the old version number, third argument is the new version number */
155
+ $message .= sprintf( __( "%1s: Successfully upgraded from version %2s to %3s!", 'automatic-updater' ),
156
+ $plugin->Name,
157
+ $plugin->Version,
158
+ $plugin->update->new_version );
159
+ }
160
+
161
+ $message .= "\r\n";
162
+ }
163
+
164
+ $debug = join( "\r\n", $skin->messages );
165
 
166
+ auto_updater_notification( $message, $debug );
167
 
168
  wp_update_plugins();
169
  }
170
+ add_action( 'auto_updater_plugins_event', 'auto_updater_plugins' );
171
 
172
  function auto_updater_themes() {
173
  global $auto_updater_running;
179
 
180
  include_once( dirname( __FILE__ ) . '/updater-skin.php' );
181
 
182
+ $themes = apply_filters( 'auto_updater_theme_updates', get_theme_updates() );
183
  if ( empty( $themes ) )
184
  return;
185
 
189
 
190
  $skin = new Auto_Updater_Skin();
191
  $upgrader = new Theme_Upgrader( $skin );
192
+ $result = $upgrader->bulk_upgrade( array_keys( $themes ) );
193
 
194
  do_action( 'auto_updater_after_update', 'themes' );
195
 
196
+ $message = _n( 'We found a theme upgrade!', 'We found upgrades for some themes!', count( $themes ), 'automatic-updater' );
197
+ $message .= "\r\n\r\n";
198
+
199
+ foreach ( $themes as $id => $theme ) {
200
+ if ( is_wp_error( $result[$id] ) ) {
201
+ /* translators: First argument is the Theme name, second argument is the error encountered while upgrading */
202
+ $message .= sprintf( __( "%1s: We encounted an error upgrading this theme: %2s", 'automatic-updater' ),
203
+ $theme->name,
204
+ $result[$id]->get_error_message() );
205
+ }
206
+ else {
207
+ /* tranlators: First argument is the Theme name, second argument is the old version number, third argument is the new version number */
208
+ $message .= sprintf( __( "%1s: Successfully upgraded from version %2s to %3s!", 'automatic-updater' ),
209
+ $theme->name,
210
+ $theme->version,
211
+ $theme->update['new_version'] );
212
+ }
213
+
214
+ $message .= "\r\n";
215
+ }
216
+
217
+ $debug = join( "\r\n", $skin->messages );
218
 
219
+ auto_updater_notification( $message, $debug );
220
 
221
  wp_update_themes();
222
  }
223
+ add_action( 'auto_updater_themes_event', 'auto_updater_themes' );
224
+
225
+ function auto_updater_notification( $info = '', $debug = '' ) {
226
+ $options = get_option( 'automatic-updater', array() );
227
+ $site = get_home_url();
228
+ $subject = sprintf( __( 'WordPress Update: %1s', 'automatic-updater' ), $site );
229
+
230
+ $message = __( 'Howdy!', 'automatic-updater' );
231
+ $message .= "\r\n\r\n";
232
+ $message .= sprintf( __( 'Automatic Updater just ran on your site, %1s, with the following result:', 'automatic-updater' ), $site );
233
+ $message .= "\r\n\r\n";
234
+
235
+ $message .= $info;
236
+
237
+ $message .= "\r\n";
238
+ $message .= __( 'Thanks for using the Automatic Updater plugin!', 'automatic-updater' );
239
+
240
+ if ( ! empty( $options['debug'] ) ) {
241
+ $message .= "\r\n\r\n\r\n\r\n";
242
+ $message .= __( 'Debug Information:', 'automatic-updater' );
243
+ $message .= "\r\n\r\n$debug";
244
+ }
245
+
246
+ wp_mail( get_option( 'admin_email' ), $subject, $message );
247
+ }
248
 
readme.txt CHANGED
@@ -4,7 +4,7 @@ Donate link: http://pento.net/donate/
4
  Tags: updates, core, plugins, themes
5
  Requires at least: 3.3
6
  Tested up to: 3.5
7
- Stable tag: 0.2
8
 
9
  Automatically update WordPress, your themes and plugins! Never have to click the update button again!
10
 
@@ -40,6 +40,12 @@ There are some Actions and Filters provided, check the [Documentation](http://pe
40
 
41
  == Changelog ==
42
 
 
 
 
 
 
 
43
  = 0.2 =
44
  * ADDED: Some useful filters and actions. See the [Documentation](http://pento.net/projects/automatic-updater-for-wordpress/) for details
45
  * FIXED: s/automattic/automatic/g
4
  Tags: updates, core, plugins, themes
5
  Requires at least: 3.3
6
  Tested up to: 3.5
7
+ Stable tag: 0.3
8
 
9
  Automatically update WordPress, your themes and plugins! Never have to click the update button again!
10
 
40
 
41
  == Changelog ==
42
 
43
+ = 0.3 =
44
+ * ADDED: Extra update checks, updates will now occur as soon as is humanly possible
45
+ * ADDED: Much nicer notification emails when upgrades occur
46
+ * ADDED: Option to display debug inforamtion in the notification email
47
+ * FIXED: Use ouput buffering to ensure nothing is printed during upgrades
48
+
49
  = 0.2 =
50
  * ADDED: Some useful filters and actions. See the [Documentation](http://pento.net/projects/automatic-updater-for-wordpress/) for details
51
  * FIXED: s/automattic/automatic/g
updater-skin.php CHANGED
@@ -34,8 +34,17 @@ class Auto_Updater_Skin extends WP_Upgrader_Skin {
34
  $this->messages[] = $string;
35
  }
36
 
37
- function header() {}
38
- function footer() {}
 
 
 
 
 
 
 
 
 
39
  function bulk_header() {}
40
  function bulk_footer() {}
41
  function before() {}
34
  $this->messages[] = $string;
35
  }
36
 
37
+ function header() {
38
+ ob_start();
39
+ }
40
+
41
+ function footer() {
42
+ $output = ob_get_contents();
43
+ if ( ! empty( $output ) )
44
+ $this->feedback( $output );
45
+ ob_end_clean();
46
+ }
47
+
48
  function bulk_header() {}
49
  function bulk_footer() {}
50
  function before() {}