2007-08-17 12:33:52 +02:00
< ? php
// The admin side of our 1.0 update system
2008-01-04 20:36:34 +01:00
function core_update_footer ( $msg = '' ) {
2007-08-30 20:21:03 +02:00
if ( ! current_user_can ( 'manage_options' ) )
return sprintf ( '| ' . __ ( 'Version %s' ), $GLOBALS [ 'wp_version' ] );
2007-08-17 12:33:52 +02:00
$cur = get_option ( 'update_core' );
switch ( $cur -> response ) {
case 'development' :
2007-08-28 20:57:55 +02:00
return sprintf ( '| ' . __ ( 'You are using a development version (%s). Cool! Please <a href="%s">stay updated</a>.' ), $GLOBALS [ 'wp_version' ], 'http://wordpress.org/download/svn/' );
2007-08-17 12:33:52 +02:00
break ;
case 'upgrade' :
2007-08-28 20:57:55 +02:00
return sprintf ( '| <strong>' . __ ( 'Your WordPress %s is out of date. <a href="%s">Please update</a>.' ) . '</strong>' , $GLOBALS [ 'wp_version' ], $cur -> url );
2007-08-17 12:33:52 +02:00
break ;
case 'latest' :
2007-08-30 18:25:50 +02:00
default :
2007-08-28 20:57:55 +02:00
return sprintf ( '| ' . __ ( 'Version %s' ), $GLOBALS [ 'wp_version' ] );
2007-08-17 12:33:52 +02:00
break ;
}
}
add_filter ( 'update_footer' , 'core_update_footer' );
function update_nag () {
2007-08-30 20:21:03 +02:00
$cur = get_option ( 'update_core' );
2007-08-20 09:01:15 +02:00
2007-08-30 20:21:03 +02:00
if ( ! isset ( $cur -> response ) || $cur -> response != 'upgrade' )
return false ;
2007-08-20 09:01:15 +02:00
2007-08-30 20:21:03 +02:00
if ( current_user_can ( 'manage_options' ) )
$msg = sprintf ( __ ( 'A new version of WordPress is available! <a href="%s">Please update now</a>.' ), $cur -> url );
else
$msg = __ ( 'A new version of WordPress is available! Please notify the site administrator.' );
echo " <div id='update-nag'> $msg </div> " ;
2007-08-17 12:33:52 +02:00
}
2007-08-20 09:01:15 +02:00
add_action ( 'admin_notices' , 'update_nag' , 3 );
2007-08-17 12:33:52 +02:00
2007-08-22 12:48:48 +02:00
function wp_update_plugins () {
global $wp_version ;
2007-09-22 02:08:50 +02:00
if ( ! function_exists ( 'fsockopen' ) )
return false ;
2007-08-22 12:48:48 +02:00
$plugins = get_plugins ();
$active = get_option ( 'active_plugins' );
$current = get_option ( 'update_plugins' );
$new_option = '' ;
$new_option -> last_checked = time ();
$plugin_changed = false ;
foreach ( $plugins as $file => $p ) {
$new_option -> checked [ $file ] = $p [ 'Version' ];
if ( ! isset ( $current -> checked [ $file ] ) ) {
$plugin_changed = true ;
continue ;
}
2008-02-28 00:43:22 +01:00
if ( strval ( $current -> checked [ $file ]) !== strval ( $p [ 'Version' ]) )
2007-08-22 12:48:48 +02:00
$plugin_changed = true ;
}
2007-09-04 01:32:58 +02:00
if (
isset ( $current -> last_checked ) &&
43200 > ( time () - $current -> last_checked ) &&
2007-08-22 12:48:48 +02:00
! $plugin_changed
)
return false ;
$to_send -> plugins = $plugins ;
$to_send -> active = $active ;
$send = serialize ( $to_send );
$request = 'plugins=' . urlencode ( $send );
$http_request = " POST /plugins/update-check/1.0/ HTTP/1.0 \r \n " ;
$http_request .= " Host: api.wordpress.org \r \n " ;
$http_request .= " Content-Type: application/x-www-form-urlencoded; charset= " . get_option ( 'blog_charset' ) . " \r \n " ;
$http_request .= " Content-Length: " . strlen ( $request ) . " \r \n " ;
$http_request .= 'User-Agent: WordPress/' . $wp_version . '; ' . get_bloginfo ( 'url' ) . " \r \n " ;
$http_request .= " \r \n " ;
$http_request .= $request ;
$response = '' ;
2007-09-22 02:08:50 +02:00
if ( false != ( $fs = @ fsockopen ( 'api.wordpress.org' , 80 , $errno , $errstr , 3 ) ) && is_resource ( $fs ) ) {
2007-08-22 12:48:48 +02:00
fwrite ( $fs , $http_request );
while ( ! feof ( $fs ) )
$response .= fgets ( $fs , 1160 ); // One TCP-IP packet
fclose ( $fs );
$response = explode ( " \r \n \r \n " , $response , 2 );
}
$response = unserialize ( $response [ 1 ] );
if ( $response )
$new_option -> response = $response ;
update_option ( 'update_plugins' , $new_option );
}
add_action ( 'load-plugins.php' , 'wp_update_plugins' );
function wp_plugin_update_row ( $file ) {
global $plugin_data ;
$current = get_option ( 'update_plugins' );
if ( ! isset ( $current -> response [ $file ] ) )
return false ;
$r = $current -> response [ $file ];
echo " <tr><td colspan='5' class='plugin-update'> " ;
2008-02-11 06:45:54 +01:00
printf ( __ ( 'There is a new version of %1$s available. <a href="%2$s">Download version %3$s here</a> or <a href="%4$s">upgrade automatically</a>.' ), $plugin_data [ 'Name' ], $r -> url , $r -> new_version , " update.php?action=upgrade-plugin&plugin= $file " );
2007-08-22 12:48:48 +02:00
echo " </td></tr> " ;
}
add_action ( 'after_plugin_row' , 'wp_plugin_update_row' );
2008-02-11 06:45:54 +01:00
function wp_update_plugin ( $plugin , $feedback = '' ) {
global $wp_filesystem ;
if ( ! empty ( $feedback ) )
add_filter ( 'update_feedback' , $feedback );
// Is an update available?
$current = get_option ( 'update_plugins' );
if ( ! isset ( $current -> response [ $plugin ] ) )
return new WP_Error ( 'up_to_date' , __ ( 'The plugin is at the latest version.' ));
// Is a filesystem accessor setup?
if ( ! $wp_filesystem || ! is_object ( $wp_filesystem ) )
WP_Filesystem ();
if ( ! is_object ( $wp_filesystem ) )
return new WP_Error ( 'fs_unavailable' , __ ( 'Could not access filesystem.' ));
2008-03-02 21:17:30 +01:00
if ( $wp_filesystem -> errors -> get_error_code () )
2008-02-11 06:45:54 +01:00
return new WP_Error ( 'fs_error' , __ ( 'Filesystem error' ), $wp_filesystem -> errors );
2008-03-04 18:10:17 +01:00
//Get the Base folder
$base = $wp_filesystem -> get_base_dir ();
2008-03-10 08:44:23 +01:00
if ( empty ( $base ) )
return new WP_Error ( 'fs_nowordpress' , __ ( 'Unable to locate WordPress directory.' ));
2008-03-04 18:10:17 +01:00
2008-02-11 06:45:54 +01:00
// Get the URL to the zip file
$r = $current -> response [ $plugin ];
if ( empty ( $r -> package ) )
return new WP_Error ( 'no_package' , __ ( 'Upgrade package not available.' ));
// Download the package
$package = $r -> package ;
2008-03-04 18:10:17 +01:00
apply_filters ( 'update_feedback' , sprintf ( __ ( " Downloading update from %s " ), $package ));
2008-02-11 06:45:54 +01:00
$file = download_url ( $package );
if ( ! $file )
return new WP_Error ( 'download_failed' , __ ( 'Download failed.' ));
$name = basename ( $plugin , '.php' );
2008-03-04 18:10:17 +01:00
$working_dir = $base . 'wp-content/upgrade/' . $name ;
2008-02-11 06:45:54 +01:00
// Clean up working directory
2008-03-01 22:20:23 +01:00
if ( is_dir ( $working_dir ) )
$wp_filesystem -> delete ( $working_dir , true );
2008-02-11 06:45:54 +01:00
apply_filters ( 'update_feedback' , __ ( " Unpacking the update " ));
// Unzip package to working directory
$result = unzip_file ( $file , $working_dir );
if ( is_wp_error ( $result ) ) {
unlink ( $file );
$wp_filesystem -> delete ( $working_dir , true );
return $result ;
}
// Once installed, delete the package
unlink ( $file );
2008-03-02 21:17:30 +01:00
2008-02-11 06:45:54 +01:00
// Remove the existing plugin.
apply_filters ( 'update_feedback' , __ ( " Removing the old version of the plugin " ));
2008-03-04 18:10:17 +01:00
$plugin_dir = dirname ( $base . PLUGINDIR . " / $plugin " );
$plugin_dir = trailingslashit ( $plugin_dir );
2008-02-11 06:45:54 +01:00
// If plugin is in its own directory, recursively delete the directory.
2008-03-04 18:10:17 +01:00
if ( '.' != $plugin_dir && $base . PLUGINDIR != $plugin_dir )
2008-03-01 22:20:23 +01:00
$deleted = $wp_filesystem -> delete ( $plugin_dir , true );
else
2008-03-04 18:10:17 +01:00
$deleted = $wp_filesystem -> delete ( $base . PLUGINDIR . " / $plugin " );
2008-03-01 22:20:23 +01:00
if ( ! $deleted ) {
$wp_filesystem -> delete ( $working_dir , true );
return new WP_Error ( 'delete_failed' , __ ( 'Could not remove the old plugin' ));
}
2008-02-11 06:45:54 +01:00
apply_filters ( 'update_feedback' , __ ( " Installing the latest version " ));
// Copy new version of plugin into place.
2008-03-04 18:10:17 +01:00
if ( ! copy_dir ( $working_dir , $base . PLUGINDIR ) ) {
2008-03-01 22:20:23 +01:00
//$wp_filesystem->delete($working_dir, true);
return new WP_Error ( 'install_failed' , __ ( 'Installation failed' ));
}
2008-02-11 06:45:54 +01:00
// Remove working directory
$wp_filesystem -> delete ( $working_dir , true );
// Force refresh of plugin update information
delete_option ( 'update_plugins' );
}
2007-08-28 20:57:55 +02:00
?>