2007-08-17 12:33:52 +02:00
< ? php
2008-03-11 17:13:07 +01:00
// The admin side of our 1.1 update system
2007-08-17 12:33:52 +02:00
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' :
2008-03-11 17:13:07 +01:00
return sprintf ( '| ' . __ ( 'You are using a development version (%s). Cool! Please <a href="%s">stay updated</a>.' ), $GLOBALS [ 'wp_version' ], $cur -> url , $cur -> current );
2007-08-17 12:33:52 +02:00
break ;
case 'upgrade' :
2008-03-11 17:13:07 +01:00
if ( current_user_can ( 'manage_options' ) ) {
return sprintf ( '| <strong>' . __ ( '<a href="%2$s">Get Version %3$s</a>' ) . '</strong>' , $GLOBALS [ 'wp_version' ], $cur -> url , $cur -> current );
break ;
}
2007-08-17 12:33:52 +02:00
case 'latest' :
2007-08-30 18:25:50 +02:00
default :
2008-03-11 17:13:07 +01:00
return sprintf ( '| ' . __ ( 'Version %s' ), $GLOBALS [ 'wp_version' ], $cur -> url , $cur -> current );
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' ) )
2008-03-11 17:13:07 +01:00
$msg = sprintf ( __ ( 'WordPress %2$s is available! <a href="%1$s">Please update now</a>.' ), $cur -> url , $cur -> current );
2007-08-30 20:21:03 +02:00
else
2008-03-11 17:13:07 +01:00
$msg = sprintf ( __ ( 'WordPress %2$s is available! Please notify the site administrator.' ), $cur -> url , $cur -> current );
2007-08-30 20:21:03 +02:00
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
2008-03-11 17:13:07 +01:00
// Called directly from dashboard
function update_right_now_message () {
$cur = get_option ( 'update_core' );
$msg = sprintf ( __ ( 'This is WordPress version %s.' ), $GLOBALS [ 'wp_version' ] );
if ( isset ( $cur -> response ) && $cur -> response == 'upgrade' && current_user_can ( 'manage_options' ) )
$msg .= " <a href=' $cur->url ' class='rbutton'> " . sprintf ( __ ( 'Update to %s' ), $cur -> current ? $cur -> current : __ ( 'Latest' ) ) . '</a>' ;
echo " <span id='wp-version-message'> $msg </span> " ;
}
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' );
2008-06-04 20:09:31 +02:00
function wp_plugin_update_row ( $file , $plugin_data ) {
2007-08-22 12:48:48 +02:00
$current = get_option ( 'update_plugins' );
if ( ! isset ( $current -> response [ $file ] ) )
return false ;
$r = $current -> response [ $file ];
2008-06-04 20:09:31 +02:00
echo '<tr><td colspan="5" class="plugin-update">' ;
2008-06-06 21:21:35 +02:00
if ( ! current_user_can ( 'update_plugins' ) )
2008-03-21 00:43:54 +01:00
printf ( __ ( 'There is a new version of %1$s available. <a href="%2$s">Download version %3$s here</a>.' ), $plugin_data [ 'Name' ], $r -> url , $r -> new_version );
2008-03-21 00:54:17 +01:00
else if ( empty ( $r -> package ) )
2008-03-21 00:43:54 +01:00
printf ( __ ( 'There is a new version of %1$s available. <a href="%2$s">Download version %3$s here</a> <em>automatic upgrade unavailable for this plugin</em>.' ), $plugin_data [ 'Name' ], $r -> url , $r -> new_version );
else
2008-06-04 20:09:31 +02: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 , wp_nonce_url ( 'update.php?action=upgrade-plugin&plugin=' . $file , 'upgrade-plugin_' . $file ) );
2008-03-21 00:43:54 +01:00
2008-06-04 20:09:31 +02:00
echo '</td></tr>' ;
2007-08-22 12:48:48 +02:00
}
2008-06-04 20:09:31 +02:00
add_action ( 'after_plugin_row' , 'wp_plugin_update_row' , 10 , 2 );
2007-08-22 12:48:48 +02:00
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?
2008-05-29 19:29:32 +02:00
if ( ! $wp_filesystem || ! is_object ( $wp_filesystem ) )
2008-02-11 06:45:54 +01:00
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-05-27 19:55:24 +02:00
//Get the base plugin folder
2008-05-29 19:29:32 +02:00
$plugins_dir = $wp_filesystem -> wp_plugins_dir ();
if ( empty ( $plugins_dir ) )
2008-05-29 21:06:27 +02:00
return new WP_Error ( 'fs_no_plugins_dir' , __ ( 'Unable to locate WordPress Plugin directory.' ));
2008-05-29 19:29:32 +02:00
//And the same for the Content directory.
$content_dir = $wp_filesystem -> wp_content_dir ();
if ( empty ( $content_dir ) )
2008-05-29 21:06:27 +02:00
return new WP_Error ( 'fs_no_content_dir' , __ ( 'Unable to locate WordPress Content directory (wp-content).' ));
2008-03-10 08:44:23 +01:00
2008-05-29 19:29:32 +02:00
$plugins_dir = trailingslashit ( $plugins_dir );
$content_dir = trailingslashit ( $content_dir );
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-11 17:37:44 +01:00
apply_filters ( 'update_feedback' , sprintf ( __ ( 'Downloading update from %s' ), $package ));
2008-05-29 19:29:32 +02:00
$download_file = download_url ( $package );
2008-02-11 06:45:54 +01:00
2008-05-29 19:29:32 +02:00
if ( is_wp_error ( $download_file ) )
2008-06-06 03:45:58 +02:00
return new WP_Error ( 'download_failed' , __ ( 'Download failed.' ), $download_file -> get_error_message ());
2008-02-11 06:45:54 +01:00
2008-05-29 19:29:32 +02:00
$working_dir = $content_dir . 'upgrade/' . basename ( $plugin , '.php' );
2008-02-11 06:45:54 +01:00
// Clean up working directory
2008-03-11 17:37:44 +01:00
if ( $wp_filesystem -> is_dir ( $working_dir ) )
2008-03-01 22:20:23 +01:00
$wp_filesystem -> delete ( $working_dir , true );
2008-02-11 06:45:54 +01:00
2008-03-11 17:37:44 +01:00
apply_filters ( 'update_feedback' , __ ( 'Unpacking the update' ));
2008-02-11 06:45:54 +01:00
// Unzip package to working directory
2008-05-29 19:29:32 +02:00
$result = unzip_file ( $download_file , $working_dir );
// Once extracted, delete the package
unlink ( $download_file );
2008-02-11 06:45:54 +01:00
if ( is_wp_error ( $result ) ) {
$wp_filesystem -> delete ( $working_dir , true );
return $result ;
}
2008-03-22 00:02:00 +01:00
if ( is_plugin_active ( $plugin ) ) {
2008-03-27 08:36:30 +01:00
//Deactivate the plugin silently, Prevent deactivation hooks from running.
2008-03-22 00:02:00 +01:00
apply_filters ( 'update_feedback' , __ ( 'Deactivating the plugin' ));
deactivate_plugins ( $plugin , true );
}
2008-02-11 06:45:54 +01:00
// Remove the existing plugin.
2008-03-11 17:37:44 +01:00
apply_filters ( 'update_feedback' , __ ( 'Removing the old version of the plugin' ));
2008-05-29 19:29:32 +02:00
$this_plugin_dir = trailingslashit ( dirname ( $plugins_dir . $plugin ) );
2008-03-11 17:37:44 +01:00
2008-02-11 06:45:54 +01:00
// If plugin is in its own directory, recursively delete the directory.
2008-05-29 19:29:32 +02:00
if ( strpos ( $plugin , '/' ) && $this_plugin_dir != $plugins_dir ) //base check on if plugin includes directory seperator AND that its not the root plugin folder
$deleted = $wp_filesystem -> delete ( $this_plugin_dir , true );
2008-03-01 22:20:23 +01:00
else
2008-05-29 19:29:32 +02:00
$deleted = $wp_filesystem -> delete ( $plugins_dir . $plugin );
2008-03-11 17:37:44 +01:00
2008-05-29 19:29:32 +02:00
if ( ! $deleted ) {
2008-03-01 22:20:23 +01:00
$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
2008-03-11 17:37:44 +01:00
apply_filters ( 'update_feedback' , __ ( 'Installing the latest version' ));
2008-02-11 06:45:54 +01:00
// Copy new version of plugin into place.
2008-05-29 19:29:32 +02:00
$result = copy_dir ( $working_dir , $plugins_dir );
if ( is_wp_error ( $result ) ) {
2008-03-11 17:37:44 +01:00
//$wp_filesystem->delete($working_dir, true); //TODO: Uncomment? This DOES mean that the new files are available in the upgrade folder if it fails.
2008-05-29 19:29:32 +02:00
return $result ;
2008-03-01 22:20:23 +01:00
}
2008-02-11 06:45:54 +01:00
2008-03-27 08:36:30 +01:00
//Get a list of the directories in the working directory before we delete it, We need to know the new folder for the plugin
$filelist = array_keys ( $wp_filesystem -> dirlist ( $working_dir ) );
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' );
2008-03-22 00:02:00 +01:00
2008-03-27 08:36:30 +01:00
if ( empty ( $filelist ) )
2008-05-29 19:29:32 +02:00
return false ; //We couldnt find any files in the working dir, therefor no plugin installed? Failsafe backup.
2008-03-27 08:36:30 +01:00
$folder = $filelist [ 0 ];
2008-05-29 19:29:32 +02:00
$plugin = get_plugins ( '/' . $folder ); //Ensure to pass with leading slash
2008-03-27 08:36:30 +01:00
$pluginfiles = array_keys ( $plugin ); //Assume the requested plugin is the first in the list
2008-05-29 19:29:32 +02:00
return $folder . '/' . $pluginfiles [ 0 ];
2008-02-11 06:45:54 +01:00
}
2008-03-21 00:54:17 +01:00
?>