2009-04-19 15:36:28 -04:00
< ? php
/**
2009-04-26 14:17:19 -04:00
* A File upgrader class for WordPress .
2009-04-19 15:36:28 -04:00
*
2009-04-26 14:17:19 -04:00
* This set of classes are designed to be used to upgrade / install a local set of files on the filesystem via the Filesystem Abstraction classes .
2009-04-19 15:36:28 -04:00
*
2009-04-26 14:17:19 -04:00
* @ link http :// trac . wordpress . org / ticket / 7875 consolidate plugin / theme / core upgrade / install functions
*
* @ package WordPress
* @ subpackage Upgrader
* @ since 2.8 . 0
2009-04-19 15:36:28 -04:00
*/
2009-04-26 14:17:19 -04:00
/**
* WordPress Upgrader class for Upgrading / Installing a local set of files via the Filesystem Abstraction classes from a Zip file .
*
* @ TODO More Detailed docs , for methods as well .
*
* @ package WordPress
* @ subpackage Upgrader
* @ since 2.8 . 0
*/
2009-04-19 15:36:28 -04:00
class WP_Upgrader {
var $strings = array ();
var $skin = null ;
var $result = array ();
2009-04-20 14:18:39 -04:00
2009-04-21 04:10:41 -04:00
function __construct ( $skin = null ) {
2009-04-19 15:36:28 -04:00
if ( null == $skin )
$this -> skin = new WP_Upgrader_Skin ();
else
$this -> skin = $skin ;
2009-04-26 14:17:19 -04:00
}
2009-05-24 19:47:49 -04:00
2009-04-26 14:17:19 -04:00
function init () {
2009-04-19 15:36:28 -04:00
$this -> skin -> set_upgrader ( $this );
2009-04-26 14:17:19 -04:00
$this -> generic_strings ();
2009-04-19 15:36:28 -04:00
}
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
function generic_strings () {
$this -> strings [ 'bad_request' ] = __ ( 'Invalid Data provided.' );
$this -> strings [ 'fs_unavailable' ] = __ ( 'Could not access filesystem.' );
2010-01-21 16:37:43 -05:00
$this -> strings [ 'fs_error' ] = __ ( 'Filesystem error.' );
2009-04-19 15:36:28 -04:00
$this -> strings [ 'fs_no_root_dir' ] = __ ( 'Unable to locate WordPress Root directory.' );
$this -> strings [ 'fs_no_content_dir' ] = __ ( 'Unable to locate WordPress Content directory (wp-content).' );
$this -> strings [ 'fs_no_plugins_dir' ] = __ ( 'Unable to locate WordPress Plugin directory.' );
$this -> strings [ 'fs_no_themes_dir' ] = __ ( 'Unable to locate WordPress Theme directory.' );
2010-04-21 06:58:06 -04:00
/* translators: %s: directory name */
2009-04-19 15:36:28 -04:00
$this -> strings [ 'fs_no_folder' ] = __ ( 'Unable to locate needed folder (%s).' );
$this -> strings [ 'download_failed' ] = __ ( 'Download failed.' );
2009-12-24 04:46:57 -05:00
$this -> strings [ 'installing_package' ] = __ ( 'Installing the latest version…' );
2013-05-22 12:57:20 -04:00
$this -> strings [ 'no_files' ] = __ ( 'The package contains no files.' );
2009-04-19 15:36:28 -04:00
$this -> strings [ 'folder_exists' ] = __ ( 'Destination folder already exists.' );
$this -> strings [ 'mkdir_failed' ] = __ ( 'Could not create directory.' );
2011-11-10 14:41:44 -05:00
$this -> strings [ 'incompatible_archive' ] = __ ( 'The package could not be installed.' );
2009-04-20 14:18:39 -04:00
2009-12-24 04:46:57 -05:00
$this -> strings [ 'maintenance_start' ] = __ ( 'Enabling Maintenance mode…' );
$this -> strings [ 'maintenance_end' ] = __ ( 'Disabling Maintenance mode…' );
2009-04-19 15:36:28 -04:00
}
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
function fs_connect ( $directories = array () ) {
global $wp_filesystem ;
2009-04-20 14:18:39 -04:00
2009-04-20 14:15:08 -04:00
if ( false === ( $credentials = $this -> skin -> request_filesystem_credentials ()) )
2009-04-19 15:36:28 -04:00
return false ;
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
if ( ! WP_Filesystem ( $credentials ) ) {
$error = true ;
if ( is_object ( $wp_filesystem ) && $wp_filesystem -> errors -> get_error_code () )
$error = $wp_filesystem -> errors ;
$this -> skin -> request_filesystem_credentials ( $error ); //Failed to connect, Error and request again
return false ;
}
if ( ! is_object ( $wp_filesystem ) )
return new WP_Error ( 'fs_unavailable' , $this -> strings [ 'fs_unavailable' ] );
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
if ( is_wp_error ( $wp_filesystem -> errors ) && $wp_filesystem -> errors -> get_error_code () )
return new WP_Error ( 'fs_error' , $this -> strings [ 'fs_error' ], $wp_filesystem -> errors );
foreach ( ( array ) $directories as $dir ) {
2009-08-20 21:36:01 -04:00
switch ( $dir ) {
case ABSPATH :
if ( ! $wp_filesystem -> abspath () )
return new WP_Error ( 'fs_no_root_dir' , $this -> strings [ 'fs_no_root_dir' ]);
break ;
case WP_CONTENT_DIR :
if ( ! $wp_filesystem -> wp_content_dir () )
return new WP_Error ( 'fs_no_content_dir' , $this -> strings [ 'fs_no_content_dir' ]);
break ;
case WP_PLUGIN_DIR :
if ( ! $wp_filesystem -> wp_plugins_dir () )
return new WP_Error ( 'fs_no_plugins_dir' , $this -> strings [ 'fs_no_plugins_dir' ]);
break ;
case WP_CONTENT_DIR . '/themes' :
if ( ! $wp_filesystem -> find_folder ( WP_CONTENT_DIR . '/themes' ) )
return new WP_Error ( 'fs_no_themes_dir' , $this -> strings [ 'fs_no_themes_dir' ]);
break ;
default :
if ( ! $wp_filesystem -> find_folder ( $dir ) )
return new WP_Error ( 'fs_no_folder' , sprintf ( $this -> strings [ 'fs_no_folder' ], $dir ));
break ;
}
2009-04-19 15:36:28 -04:00
}
return true ;
} //end fs_connect();
function download_package ( $package ) {
if ( ! preg_match ( '!^(http|https|ftp)://!i' , $package ) && file_exists ( $package ) ) //Local file or remote?
return $package ; //must be a local file..
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
if ( empty ( $package ) )
return new WP_Error ( 'no_package' , $this -> strings [ 'no_package' ]);
$this -> skin -> feedback ( 'downloading_package' , $package );
$download_file = download_url ( $package );
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
if ( is_wp_error ( $download_file ) )
return new WP_Error ( 'download_failed' , $this -> strings [ 'download_failed' ], $download_file -> get_error_message ());
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
return $download_file ;
}
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
function unpack_package ( $package , $delete_package = true ) {
global $wp_filesystem ;
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
$this -> skin -> feedback ( 'unpack_package' );
$upgrade_folder = $wp_filesystem -> wp_content_dir () . 'upgrade/' ;
//Clean up contents of upgrade directory beforehand.
$upgrade_files = $wp_filesystem -> dirlist ( $upgrade_folder );
if ( ! empty ( $upgrade_files ) ) {
foreach ( $upgrade_files as $file )
$wp_filesystem -> delete ( $upgrade_folder . $file [ 'name' ], true );
}
//We need a working directory
$working_dir = $upgrade_folder . basename ( $package , '.zip' );
// Clean up working directory
if ( $wp_filesystem -> is_dir ( $working_dir ) )
$wp_filesystem -> delete ( $working_dir , true );
// Unzip package to working directory
$result = unzip_file ( $package , $working_dir ); //TODO optimizations, Copy when Move/Rename would suffice?
// Once extracted, delete the package if required.
if ( $delete_package )
unlink ( $package );
if ( is_wp_error ( $result ) ) {
$wp_filesystem -> delete ( $working_dir , true );
2011-08-28 11:02:48 -04:00
if ( 'incompatible_archive' == $result -> get_error_code () ) {
return new WP_Error ( 'incompatible_archive' , $this -> strings [ 'incompatible_archive' ], $result -> get_error_data () );
}
2009-04-19 15:36:28 -04:00
return $result ;
}
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
return $working_dir ;
}
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
function install_package ( $args = array ()) {
global $wp_filesystem ;
$defaults = array ( 'source' => '' , 'destination' => '' , //Please always pass these
'clear_destination' => false , 'clear_working' => false ,
2013-04-04 17:10:54 -04:00
'abort_if_destination_exists' => true ,
2009-04-19 15:36:28 -04:00
'hook_extra' => array ());
$args = wp_parse_args ( $args , $defaults );
extract ( $args );
@ set_time_limit ( 300 );
if ( empty ( $source ) || empty ( $destination ) )
return new WP_Error ( 'bad_request' , $this -> strings [ 'bad_request' ]);
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
$this -> skin -> feedback ( 'installing_package' );
$res = apply_filters ( 'upgrader_pre_install' , true , $hook_extra );
if ( is_wp_error ( $res ) )
return $res ;
//Retain the Original source and destinations
$remote_source = $source ;
$local_destination = $destination ;
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
$source_files = array_keys ( $wp_filesystem -> dirlist ( $remote_source ) );
$remote_destination = $wp_filesystem -> find_folder ( $local_destination );
//Locate which directory to copy to the new folder, This is based on the actual folder holding the files.
if ( 1 == count ( $source_files ) && $wp_filesystem -> is_dir ( trailingslashit ( $source ) . $source_files [ 0 ] . '/' ) ) //Only one folder? Then we want its contents.
$source = trailingslashit ( $source ) . trailingslashit ( $source_files [ 0 ]);
elseif ( count ( $source_files ) == 0 )
2013-05-22 12:57:20 -04:00
return new WP_Error ( 'incompatible_archive' , $this -> strings [ 'incompatible_archive' ], $this -> strings [ 'no_files' ] ); //There are no files?
2012-12-20 10:55:32 -05:00
else //It's only a single file, the upgrader will use the foldername of this file as the destination folder. foldername is based on zip filename.
2011-11-02 08:16:47 -04:00
$source = trailingslashit ( $source );
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
//Hook ability to change the source file location..
$source = apply_filters ( 'upgrader_source_selection' , $source , $remote_source , $this );
if ( is_wp_error ( $source ) )
return $source ;
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
//Has the source location changed? If so, we need a new source_files list.
if ( $source !== $remote_source )
$source_files = array_keys ( $wp_filesystem -> dirlist ( $source ) );
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
//Protection against deleting files in any important base directories.
if ( in_array ( $destination , array ( ABSPATH , WP_CONTENT_DIR , WP_PLUGIN_DIR , WP_CONTENT_DIR . '/themes' ) ) ) {
$remote_destination = trailingslashit ( $remote_destination ) . trailingslashit ( basename ( $source ));
$destination = trailingslashit ( $destination ) . trailingslashit ( basename ( $source ));
}
2011-04-03 07:54:07 -04:00
if ( $clear_destination ) {
2011-09-03 10:18:10 -04:00
//We're going to clear the destination if there's something there
2011-04-03 07:54:07 -04:00
$this -> skin -> feedback ( 'remove_old' );
$removed = true ;
if ( $wp_filesystem -> exists ( $remote_destination ) )
2009-04-19 15:36:28 -04:00
$removed = $wp_filesystem -> delete ( $remote_destination , true );
2011-04-03 07:54:07 -04:00
$removed = apply_filters ( 'upgrader_clear_destination' , $removed , $local_destination , $remote_destination , $hook_extra );
if ( is_wp_error ( $removed ) )
return $removed ;
else if ( ! $removed )
return new WP_Error ( 'remove_old_failed' , $this -> strings [ 'remove_old_failed' ]);
2013-04-04 17:10:54 -04:00
} elseif ( $abort_if_destination_exists && $wp_filesystem -> exists ( $remote_destination ) ) {
2011-09-03 10:18:10 -04:00
//If we're not clearing the destination folder and something exists there already, Bail.
2011-04-03 07:54:07 -04:00
//But first check to see if there are actually any files in the folder.
$_files = $wp_filesystem -> dirlist ( $remote_destination );
if ( ! empty ( $_files ) ) {
$wp_filesystem -> delete ( $remote_source , true ); //Clear out the source files.
return new WP_Error ( 'folder_exists' , $this -> strings [ 'folder_exists' ], $remote_destination );
2009-09-13 19:00:45 -04:00
}
2009-04-19 15:36:28 -04:00
}
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
//Create destination if needed
if ( ! $wp_filesystem -> exists ( $remote_destination ) )
if ( ! $wp_filesystem -> mkdir ( $remote_destination , FS_CHMOD_DIR ) )
return new WP_Error ( 'mkdir_failed' , $this -> strings [ 'mkdir_failed' ], $remote_destination );
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
// Copy new version of item into place.
$result = copy_dir ( $source , $remote_destination );
if ( is_wp_error ( $result ) ) {
if ( $clear_working )
$wp_filesystem -> delete ( $remote_source , true );
return $result ;
}
2009-04-20 14:18:39 -04:00
//Clear the Working folder?
2009-04-19 15:36:28 -04:00
if ( $clear_working )
$wp_filesystem -> delete ( $remote_source , true );
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
$destination_name = basename ( str_replace ( $local_destination , '' , $destination ) );
if ( '.' == $destination_name )
$destination_name = '' ;
$this -> result = compact ( 'local_source' , 'source' , 'source_name' , 'source_files' , 'destination' , 'destination_name' , 'local_destination' , 'remote_destination' , 'clear_destination' , 'delete_source_dir' );
$res = apply_filters ( 'upgrader_post_install' , true , $hook_extra , $this -> result );
if ( is_wp_error ( $res ) ) {
$this -> result = $res ;
return $res ;
}
//Bombard the calling function will all the info which we've just used.
return $this -> result ;
}
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
function run ( $options ) {
$defaults = array ( 'package' => '' , //Please always pass this.
'destination' => '' , //And this
'clear_destination' => false ,
2013-04-04 17:10:54 -04:00
'abort_if_destination_exists' => true , // Abort if the Destination directory exists, Pass clear_destination as false please
2009-04-19 15:36:28 -04:00
'clear_working' => true ,
2009-10-26 03:04:30 -04:00
'is_multi' => false ,
2009-04-19 15:36:28 -04:00
'hook_extra' => array () //Pass any extra $hook_extra args here, this will be passed to any hooked filters.
);
$options = wp_parse_args ( $options , $defaults );
extract ( $options );
//Connect to the Filesystem first.
$res = $this -> fs_connect ( array ( WP_CONTENT_DIR , $destination ) );
if ( ! $res ) //Mainly for non-connected filesystem.
return false ;
if ( is_wp_error ( $res ) ) {
$this -> skin -> error ( $res );
return $res ;
}
2009-04-20 14:15:08 -04:00
2009-10-26 03:04:30 -04:00
if ( ! $is_multi ) // call $this->header separately if running multiple times
$this -> skin -> header ();
2009-04-20 14:15:08 -04:00
$this -> skin -> before ();
2009-04-19 15:36:28 -04:00
//Download the package (Note, This just returns the filename of the file if the package is a local file)
$download = $this -> download_package ( $package );
if ( is_wp_error ( $download ) ) {
$this -> skin -> error ( $download );
2010-03-06 03:39:50 -05:00
$this -> skin -> after ();
2009-04-19 15:36:28 -04:00
return $download ;
}
2009-04-20 14:18:39 -04:00
2011-04-19 01:54:01 -04:00
$delete_package = ( $download != $package ); // Do not delete a "local" file
2011-09-03 10:18:10 -04:00
//Unzips the file into a temporary directory
2011-04-19 01:54:01 -04:00
$working_dir = $this -> unpack_package ( $download , $delete_package );
2009-04-19 15:36:28 -04:00
if ( is_wp_error ( $working_dir ) ) {
$this -> skin -> error ( $working_dir );
2010-03-06 03:39:50 -05:00
$this -> skin -> after ();
2009-04-19 15:36:28 -04:00
return $working_dir ;
}
//With the given options, this installs it to the destination directory.
2009-04-20 14:18:39 -04:00
$result = $this -> install_package ( array (
2009-04-19 15:36:28 -04:00
'source' => $working_dir ,
'destination' => $destination ,
'clear_destination' => $clear_destination ,
2013-04-04 17:10:54 -04:00
'abort_if_destination_exists' => $abort_if_destination_exists ,
2009-04-19 15:36:28 -04:00
'clear_working' => $clear_working ,
'hook_extra' => $hook_extra
) );
$this -> skin -> set_result ( $result );
if ( is_wp_error ( $result ) ) {
$this -> skin -> error ( $result );
$this -> skin -> feedback ( 'process_failed' );
} else {
2011-09-03 10:18:10 -04:00
//Install Succeeded
2009-04-19 15:36:28 -04:00
$this -> skin -> feedback ( 'process_success' );
}
$this -> skin -> after ();
2009-10-26 03:04:30 -04:00
if ( ! $is_multi )
$this -> skin -> footer ();
2009-04-19 15:36:28 -04:00
return $result ;
}
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
function maintenance_mode ( $enable = false ) {
global $wp_filesystem ;
$file = $wp_filesystem -> abspath () . '.maintenance' ;
if ( $enable ) {
$this -> skin -> feedback ( 'maintenance_start' );
// Create maintenance file to signal that we are upgrading
$maintenance_string = '<?php $upgrading = ' . time () . '; ?>' ;
$wp_filesystem -> delete ( $file );
$wp_filesystem -> put_contents ( $file , $maintenance_string , FS_CHMOD_FILE );
} else if ( ! $enable && $wp_filesystem -> exists ( $file ) ) {
$this -> skin -> feedback ( 'maintenance_end' );
$wp_filesystem -> delete ( $file );
}
}
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
}
2009-04-26 14:17:19 -04:00
/**
* Plugin Upgrader class for WordPress Plugins , It is designed to upgrade / install plugins from a local zip , remote zip URL , or uploaded zip file .
*
* @ TODO More Detailed docs , for methods as well .
*
* @ package WordPress
* @ subpackage Upgrader
* @ since 2.8 . 0
*/
2009-04-19 15:36:28 -04:00
class Plugin_Upgrader extends WP_Upgrader {
var $result ;
2009-11-13 16:28:40 -05:00
var $bulk = false ;
2009-10-26 03:04:30 -04:00
var $show_before = '' ;
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
function upgrade_strings () {
$this -> strings [ 'up_to_date' ] = __ ( 'The plugin is at the latest version.' );
2010-12-02 16:45:47 -05:00
$this -> strings [ 'no_package' ] = __ ( 'Update package not available.' );
2009-12-24 04:46:57 -05:00
$this -> strings [ 'downloading_package' ] = __ ( 'Downloading update from <span class="code">%s</span>…' );
$this -> strings [ 'unpack_package' ] = __ ( 'Unpacking the update…' );
$this -> strings [ 'remove_old' ] = __ ( 'Removing the old version of the plugin…' );
2009-04-19 15:36:28 -04:00
$this -> strings [ 'remove_old_failed' ] = __ ( 'Could not remove the old plugin.' );
2010-12-02 16:45:47 -05:00
$this -> strings [ 'process_failed' ] = __ ( 'Plugin update failed.' );
$this -> strings [ 'process_success' ] = __ ( 'Plugin updated successfully.' );
2009-04-19 15:36:28 -04:00
}
function install_strings () {
$this -> strings [ 'no_package' ] = __ ( 'Install package not available.' );
2009-12-24 04:46:57 -05:00
$this -> strings [ 'downloading_package' ] = __ ( 'Downloading install package from <span class="code">%s</span>…' );
$this -> strings [ 'unpack_package' ] = __ ( 'Unpacking the package…' );
$this -> strings [ 'installing_package' ] = __ ( 'Installing the plugin…' );
2013-05-22 12:57:20 -04:00
$this -> strings [ 'no_files' ] = __ ( 'The plugin contains no files.' );
2009-12-24 04:46:57 -05:00
$this -> strings [ 'process_failed' ] = __ ( 'Plugin install failed.' );
$this -> strings [ 'process_success' ] = __ ( 'Plugin installed successfully.' );
2009-04-19 15:36:28 -04:00
}
function install ( $package ) {
2009-04-20 14:18:39 -04:00
2009-04-26 14:17:19 -04:00
$this -> init ();
2009-04-19 15:36:28 -04:00
$this -> install_strings ();
2011-08-28 11:02:48 -04:00
add_filter ( 'upgrader_source_selection' , array ( & $this , 'check_package' ) );
2009-04-19 15:36:28 -04:00
$this -> run ( array (
'package' => $package ,
'destination' => WP_PLUGIN_DIR ,
'clear_destination' => false , //Do not overwrite files.
'clear_working' => true ,
'hook_extra' => array ()
));
2009-04-20 14:18:39 -04:00
2011-08-28 11:02:48 -04:00
remove_filter ( 'upgrader_source_selection' , array ( & $this , 'check_package' ) );
2011-08-28 01:51:38 -04:00
if ( ! $this -> result || is_wp_error ( $this -> result ) )
return $this -> result ;
2009-04-19 15:36:28 -04:00
// Force refresh of plugin update information
2010-01-08 15:49:55 -05:00
delete_site_transient ( 'update_plugins' );
2012-03-30 10:46:52 -04:00
wp_cache_delete ( 'plugins' , 'plugins' );
2013-04-04 17:10:54 -04:00
do_action ( 'upgrader_process_complete' , $this , array ( 'action' => 'install' , 'type' => 'plugin' ), $package );
2009-04-19 15:36:28 -04:00
2011-08-28 01:51:38 -04:00
return true ;
2009-04-19 15:36:28 -04:00
}
function upgrade ( $plugin ) {
2009-04-20 14:18:39 -04:00
2009-04-26 14:17:19 -04:00
$this -> init ();
2009-04-19 15:36:28 -04:00
$this -> upgrade_strings ();
2009-04-20 14:18:39 -04:00
2010-01-08 15:49:55 -05:00
$current = get_site_transient ( 'update_plugins' );
2009-04-19 15:36:28 -04:00
if ( ! isset ( $current -> response [ $plugin ] ) ) {
2010-03-06 03:39:50 -05:00
$this -> skin -> before ();
2009-06-06 04:14:41 -04:00
$this -> skin -> set_result ( false );
2009-04-19 15:36:28 -04:00
$this -> skin -> error ( 'up_to_date' );
2009-06-06 04:14:41 -04:00
$this -> skin -> after ();
2009-04-19 15:36:28 -04:00
return false ;
}
// Get the URL to the zip file
$r = $current -> response [ $plugin ];
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
add_filter ( 'upgrader_pre_install' , array ( & $this , 'deactivate_plugin_before_upgrade' ), 10 , 2 );
add_filter ( 'upgrader_clear_destination' , array ( & $this , 'delete_old_plugin' ), 10 , 4 );
2011-09-03 10:18:10 -04:00
//'source_selection' => array(&$this, 'source_selection'), //there's a trac ticket to move up the directory for zip's which are made a bit differently, useful for non-.org plugins.
2009-04-19 15:36:28 -04:00
$this -> run ( array (
'package' => $r -> package ,
'destination' => WP_PLUGIN_DIR ,
'clear_destination' => true ,
'clear_working' => true ,
'hook_extra' => array (
'plugin' => $plugin
)
));
2011-09-03 10:18:10 -04:00
// Cleanup our hooks, in case something else does a upgrade on this connection.
2009-04-19 15:36:28 -04:00
remove_filter ( 'upgrader_pre_install' , array ( & $this , 'deactivate_plugin_before_upgrade' ));
remove_filter ( 'upgrader_clear_destination' , array ( & $this , 'delete_old_plugin' ));
if ( ! $this -> result || is_wp_error ( $this -> result ) )
return $this -> result ;
// Force refresh of plugin update information
2010-01-08 15:49:55 -05:00
delete_site_transient ( 'update_plugins' );
2012-03-30 10:46:52 -04:00
wp_cache_delete ( 'plugins' , 'plugins' );
2013-04-04 17:10:54 -04:00
do_action ( 'upgrader_process_complete' , $this , array ( 'action' => 'update' , 'type' => 'plugin' ), $plugin );
2009-04-19 15:36:28 -04:00
}
2009-04-20 14:18:39 -04:00
2009-10-23 17:49:12 -04:00
function bulk_upgrade ( $plugins ) {
$this -> init ();
$this -> bulk = true ;
$this -> upgrade_strings ();
2010-01-08 15:49:55 -05:00
$current = get_site_transient ( 'update_plugins' );
2009-10-23 17:49:12 -04:00
add_filter ( 'upgrader_clear_destination' , array ( & $this , 'delete_old_plugin' ), 10 , 4 );
2009-10-26 03:04:30 -04:00
$this -> skin -> header ();
2009-11-09 13:53:21 -05:00
// Connect to the Filesystem first.
$res = $this -> fs_connect ( array ( WP_CONTENT_DIR , WP_PLUGIN_DIR ) );
if ( ! $res ) {
$this -> skin -> footer ();
return false ;
}
2010-05-25 09:57:06 -04:00
$this -> skin -> bulk_header ();
2010-07-23 23:59:53 -04:00
// Only start maintenance mode if running in Multisite OR the plugin is in use
$maintenance = is_multisite (); // @TODO: This should only kick in for individual sites if at all possible.
foreach ( $plugins as $plugin )
$maintenance = $maintenance || ( is_plugin_active ( $plugin ) && isset ( $current -> response [ $plugin ]) ); // Only activate Maintenance mode if a plugin is active AND has an update available
if ( $maintenance )
$this -> maintenance_mode ( true );
2009-11-09 13:53:21 -05:00
2010-02-13 01:08:15 -05:00
$results = array ();
2010-03-12 22:59:40 -05:00
$this -> update_count = count ( $plugins );
$this -> update_current = 0 ;
2009-10-23 17:49:12 -04:00
foreach ( $plugins as $plugin ) {
2010-03-12 22:59:40 -05:00
$this -> update_current ++ ;
2010-03-06 03:39:50 -05:00
$this -> skin -> plugin_info = get_plugin_data ( WP_PLUGIN_DIR . '/' . $plugin , false , true );
2009-10-26 03:04:30 -04:00
2009-10-23 17:49:12 -04:00
if ( ! isset ( $current -> response [ $plugin ] ) ) {
2012-07-08 23:40:32 -04:00
$this -> skin -> set_result ( true );
2010-03-06 03:39:50 -05:00
$this -> skin -> before ();
2012-07-08 23:40:32 -04:00
$this -> skin -> feedback ( 'up_to_date' );
2009-10-23 17:49:12 -04:00
$this -> skin -> after ();
2012-07-08 23:40:32 -04:00
$results [ $plugin ] = true ;
2009-10-23 17:49:12 -04:00
continue ;
}
// Get the URL to the zip file
$r = $current -> response [ $plugin ];
$this -> skin -> plugin_active = is_plugin_active ( $plugin );
$result = $this -> run ( array (
'package' => $r -> package ,
'destination' => WP_PLUGIN_DIR ,
'clear_destination' => true ,
'clear_working' => true ,
2009-10-26 03:04:30 -04:00
'is_multi' => true ,
2009-10-23 17:49:12 -04:00
'hook_extra' => array (
'plugin' => $plugin
)
));
2009-10-26 03:04:30 -04:00
2009-10-23 17:49:12 -04:00
$results [ $plugin ] = $this -> result ;
// Prevent credentials auth screen from displaying multiple times
if ( false === $result )
break ;
2010-03-06 03:39:50 -05:00
} //end foreach $plugins
2010-05-23 08:29:00 -04:00
2009-11-09 13:53:21 -05:00
$this -> maintenance_mode ( false );
2010-05-25 09:57:06 -04:00
$this -> skin -> bulk_footer ();
2010-05-23 08:29:00 -04:00
2009-10-26 03:04:30 -04:00
$this -> skin -> footer ();
2009-10-23 17:49:12 -04:00
2011-09-03 10:18:10 -04:00
// Cleanup our hooks, in case something else does a upgrade on this connection.
2009-10-23 17:49:12 -04:00
remove_filter ( 'upgrader_clear_destination' , array ( & $this , 'delete_old_plugin' ));
// Force refresh of plugin update information
2010-01-08 15:49:55 -05:00
delete_site_transient ( 'update_plugins' );
2012-03-30 10:46:52 -04:00
wp_cache_delete ( 'plugins' , 'plugins' );
2013-04-04 17:10:54 -04:00
do_action ( 'upgrader_process_complete' , $this , array ( 'action' => 'update' , 'type' => 'plugin' , 'bulk' => true ), $plugins );
2009-10-23 17:49:12 -04:00
return $results ;
}
2011-08-28 11:02:48 -04:00
function check_package ( $source ) {
global $wp_filesystem ;
if ( is_wp_error ( $source ) )
return $source ;
$working_directory = str_replace ( $wp_filesystem -> wp_content_dir (), trailingslashit ( WP_CONTENT_DIR ), $source );
if ( ! is_dir ( $working_directory ) ) // Sanity check, if the above fails, lets not prevent installation.
return $source ;
// Check the folder contains at least 1 valid plugin.
$plugins_found = false ;
foreach ( glob ( $working_directory . '*.php' ) as $file ) {
$info = get_plugin_data ( $file , false , false );
if ( ! empty ( $info [ 'Name' ] ) ) {
$plugins_found = true ;
break ;
}
}
if ( ! $plugins_found )
2011-11-10 14:41:44 -05:00
return new WP_Error ( 'incompatible_archive' , $this -> strings [ 'incompatible_archive' ], __ ( 'No valid plugins were found.' ) );
2011-08-28 11:02:48 -04:00
return $source ;
}
2009-04-19 15:36:28 -04:00
//return plugin info.
function plugin_info () {
if ( ! is_array ( $this -> result ) )
return false ;
if ( empty ( $this -> result [ 'destination_name' ]) )
2009-04-20 14:18:39 -04:00
return false ;
2009-04-19 15:36:28 -04:00
$plugin = get_plugins ( '/' . $this -> result [ 'destination_name' ]); //Ensure to pass with leading slash
if ( empty ( $plugin ) )
return false ;
$pluginfiles = array_keys ( $plugin ); //Assume the requested plugin is the first in the list
2009-04-20 14:18:39 -04:00
return $this -> result [ 'destination_name' ] . '/' . $pluginfiles [ 0 ];
2009-04-19 15:36:28 -04:00
}
//Hooked to pre_install
function deactivate_plugin_before_upgrade ( $return , $plugin ) {
if ( is_wp_error ( $return ) ) //Bypass.
return $return ;
$plugin = isset ( $plugin [ 'plugin' ]) ? $plugin [ 'plugin' ] : '' ;
if ( empty ( $plugin ) )
return new WP_Error ( 'bad_request' , $this -> strings [ 'bad_request' ]);
if ( is_plugin_active ( $plugin ) ) {
//Deactivate the plugin silently, Prevent deactivation hooks from running.
deactivate_plugins ( $plugin , true );
2009-04-20 14:18:39 -04:00
}
2009-04-19 15:36:28 -04:00
}
//Hooked to upgrade_clear_destination
function delete_old_plugin ( $removed , $local_destination , $remote_destination , $plugin ) {
global $wp_filesystem ;
2011-04-03 07:55:27 -04:00
2009-04-19 15:36:28 -04:00
if ( is_wp_error ( $removed ) )
return $removed ; //Pass errors through.
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
$plugin = isset ( $plugin [ 'plugin' ]) ? $plugin [ 'plugin' ] : '' ;
if ( empty ( $plugin ) )
return new WP_Error ( 'bad_request' , $this -> strings [ 'bad_request' ]);
$plugins_dir = $wp_filesystem -> wp_plugins_dir ();
$this_plugin_dir = trailingslashit ( dirname ( $plugins_dir . $plugin ) );
2011-04-03 07:55:27 -04:00
2012-12-20 10:55:32 -05:00
if ( ! $wp_filesystem -> exists ( $this_plugin_dir ) ) //If it's already vanished.
2009-04-19 15:36:28 -04:00
return $removed ;
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
// If plugin is in its own directory, recursively delete the directory.
2012-12-20 10:55:32 -05:00
if ( strpos ( $plugin , '/' ) && $this_plugin_dir != $plugins_dir ) //base check on if plugin includes directory separator AND that it's not the root plugin folder
2009-04-19 15:36:28 -04:00
$deleted = $wp_filesystem -> delete ( $this_plugin_dir , true );
else
$deleted = $wp_filesystem -> delete ( $plugins_dir . $plugin );
2011-04-03 07:55:27 -04:00
2009-04-19 15:36:28 -04:00
if ( ! $deleted )
return new WP_Error ( 'remove_old_failed' , $this -> strings [ 'remove_old_failed' ]);
2009-04-20 14:18:39 -04:00
2011-04-03 07:54:07 -04:00
return true ;
2009-04-19 15:36:28 -04:00
}
}
2009-04-26 14:17:19 -04:00
/**
* Theme Upgrader class for WordPress Themes , It is designed to upgrade / install themes from a local zip , remote zip URL , or uploaded zip file .
*
* @ TODO More Detailed docs , for methods as well .
*
* @ package WordPress
* @ subpackage Upgrader
* @ since 2.8 . 0
*/
2009-04-19 15:36:28 -04:00
class Theme_Upgrader extends WP_Upgrader {
var $result ;
2011-08-10 15:26:36 -04:00
var $bulk = false ;
2009-04-19 15:36:28 -04:00
function upgrade_strings () {
$this -> strings [ 'up_to_date' ] = __ ( 'The theme is at the latest version.' );
2010-12-02 16:45:47 -05:00
$this -> strings [ 'no_package' ] = __ ( 'Update package not available.' );
2009-12-24 04:46:57 -05:00
$this -> strings [ 'downloading_package' ] = __ ( 'Downloading update from <span class="code">%s</span>…' );
$this -> strings [ 'unpack_package' ] = __ ( 'Unpacking the update…' );
$this -> strings [ 'remove_old' ] = __ ( 'Removing the old version of the theme…' );
2009-04-19 15:36:28 -04:00
$this -> strings [ 'remove_old_failed' ] = __ ( 'Could not remove the old theme.' );
2010-12-02 16:45:47 -05:00
$this -> strings [ 'process_failed' ] = __ ( 'Theme update failed.' );
$this -> strings [ 'process_success' ] = __ ( 'Theme updated successfully.' );
2009-04-19 15:36:28 -04:00
}
function install_strings () {
$this -> strings [ 'no_package' ] = __ ( 'Install package not available.' );
2009-12-24 04:46:57 -05:00
$this -> strings [ 'downloading_package' ] = __ ( 'Downloading install package from <span class="code">%s</span>…' );
$this -> strings [ 'unpack_package' ] = __ ( 'Unpacking the package…' );
$this -> strings [ 'installing_package' ] = __ ( 'Installing the theme…' );
2013-05-22 12:57:20 -04:00
$this -> strings [ 'no_files' ] = __ ( 'The theme contains no files.' );
2009-12-24 04:46:57 -05:00
$this -> strings [ 'process_failed' ] = __ ( 'Theme install failed.' );
$this -> strings [ 'process_success' ] = __ ( 'Theme installed successfully.' );
2012-03-23 06:10:06 -04:00
/* translators: 1: theme name, 2: version */
$this -> strings [ 'process_success_specific' ] = __ ( 'Successfully installed the theme <strong>%1$s %2$s</strong>.' );
$this -> strings [ 'parent_theme_search' ] = __ ( 'This theme requires a parent theme. Checking if it is installed…' );
/* translators: 1: theme name, 2: version */
$this -> strings [ 'parent_theme_prepare_install' ] = __ ( 'Preparing to install <strong>%1$s %2$s</strong>…' );
/* translators: 1: theme name, 2: version */
$this -> strings [ 'parent_theme_currently_installed' ] = __ ( 'The parent theme, <strong>%1$s %2$s</strong>, is currently installed.' );
/* translators: 1: theme name, 2: version */
$this -> strings [ 'parent_theme_install_success' ] = __ ( 'Successfully installed the parent theme, <strong>%1$s %2$s</strong>.' );
$this -> strings [ 'parent_theme_not_found' ] = __ ( '<strong>The parent theme could not be found.</strong> You will need to install the parent theme, <strong>%s</strong>, before you can use this child theme.' );
}
function check_parent_theme_filter ( $install_result , $hook_extra , $child_result ) {
// Check to see if we need to install a parent theme
$theme_info = $this -> theme_info ();
2012-03-23 06:20:26 -04:00
if ( ! $theme_info -> parent () )
2012-03-23 06:10:06 -04:00
return $install_result ;
2012-03-23 06:20:26 -04:00
$this -> skin -> feedback ( 'parent_theme_search' );
2012-03-23 06:10:06 -04:00
2012-03-23 06:20:26 -04:00
if ( ! $theme_info -> parent () -> errors () ) {
$this -> skin -> feedback ( 'parent_theme_currently_installed' , $theme_info -> parent () -> display ( 'Name' ), $theme_info -> parent () -> display ( 'Version' ) );
2012-03-23 06:10:06 -04:00
// We already have the theme, fall through.
return $install_result ;
}
// We don't have the parent theme, lets install it
2012-03-23 06:20:26 -04:00
$api = themes_api ( 'theme_information' , array ( 'slug' => $theme_info -> get ( 'Template' ), 'fields' => array ( 'sections' => false , 'tags' => false ) ) ); //Save on a bit of bandwidth.
2012-03-23 06:10:06 -04:00
if ( ! $api || is_wp_error ( $api ) ) {
2012-03-23 06:20:26 -04:00
$this -> skin -> feedback ( 'parent_theme_not_found' , $theme_info -> get ( 'Template' ) );
2012-03-23 06:10:06 -04:00
// Don't show activate or preview actions after install
add_filter ( 'install_theme_complete_actions' , array ( & $this , 'hide_activate_preview_actions' ) );
return $install_result ;
}
// Backup required data we're going to override:
$child_api = $this -> skin -> api ;
$child_success_message = $this -> strings [ 'process_success' ];
// Override them
$this -> skin -> api = $api ;
$this -> strings [ 'process_success_specific' ] = $this -> strings [ 'parent_theme_install_success' ]; //, $api->name, $api->version);
$this -> skin -> feedback ( 'parent_theme_prepare_install' , $api -> name , $api -> version );
2012-04-09 22:25:03 -04:00
2012-03-23 06:10:06 -04:00
add_filter ( 'install_theme_complete_actions' , '__return_false' , 999 ); // Don't show any actions after installing the theme.
// Install the parent theme
$parent_result = $this -> run ( array (
'package' => $api -> download_link ,
'destination' => WP_CONTENT_DIR . '/themes' ,
'clear_destination' => false , //Do not overwrite files.
'clear_working' => true
) );
if ( is_wp_error ( $parent_result ) )
add_filter ( 'install_theme_complete_actions' , array ( & $this , 'hide_activate_preview_actions' ) );
// Start cleaning up after the parents installation
remove_filter ( 'install_theme_complete_actions' , '__return_false' , 999 );
// Reset child's result and data
$this -> result = $child_result ;
$this -> skin -> api = $child_api ;
$this -> strings [ 'process_success' ] = $child_success_message ;
return $install_result ;
}
2012-04-09 22:25:03 -04:00
2012-03-23 06:10:06 -04:00
function hide_activate_preview_actions ( $actions ) {
unset ( $actions [ 'activate' ], $actions [ 'preview' ]);
return $actions ;
2009-04-19 15:36:28 -04:00
}
function install ( $package ) {
2009-05-24 19:47:49 -04:00
2009-04-26 14:17:19 -04:00
$this -> init ();
2009-04-19 15:36:28 -04:00
$this -> install_strings ();
2011-08-28 11:02:48 -04:00
add_filter ( 'upgrader_source_selection' , array ( & $this , 'check_package' ) );
2012-03-23 06:10:06 -04:00
add_filter ( 'upgrader_post_install' , array ( & $this , 'check_parent_theme_filter' ), 10 , 3 );
2011-08-28 11:02:48 -04:00
2009-04-19 15:36:28 -04:00
$options = array (
'package' => $package ,
'destination' => WP_CONTENT_DIR . '/themes' ,
'clear_destination' => false , //Do not overwrite files.
'clear_working' => true
);
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
$this -> run ( $options );
2009-04-20 14:18:39 -04:00
2011-08-28 11:02:48 -04:00
remove_filter ( 'upgrader_source_selection' , array ( & $this , 'check_package' ) );
2013-05-07 11:55:31 -04:00
remove_filter ( 'upgrader_post_install' , array ( & $this , 'check_parent_theme_filter' ));
2011-08-28 11:02:48 -04:00
2009-04-19 15:36:28 -04:00
if ( ! $this -> result || is_wp_error ( $this -> result ) )
return $this -> result ;
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
// Force refresh of theme update information
2012-06-14 10:24:25 -04:00
wp_clean_themes_cache ();
2013-04-04 17:10:54 -04:00
do_action ( 'upgrader_process_complete' , $this , array ( 'action' => 'install' , 'type' => 'theme' ), $package );
2009-04-20 14:18:39 -04:00
2011-08-28 01:51:38 -04:00
return true ;
2009-04-19 15:36:28 -04:00
}
function upgrade ( $theme ) {
2009-04-20 14:18:39 -04:00
2009-04-26 14:17:19 -04:00
$this -> init ();
2009-04-19 15:36:28 -04:00
$this -> upgrade_strings ();
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
// Is an update available?
2010-01-08 15:49:55 -05:00
$current = get_site_transient ( 'update_themes' );
2009-06-06 04:14:41 -04:00
if ( ! isset ( $current -> response [ $theme ] ) ) {
2010-03-06 03:39:50 -05:00
$this -> skin -> before ();
2009-06-06 04:14:41 -04:00
$this -> skin -> set_result ( false );
$this -> skin -> error ( 'up_to_date' );
$this -> skin -> after ();
return false ;
}
2009-09-14 10:03:32 -04:00
2009-04-19 15:36:28 -04:00
$r = $current -> response [ $theme ];
add_filter ( 'upgrader_pre_install' , array ( & $this , 'current_before' ), 10 , 2 );
add_filter ( 'upgrader_post_install' , array ( & $this , 'current_after' ), 10 , 2 );
add_filter ( 'upgrader_clear_destination' , array ( & $this , 'delete_old_theme' ), 10 , 4 );
$options = array (
'package' => $r [ 'package' ],
'destination' => WP_CONTENT_DIR . '/themes' ,
'clear_destination' => true ,
'clear_working' => true ,
'hook_extra' => array (
'theme' => $theme
)
);
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
$this -> run ( $options );
2013-05-07 11:55:31 -04:00
remove_filter ( 'upgrader_pre_install' , array ( & $this , 'current_before' ));
remove_filter ( 'upgrader_post_install' , array ( & $this , 'current_after' ));
remove_filter ( 'upgrader_clear_destination' , array ( & $this , 'delete_old_theme' ));
2011-08-28 11:02:48 -04:00
2009-04-19 15:36:28 -04:00
if ( ! $this -> result || is_wp_error ( $this -> result ) )
return $this -> result ;
// Force refresh of theme update information
2012-06-14 10:24:25 -04:00
wp_clean_themes_cache ();
2013-04-04 17:10:54 -04:00
do_action ( 'upgrader_process_complete' , $this , array ( 'action' => 'update' , 'type' => 'theme' ), $theme );
2009-04-19 15:36:28 -04:00
return true ;
}
2009-04-20 14:18:39 -04:00
2010-03-12 22:59:40 -05:00
function bulk_upgrade ( $themes ) {
$this -> init ();
$this -> bulk = true ;
$this -> upgrade_strings ();
$current = get_site_transient ( 'update_themes' );
add_filter ( 'upgrader_pre_install' , array ( & $this , 'current_before' ), 10 , 2 );
add_filter ( 'upgrader_post_install' , array ( & $this , 'current_after' ), 10 , 2 );
add_filter ( 'upgrader_clear_destination' , array ( & $this , 'delete_old_theme' ), 10 , 4 );
$this -> skin -> header ();
// Connect to the Filesystem first.
$res = $this -> fs_connect ( array ( WP_CONTENT_DIR ) );
if ( ! $res ) {
$this -> skin -> footer ();
return false ;
}
2010-05-25 09:57:06 -04:00
$this -> skin -> bulk_header ();
2010-07-23 23:59:53 -04:00
// Only start maintenance mode if running in Multisite OR the theme is in use
$maintenance = is_multisite (); // @TODO: This should only kick in for individual sites if at all possible.
foreach ( $themes as $theme )
$maintenance = $maintenance || $theme == get_stylesheet () || $theme == get_template ();
if ( $maintenance )
$this -> maintenance_mode ( true );
2010-03-12 22:59:40 -05:00
$results = array ();
$this -> update_count = count ( $themes );
$this -> update_current = 0 ;
foreach ( $themes as $theme ) {
$this -> update_current ++ ;
2012-06-30 08:08:18 -04:00
$this -> skin -> theme_info = $this -> theme_info ( $theme );
2010-03-12 22:59:40 -05:00
if ( ! isset ( $current -> response [ $theme ] ) ) {
2012-07-08 23:40:32 -04:00
$this -> skin -> set_result ( true );
2010-03-12 22:59:40 -05:00
$this -> skin -> before ();
2012-07-08 23:40:32 -04:00
$this -> skin -> feedback ( 'up_to_date' );
2010-03-12 22:59:40 -05:00
$this -> skin -> after ();
2012-07-08 23:40:32 -04:00
$results [ $theme ] = true ;
2010-03-12 22:59:40 -05:00
continue ;
}
// Get the URL to the zip file
$r = $current -> response [ $theme ];
$options = array (
'package' => $r [ 'package' ],
'destination' => WP_CONTENT_DIR . '/themes' ,
'clear_destination' => true ,
'clear_working' => true ,
'hook_extra' => array (
'theme' => $theme
)
);
$result = $this -> run ( $options );
$results [ $theme ] = $this -> result ;
// Prevent credentials auth screen from displaying multiple times
if ( false === $result )
break ;
} //end foreach $plugins
2010-05-23 08:29:00 -04:00
2010-03-12 22:59:40 -05:00
$this -> maintenance_mode ( false );
2010-05-25 09:57:06 -04:00
$this -> skin -> bulk_footer ();
2010-03-12 22:59:40 -05:00
$this -> skin -> footer ();
2011-09-03 10:18:10 -04:00
// Cleanup our hooks, in case something else does a upgrade on this connection.
2013-05-07 11:55:31 -04:00
remove_filter ( 'upgrader_pre_install' , array ( & $this , 'current_before' ));
remove_filter ( 'upgrader_post_install' , array ( & $this , 'current_after' ));
remove_filter ( 'upgrader_clear_destination' , array ( & $this , 'delete_old_theme' ));
2010-03-12 22:59:40 -05:00
// Force refresh of theme update information
2012-06-14 10:24:25 -04:00
wp_clean_themes_cache ();
2013-04-04 17:10:54 -04:00
do_action ( 'upgrader_process_complete' , $this , array ( 'action' => 'update' , 'type' => 'theme' , 'bulk' => true ), $themes );
2010-03-12 22:59:40 -05:00
return $results ;
}
2011-08-28 11:02:48 -04:00
function check_package ( $source ) {
global $wp_filesystem ;
if ( is_wp_error ( $source ) )
return $source ;
// Check the folder contains a valid theme
$working_directory = str_replace ( $wp_filesystem -> wp_content_dir (), trailingslashit ( WP_CONTENT_DIR ), $source );
if ( ! is_dir ( $working_directory ) ) // Sanity check, if the above fails, lets not prevent installation.
return $source ;
2012-03-23 06:20:26 -04:00
// A proper archive should have a style.css file in the single subdirectory
if ( ! file_exists ( $working_directory . 'style.css' ) )
2011-11-10 14:41:44 -05:00
return new WP_Error ( 'incompatible_archive' , $this -> strings [ 'incompatible_archive' ], __ ( 'The theme is missing the <code>style.css</code> stylesheet.' ) );
2011-08-28 11:02:48 -04:00
2012-03-23 06:20:26 -04:00
$info = get_file_data ( $working_directory . 'style.css' , array ( 'Name' => 'Theme Name' , 'Template' => 'Template' ) );
if ( empty ( $info [ 'Name' ] ) )
2011-11-10 14:41:44 -05:00
return new WP_Error ( 'incompatible_archive' , $this -> strings [ 'incompatible_archive' ], __ ( " The <code>style.css</code> stylesheet doesn't contain a valid theme header. " ) );
2011-08-28 11:02:48 -04:00
2012-03-23 06:20:26 -04:00
// If it's not a child theme, it must have at least an index.php to be legit.
if ( empty ( $info [ 'Template' ] ) && ! file_exists ( $working_directory . 'index.php' ) )
2011-11-10 14:41:44 -05:00
return new WP_Error ( 'incompatible_archive' , $this -> strings [ 'incompatible_archive' ], __ ( 'The theme is missing the <code>index.php</code> file.' ) );
2011-08-28 11:02:48 -04:00
return $source ;
}
2009-04-19 15:36:28 -04:00
function current_before ( $return , $theme ) {
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
if ( is_wp_error ( $return ) )
return $return ;
$theme = isset ( $theme [ 'theme' ]) ? $theme [ 'theme' ] : '' ;
if ( $theme != get_stylesheet () ) //If not current
return $return ;
2010-07-23 23:59:53 -04:00
//Change to maintenance mode now.
2010-03-12 22:59:40 -05:00
if ( ! $this -> bulk )
$this -> maintenance_mode ( true );
2009-04-19 15:36:28 -04:00
return $return ;
}
2011-08-28 11:02:48 -04:00
2009-04-19 15:36:28 -04:00
function current_after ( $return , $theme ) {
if ( is_wp_error ( $return ) )
return $return ;
$theme = isset ( $theme [ 'theme' ]) ? $theme [ 'theme' ] : '' ;
2012-03-23 06:20:26 -04:00
if ( $theme != get_stylesheet () ) // If not current
2009-04-19 15:36:28 -04:00
return $return ;
2012-06-26 01:21:04 -04:00
// Ensure stylesheet name hasn't changed after the upgrade:
2009-04-19 15:36:28 -04:00
if ( $theme == get_stylesheet () && $theme != $this -> result [ 'destination_name' ] ) {
2012-06-26 01:21:04 -04:00
wp_clean_themes_cache ();
2009-04-19 15:36:28 -04:00
$stylesheet = $this -> result [ 'destination_name' ];
2012-06-26 01:21:04 -04:00
switch_theme ( $stylesheet );
2009-04-19 15:36:28 -04:00
}
2010-07-23 23:59:53 -04:00
//Time to remove maintenance mode
2010-03-12 22:59:40 -05:00
if ( ! $this -> bulk )
$this -> maintenance_mode ( false );
2009-04-19 15:36:28 -04:00
return $return ;
}
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
function delete_old_theme ( $removed , $local_destination , $remote_destination , $theme ) {
global $wp_filesystem ;
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
$theme = isset ( $theme [ 'theme' ]) ? $theme [ 'theme' ] : '' ;
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
if ( is_wp_error ( $removed ) || empty ( $theme ) )
return $removed ; //Pass errors through.
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
$themes_dir = $wp_filesystem -> wp_themes_dir ();
if ( $wp_filesystem -> exists ( trailingslashit ( $themes_dir ) . $theme ) )
if ( ! $wp_filesystem -> delete ( trailingslashit ( $themes_dir ) . $theme , true ) )
return false ;
return true ;
}
2009-04-20 14:18:39 -04:00
2010-03-12 22:59:40 -05:00
function theme_info ( $theme = null ) {
if ( empty ( $theme ) ) {
if ( ! empty ( $this -> result [ 'destination_name' ]) )
$theme = $this -> result [ 'destination_name' ];
else
return false ;
}
2012-03-23 06:20:26 -04:00
return wp_get_theme ( $theme , WP_CONTENT_DIR . '/themes/' );
2009-04-19 15:36:28 -04:00
}
}
2009-04-26 14:17:19 -04:00
/**
2011-09-03 10:18:10 -04:00
* Core Upgrader class for WordPress . It allows for WordPress to upgrade itself in combination with the wp - admin / includes / update - core . php file
2009-04-26 14:17:19 -04:00
*
* @ TODO More Detailed docs , for methods as well .
*
* @ package WordPress
* @ subpackage Upgrader
* @ since 2.8 . 0
*/
2009-04-19 15:36:28 -04:00
class Core_Upgrader extends WP_Upgrader {
function upgrade_strings () {
$this -> strings [ 'up_to_date' ] = __ ( 'WordPress is at the latest version.' );
2010-12-02 16:45:47 -05:00
$this -> strings [ 'no_package' ] = __ ( 'Update package not available.' );
2009-12-24 04:46:57 -05:00
$this -> strings [ 'downloading_package' ] = __ ( 'Downloading update from <span class="code">%s</span>…' );
$this -> strings [ 'unpack_package' ] = __ ( 'Unpacking the update…' );
2009-04-19 15:36:28 -04:00
$this -> strings [ 'copy_failed' ] = __ ( 'Could not copy files.' );
2012-04-27 14:57:59 -04:00
$this -> strings [ 'copy_failed_space' ] = __ ( 'Could not copy files. You may have run out of disk space.' );
2009-04-19 15:36:28 -04:00
}
function upgrade ( $current ) {
2011-06-10 02:22:33 -04:00
global $wp_filesystem , $wp_version ;
2009-04-20 14:18:39 -04:00
2009-04-26 14:17:19 -04:00
$this -> init ();
$this -> upgrade_strings ();
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
// Is an update available?
if ( ! isset ( $current -> response ) || $current -> response == 'latest' )
return new WP_Error ( 'up_to_date' , $this -> strings [ 'up_to_date' ]);
$res = $this -> fs_connect ( array ( ABSPATH , WP_CONTENT_DIR ) );
if ( is_wp_error ( $res ) )
return $res ;
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
$wp_dir = trailingslashit ( $wp_filesystem -> abspath ());
2009-04-20 14:18:39 -04:00
2011-06-10 01:47:44 -04:00
// If partial update is returned from the API, use that, unless we're doing a reinstall.
// If we cross the new_bundled version number, then use the new_bundled zip.
// Don't though if the constant is set to skip bundled items.
// If the API returns a no_content zip, go with it. Finally, default to the full zip.
2011-06-10 02:22:33 -04:00
if ( $current -> packages -> partial && 'reinstall' != $current -> response && $wp_version == $current -> partial_version )
2011-06-10 01:47:44 -04:00
$to_download = 'partial' ;
elseif ( $current -> packages -> new_bundled && version_compare ( $wp_version , $current -> new_bundled , '<' )
&& ( ! defined ( 'CORE_UPGRADE_SKIP_NEW_BUNDLED' ) || ! CORE_UPGRADE_SKIP_NEW_BUNDLED ) )
$to_download = 'new_bundled' ;
elseif ( $current -> packages -> no_content )
$to_download = 'no_content' ;
else
$to_download = 'full' ;
$download = $this -> download_package ( $current -> packages -> $to_download );
2009-04-19 15:36:28 -04:00
if ( is_wp_error ( $download ) )
return $download ;
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
$working_dir = $this -> unpack_package ( $download );
if ( is_wp_error ( $working_dir ) )
return $working_dir ;
// Copy update-core.php from the new version into place.
if ( ! $wp_filesystem -> copy ( $working_dir . '/wordpress/wp-admin/includes/update-core.php' , $wp_dir . 'wp-admin/includes/update-core.php' , true ) ) {
$wp_filesystem -> delete ( $working_dir , true );
return new WP_Error ( 'copy_failed' , $this -> strings [ 'copy_failed' ]);
}
$wp_filesystem -> chmod ( $wp_dir . 'wp-admin/includes/update-core.php' , FS_CHMOD_FILE );
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
require ( ABSPATH . 'wp-admin/includes/update-core.php' );
2009-04-20 14:18:39 -04:00
2012-04-27 14:57:59 -04:00
if ( ! function_exists ( 'update_core' ) )
return new WP_Error ( 'copy_failed_space' , $this -> strings [ 'copy_failed_space' ] );
2013-04-04 17:10:54 -04:00
$result = update_core ( $working_dir , $wp_dir );
do_action ( 'upgrader_process_complete' , $this , array ( 'action' => 'update' , 'type' => 'core' ), $result );
return $result ;
2009-04-19 15:36:28 -04:00
}
}
/**
2009-04-26 14:17:19 -04:00
* Generic Skin for the WordPress Upgrader classes . This skin is designed to be extended for specific purposes .
*
* @ TODO More Detailed docs , for methods as well .
*
* @ package WordPress
* @ subpackage Upgrader
* @ since 2.8 . 0
2009-04-19 15:36:28 -04:00
*/
class WP_Upgrader_Skin {
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
var $upgrader ;
var $done_header = false ;
2010-05-23 01:59:17 -04:00
var $result = false ;
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
function __construct ( $args = array ()) {
2009-05-31 17:08:03 -04:00
$defaults = array ( 'url' => '' , 'nonce' => '' , 'title' => '' , 'context' => false );
2009-04-19 15:36:28 -04:00
$this -> options = wp_parse_args ( $args , $defaults );
}
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
function set_upgrader ( & $upgrader ) {
if ( is_object ( $upgrader ) )
$this -> upgrader =& $upgrader ;
2010-03-12 22:59:40 -05:00
$this -> add_strings ();
}
function add_strings () {
2009-04-19 15:36:28 -04:00
}
2010-03-12 22:59:40 -05:00
2009-04-19 15:36:28 -04:00
function set_result ( $result ) {
$this -> result = $result ;
}
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
function request_filesystem_credentials ( $error = false ) {
$url = $this -> options [ 'url' ];
2009-05-31 17:08:03 -04:00
$context = $this -> options [ 'context' ];
2009-04-19 15:36:28 -04:00
if ( ! empty ( $this -> options [ 'nonce' ]) )
$url = wp_nonce_url ( $url , $this -> options [ 'nonce' ]);
2009-05-31 17:08:03 -04:00
return request_filesystem_credentials ( $url , '' , $error , $context ); //Possible to bring inline, Leaving as is for now.
2009-04-19 15:36:28 -04:00
}
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
function header () {
if ( $this -> done_header )
return ;
$this -> done_header = true ;
echo '<div class="wrap">' ;
2013-04-28 21:10:50 -04:00
screen_icon ();
2009-04-20 14:18:39 -04:00
echo '<h2>' . $this -> options [ 'title' ] . '</h2>' ;
2009-04-19 15:36:28 -04:00
}
function footer () {
echo '</div>' ;
}
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
function error ( $errors ) {
if ( ! $this -> done_header )
$this -> header ();
if ( is_string ( $errors ) ) {
$this -> feedback ( $errors );
} elseif ( is_wp_error ( $errors ) && $errors -> get_error_code () ) {
2009-04-24 12:53:35 -04:00
foreach ( $errors -> get_error_messages () as $message ) {
if ( $errors -> get_error_data () )
$this -> feedback ( $message . ' ' . $errors -> get_error_data () );
else
$this -> feedback ( $message );
}
2009-04-19 15:36:28 -04:00
}
}
function feedback ( $string ) {
2009-04-26 14:17:19 -04:00
if ( isset ( $this -> upgrader -> strings [ $string ] ) )
2009-04-19 15:36:28 -04:00
$string = $this -> upgrader -> strings [ $string ];
2009-04-24 12:53:35 -04:00
if ( strpos ( $string , '%' ) !== false ) {
$args = func_get_args ();
$args = array_splice ( $args , 1 );
if ( ! empty ( $args ) )
$string = vsprintf ( $string , $args );
}
2009-04-19 15:36:28 -04:00
if ( empty ( $string ) )
return ;
show_message ( $string );
2009-04-20 14:18:39 -04:00
}
2009-04-19 15:36:28 -04:00
function before () {}
function after () {}
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
}
2009-04-26 14:17:19 -04:00
/**
2009-05-24 19:47:49 -04:00
* Plugin Upgrader Skin for WordPress Plugin Upgrades .
2009-04-26 14:17:19 -04:00
*
* @ TODO More Detailed docs , for methods as well .
*
* @ package WordPress
* @ subpackage Upgrader
* @ since 2.8 . 0
*/
2009-04-19 15:36:28 -04:00
class Plugin_Upgrader_Skin extends WP_Upgrader_Skin {
var $plugin = '' ;
var $plugin_active = false ;
2010-05-02 18:57:44 -04:00
var $plugin_network_active = false ;
2009-04-19 15:36:28 -04:00
function __construct ( $args = array ()) {
2010-12-02 16:45:47 -05:00
$defaults = array ( 'url' => '' , 'plugin' => '' , 'nonce' => '' , 'title' => __ ( 'Update Plugin' ) );
2009-04-19 15:36:28 -04:00
$args = wp_parse_args ( $args , $defaults );
$this -> plugin = $args [ 'plugin' ];
2010-05-02 18:57:44 -04:00
$this -> plugin_active = is_plugin_active ( $this -> plugin );
$this -> plugin_network_active = is_plugin_active_for_network ( $this -> plugin );
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
parent :: __construct ( $args );
}
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
function after () {
$this -> plugin = $this -> upgrader -> plugin_info ();
2010-01-18 15:34:48 -05:00
if ( ! empty ( $this -> plugin ) && ! is_wp_error ( $this -> result ) && $this -> plugin_active ){
2010-05-02 18:57:44 -04:00
echo '<iframe style="border:0;overflow:hidden" width="100%" height="170px" src="' . wp_nonce_url ( 'update.php?action=activate-plugin&networkwide=' . $this -> plugin_network_active . '&plugin=' . $this -> plugin , 'activate-plugin_' . $this -> plugin ) . '"></iframe>' ;
2009-04-19 15:36:28 -04:00
}
2009-11-09 13:53:21 -05:00
2009-04-19 15:36:28 -04:00
$update_actions = array (
2009-05-05 15:43:53 -04:00
'activate_plugin' => '<a href="' . wp_nonce_url ( 'plugins.php?action=activate&plugin=' . $this -> plugin , 'activate-plugin_' . $this -> plugin ) . '" title="' . esc_attr__ ( 'Activate this plugin' ) . '" target="_parent">' . __ ( 'Activate Plugin' ) . '</a>' ,
2010-10-20 12:38:00 -04:00
'plugins_page' => '<a href="' . self_admin_url ( 'plugins.php' ) . '" title="' . esc_attr__ ( 'Go to plugins page' ) . '" target="_parent">' . __ ( 'Return to Plugins page' ) . '</a>'
2009-04-19 15:36:28 -04:00
);
2012-06-30 08:19:13 -04:00
if ( $this -> plugin_active || ! $this -> result || is_wp_error ( $this -> result ) || ! current_user_can ( 'activate_plugins' ) )
2009-04-19 15:36:28 -04:00
unset ( $update_actions [ 'activate_plugin' ] );
$update_actions = apply_filters ( 'update_plugin_complete_actions' , $update_actions , $this -> plugin );
if ( ! empty ( $update_actions ) )
2010-10-26 13:18:49 -04:00
$this -> feedback ( implode ( ' | ' , ( array ) $update_actions ));
2009-04-19 15:36:28 -04:00
}
2009-10-23 17:49:12 -04:00
2009-10-26 03:04:30 -04:00
function before () {
if ( $this -> upgrader -> show_before ) {
echo $this -> upgrader -> show_before ;
$this -> upgrader -> show_before = '' ;
}
2009-10-23 17:49:12 -04:00
}
2009-04-19 15:36:28 -04:00
}
2010-03-06 03:39:50 -05:00
/**
* Plugin Upgrader Skin for WordPress Plugin Upgrades .
*
* @ package WordPress
* @ subpackage Upgrader
2010-03-26 15:13:36 -04:00
* @ since 3.0 . 0
2010-03-06 03:39:50 -05:00
*/
2010-03-12 22:59:40 -05:00
class Bulk_Upgrader_Skin extends WP_Upgrader_Skin {
2010-03-06 03:39:50 -05:00
var $in_loop = false ;
var $error = false ;
function __construct ( $args = array ()) {
$defaults = array ( 'url' => '' , 'nonce' => '' );
$args = wp_parse_args ( $args , $defaults );
parent :: __construct ( $args );
}
2010-03-12 22:59:40 -05:00
function add_strings () {
2010-10-26 13:40:54 -04:00
$this -> upgrader -> strings [ 'skin_upgrade_start' ] = __ ( 'The update process is starting. This process may take a while on some hosts, so please be patient.' );
2013-05-22 12:57:20 -04:00
$this -> upgrader -> strings [ 'skin_update_failed_error' ] = __ ( 'An error occurred while updating %1$s: <strong>%2$s</strong>' );
2010-03-12 22:59:40 -05:00
$this -> upgrader -> strings [ 'skin_update_failed' ] = __ ( 'The update of %1$s failed.' );
2010-04-21 06:58:06 -04:00
$this -> upgrader -> strings [ 'skin_update_successful' ] = __ ( '%1$s updated successfully.' ) . ' <a onclick="%2$s" href="#" class="hide-if-no-js"><span>' . __ ( 'Show Details' ) . '</span><span class="hidden">' . __ ( 'Hide Details' ) . '</span>.</a>' ;
2010-05-25 21:27:58 -04:00
$this -> upgrader -> strings [ 'skin_upgrade_end' ] = __ ( 'All updates have been completed.' );
2010-03-12 22:59:40 -05:00
}
2010-03-06 03:39:50 -05:00
function feedback ( $string ) {
if ( isset ( $this -> upgrader -> strings [ $string ] ) )
$string = $this -> upgrader -> strings [ $string ];
if ( strpos ( $string , '%' ) !== false ) {
$args = func_get_args ();
$args = array_splice ( $args , 1 );
if ( ! empty ( $args ) )
$string = vsprintf ( $string , $args );
}
if ( empty ( $string ) )
return ;
if ( $this -> in_loop )
echo " $string <br /> \n " ;
else
echo " <p> $string </p> \n " ;
}
function header () {
// Nothing, This will be displayed within a iframe.
}
function footer () {
// Nothing, This will be displayed within a iframe.
}
function error ( $error ) {
if ( is_string ( $error ) && isset ( $this -> upgrader -> strings [ $error ] ) )
$this -> error = $this -> upgrader -> strings [ $error ];
2010-03-17 12:27:25 -04:00
2010-04-17 08:27:13 -04:00
if ( is_wp_error ( $error ) ) {
2010-03-06 03:39:50 -05:00
foreach ( $error -> get_error_messages () as $emessage ) {
if ( $error -> get_error_data () )
$messages [] = $emessage . ' ' . $error -> get_error_data ();
else
$messages [] = $emessage ;
}
$this -> error = implode ( ', ' , $messages );
}
2010-05-25 21:23:25 -04:00
echo '<script type="text/javascript">jQuery(\'.waiting-' . esc_js ( $this -> upgrader -> update_current ) . '\').hide();</script>' ;
2010-05-25 09:57:06 -04:00
}
function bulk_header () {
2010-05-25 21:27:58 -04:00
$this -> feedback ( 'skin_upgrade_start' );
2010-05-25 09:57:06 -04:00
}
function bulk_footer () {
2010-05-25 21:27:58 -04:00
$this -> feedback ( 'skin_upgrade_end' );
2010-03-06 03:39:50 -05:00
}
2010-03-12 22:59:40 -05:00
function before ( $title = '' ) {
2010-03-06 03:39:50 -05:00
$this -> in_loop = true ;
2012-09-26 15:57:44 -04:00
printf ( '<h4>' . $this -> upgrader -> strings [ 'skin_before_update_header' ] . ' <span class="spinner waiting-' . $this -> upgrader -> update_current . '"></span></h4>' , $title , $this -> upgrader -> update_current , $this -> upgrader -> update_count );
echo '<script type="text/javascript">jQuery(\'.waiting-' . esc_js ( $this -> upgrader -> update_current ) . '\').css("display", "inline-block");</script>' ;
2010-05-25 21:23:25 -04:00
echo '<div class="update-messages hide-if-js" id="progress-' . esc_attr ( $this -> upgrader -> update_current ) . '"><p>' ;
2010-03-06 03:39:50 -05:00
$this -> flush_output ();
}
2010-03-12 22:59:40 -05:00
function after ( $title = '' ) {
2010-03-06 03:39:50 -05:00
echo '</p></div>' ;
if ( $this -> error || ! $this -> result ) {
if ( $this -> error )
2010-04-21 06:58:06 -04:00
echo '<div class="error"><p>' . sprintf ( $this -> upgrader -> strings [ 'skin_update_failed_error' ], $title , $this -> error ) . '</p></div>' ;
2010-03-06 03:39:50 -05:00
else
2010-03-12 22:59:40 -05:00
echo '<div class="error"><p>' . sprintf ( $this -> upgrader -> strings [ 'skin_update_failed' ], $title ) . '</p></div>' ;
echo '<script type="text/javascript">jQuery(\'#progress-' . esc_js ( $this -> upgrader -> update_current ) . '\').show();</script>' ;
2010-03-06 03:39:50 -05:00
}
2013-05-16 08:46:36 -04:00
if ( $this -> result && ! is_wp_error ( $this -> result ) ) {
if ( ! $this -> error )
echo '<div class="updated"><p>' . sprintf ( $this -> upgrader -> strings [ 'skin_update_successful' ], $title , 'jQuery(\'#progress-' . esc_js ( $this -> upgrader -> update_current ) . '\').toggle();jQuery(\'span\', this).toggle(); return false;' ) . '</p></div>' ;
2010-05-25 21:23:25 -04:00
echo '<script type="text/javascript">jQuery(\'.waiting-' . esc_js ( $this -> upgrader -> update_current ) . '\').hide();</script>' ;
2010-03-06 03:39:50 -05:00
}
2010-05-25 09:57:06 -04:00
2010-03-06 03:39:50 -05:00
$this -> reset ();
$this -> flush_output ();
}
function reset () {
$this -> in_loop = false ;
$this -> error = false ;
}
function flush_output () {
wp_ob_end_flush_all ();
flush ();
}
2010-03-12 22:59:40 -05:00
}
2010-03-06 03:39:50 -05:00
2010-03-12 22:59:40 -05:00
class Bulk_Plugin_Upgrader_Skin extends Bulk_Upgrader_Skin {
var $plugin_info = array (); // Plugin_Upgrader::bulk() will fill this in.
2011-04-29 16:05:12 -04:00
function __construct ( $args = array ()) {
2010-03-12 22:59:40 -05:00
parent :: __construct ( $args );
}
function add_strings () {
parent :: add_strings ();
$this -> upgrader -> strings [ 'skin_before_update_header' ] = __ ( 'Updating Plugin %1$s (%2$d/%3$d)' );
}
2013-03-18 23:24:51 -04:00
function before ( $title = '' ) {
2010-03-12 22:59:40 -05:00
parent :: before ( $this -> plugin_info [ 'Title' ]);
}
2013-03-18 23:24:51 -04:00
function after ( $title = '' ) {
2010-03-12 22:59:40 -05:00
parent :: after ( $this -> plugin_info [ 'Title' ]);
}
2010-05-25 09:57:06 -04:00
function bulk_footer () {
parent :: bulk_footer ();
$update_actions = array (
2010-10-20 12:38:00 -04:00
'plugins_page' => '<a href="' . self_admin_url ( 'plugins.php' ) . '" title="' . esc_attr__ ( 'Go to plugins page' ) . '" target="_parent">' . __ ( 'Return to Plugins page' ) . '</a>' ,
'updates_page' => '<a href="' . self_admin_url ( 'update-core.php' ) . '" title="' . esc_attr__ ( 'Go to WordPress Updates page' ) . '" target="_parent">' . __ ( 'Return to WordPress Updates' ) . '</a>'
2010-05-25 09:57:06 -04:00
);
2012-06-30 08:08:18 -04:00
if ( ! current_user_can ( 'activate_plugins' ) )
unset ( $update_actions [ 'plugins_page' ] );
2010-05-25 09:57:06 -04:00
$update_actions = apply_filters ( 'update_bulk_plugins_complete_actions' , $update_actions , $this -> plugin_info );
if ( ! empty ( $update_actions ) )
2010-10-26 13:18:49 -04:00
$this -> feedback ( implode ( ' | ' , ( array ) $update_actions ));
2010-05-25 09:57:06 -04:00
}
2010-03-12 22:59:40 -05:00
}
class Bulk_Theme_Upgrader_Skin extends Bulk_Upgrader_Skin {
var $theme_info = array (); // Theme_Upgrader::bulk() will fill this in.
2011-04-29 16:05:12 -04:00
function __construct ( $args = array ()) {
2010-03-12 22:59:40 -05:00
parent :: __construct ( $args );
}
function add_strings () {
parent :: add_strings ();
$this -> upgrader -> strings [ 'skin_before_update_header' ] = __ ( 'Updating Theme %1$s (%2$d/%3$d)' );
}
2013-03-18 23:24:51 -04:00
function before ( $title = '' ) {
2012-03-23 06:20:26 -04:00
parent :: before ( $this -> theme_info -> display ( 'Name' ) );
2010-03-12 22:59:40 -05:00
}
2013-03-18 23:24:51 -04:00
function after ( $title = '' ) {
2012-03-23 06:20:26 -04:00
parent :: after ( $this -> theme_info -> display ( 'Name' ) );
2010-03-12 22:59:40 -05:00
}
2012-03-23 06:20:26 -04:00
2010-05-25 09:57:06 -04:00
function bulk_footer () {
parent :: bulk_footer ();
$update_actions = array (
2010-12-07 13:01:58 -05:00
'themes_page' => '<a href="' . self_admin_url ( 'themes.php' ) . '" title="' . esc_attr__ ( 'Go to themes page' ) . '" target="_parent">' . __ ( 'Return to Themes page' ) . '</a>' ,
'updates_page' => '<a href="' . self_admin_url ( 'update-core.php' ) . '" title="' . esc_attr__ ( 'Go to WordPress Updates page' ) . '" target="_parent">' . __ ( 'Return to WordPress Updates' ) . '</a>'
2010-05-25 09:57:06 -04:00
);
2012-06-30 08:08:18 -04:00
if ( ! current_user_can ( 'switch_themes' ) && ! current_user_can ( 'edit_theme_options' ) )
unset ( $update_actions [ 'themes_page' ] );
2010-05-25 09:57:06 -04:00
2012-03-23 06:20:26 -04:00
$update_actions = apply_filters ( 'update_bulk_theme_complete_actions' , $update_actions , $this -> theme_info );
2010-05-25 09:57:06 -04:00
if ( ! empty ( $update_actions ) )
2010-10-26 13:18:49 -04:00
$this -> feedback ( implode ( ' | ' , ( array ) $update_actions ));
2010-05-25 09:57:06 -04:00
}
2010-03-06 03:39:50 -05:00
}
2009-04-26 14:17:19 -04:00
/**
2009-05-24 19:47:49 -04:00
* Plugin Installer Skin for WordPress Plugin Installer .
2009-04-26 14:17:19 -04:00
*
* @ TODO More Detailed docs , for methods as well .
*
* @ package WordPress
* @ subpackage Upgrader
* @ since 2.8 . 0
*/
2009-04-19 15:36:28 -04:00
class Plugin_Installer_Skin extends WP_Upgrader_Skin {
var $api ;
var $type ;
function __construct ( $args = array ()) {
$defaults = array ( 'type' => 'web' , 'url' => '' , 'plugin' => '' , 'nonce' => '' , 'title' => '' );
$args = wp_parse_args ( $args , $defaults );
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
$this -> type = $args [ 'type' ];
$this -> api = isset ( $args [ 'api' ]) ? $args [ 'api' ] : array ();
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
parent :: __construct ( $args );
}
function before () {
if ( ! empty ( $this -> api ) )
$this -> upgrader -> strings [ 'process_success' ] = sprintf ( __ ( 'Successfully installed the plugin <strong>%s %s</strong>.' ), $this -> api -> name , $this -> api -> version );
}
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
function after () {
$plugin_file = $this -> upgrader -> plugin_info ();
2010-05-27 07:04:08 -04:00
$install_actions = array ();
2013-03-01 12:00:25 -05:00
$from = isset ( $_GET [ 'from' ]) ? wp_unslash ( $_GET [ 'from' ] ) : 'plugins' ;
2010-05-27 07:04:08 -04:00
if ( 'import' == $from )
$install_actions [ 'activate_plugin' ] = '<a href="' . wp_nonce_url ( 'plugins.php?action=activate&from=import&plugin=' . $plugin_file , 'activate-plugin_' . $plugin_file ) . '" title="' . esc_attr__ ( 'Activate this plugin' ) . '" target="_parent">' . __ ( 'Activate Plugin & Run Importer' ) . '</a>' ;
else
$install_actions [ 'activate_plugin' ] = '<a href="' . wp_nonce_url ( 'plugins.php?action=activate&plugin=' . $plugin_file , 'activate-plugin_' . $plugin_file ) . '" title="' . esc_attr__ ( 'Activate this plugin' ) . '" target="_parent">' . __ ( 'Activate Plugin' ) . '</a>' ;
2009-04-19 15:36:28 -04:00
2010-10-20 10:16:03 -04:00
if ( is_multisite () && current_user_can ( 'manage_network_plugins' ) ) {
2010-12-21 12:17:58 -05:00
$install_actions [ 'network_activate' ] = '<a href="' . wp_nonce_url ( 'plugins.php?action=activate&networkwide=1&plugin=' . $plugin_file , 'activate-plugin_' . $plugin_file ) . '" title="' . esc_attr__ ( 'Activate this plugin for all sites in this network' ) . '" target="_parent">' . __ ( 'Network Activate' ) . '</a>' ;
2010-10-20 10:16:03 -04:00
unset ( $install_actions [ 'activate_plugin' ] );
}
2010-05-03 19:18:49 -04:00
2010-05-27 07:04:08 -04:00
if ( 'import' == $from )
$install_actions [ 'importers_page' ] = '<a href="' . admin_url ( 'import.php' ) . '" title="' . esc_attr__ ( 'Return to Importers' ) . '" target="_parent">' . __ ( 'Return to Importers' ) . '</a>' ;
else if ( $this -> type == 'web' )
2010-10-20 10:16:03 -04:00
$install_actions [ 'plugins_page' ] = '<a href="' . self_admin_url ( 'plugin-install.php' ) . '" title="' . esc_attr__ ( 'Return to Plugin Installer' ) . '" target="_parent">' . __ ( 'Return to Plugin Installer' ) . '</a>' ;
2009-04-19 15:36:28 -04:00
else
2010-10-20 10:16:03 -04:00
$install_actions [ 'plugins_page' ] = '<a href="' . self_admin_url ( 'plugins.php' ) . '" title="' . esc_attr__ ( 'Return to Plugins page' ) . '" target="_parent">' . __ ( 'Return to Plugins page' ) . '</a>' ;
2009-04-19 15:36:28 -04:00
2010-05-28 12:42:09 -04:00
if ( ! $this -> result || is_wp_error ( $this -> result ) ) {
2012-06-30 08:19:13 -04:00
unset ( $install_actions [ 'activate_plugin' ], $install_actions [ 'network_activate' ] );
} elseif ( ! current_user_can ( 'activate_plugins' ) ) {
2009-04-26 14:17:19 -04:00
unset ( $install_actions [ 'activate_plugin' ] );
2010-05-28 12:42:09 -04:00
}
2012-06-30 08:19:13 -04:00
2009-04-19 15:36:28 -04:00
$install_actions = apply_filters ( 'install_plugin_complete_actions' , $install_actions , $this -> api , $plugin_file );
if ( ! empty ( $install_actions ) )
2010-10-26 13:18:49 -04:00
$this -> feedback ( implode ( ' | ' , ( array ) $install_actions ));
2009-04-19 15:36:28 -04:00
}
}
2009-04-26 14:17:19 -04:00
/**
2009-05-24 19:47:49 -04:00
* Theme Installer Skin for the WordPress Theme Installer .
2009-04-26 14:17:19 -04:00
*
* @ TODO More Detailed docs , for methods as well .
*
* @ package WordPress
* @ subpackage Upgrader
* @ since 2.8 . 0
*/
2009-04-19 15:36:28 -04:00
class Theme_Installer_Skin extends WP_Upgrader_Skin {
var $api ;
var $type ;
function __construct ( $args = array ()) {
$defaults = array ( 'type' => 'web' , 'url' => '' , 'theme' => '' , 'nonce' => '' , 'title' => '' );
$args = wp_parse_args ( $args , $defaults );
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
$this -> type = $args [ 'type' ];
$this -> api = isset ( $args [ 'api' ]) ? $args [ 'api' ] : array ();
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
parent :: __construct ( $args );
}
function before () {
2012-03-23 06:10:06 -04:00
if ( ! empty ( $this -> api ) )
$this -> upgrader -> strings [ 'process_success' ] = sprintf ( $this -> upgrader -> strings [ 'process_success_specific' ], $this -> api -> name , $this -> api -> version );
2009-04-19 15:36:28 -04:00
}
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
function after () {
if ( empty ( $this -> upgrader -> result [ 'destination_name' ]) )
return ;
$theme_info = $this -> upgrader -> theme_info ();
2012-04-09 22:25:03 -04:00
if ( empty ( $theme_info ) )
2009-04-19 15:36:28 -04:00
return ;
2012-04-09 22:25:03 -04:00
$name = $theme_info -> display ( 'Name' );
2009-04-19 15:36:28 -04:00
$stylesheet = $this -> upgrader -> result [ 'destination_name' ];
2012-04-09 22:25:03 -04:00
$template = $theme_info -> get_template ();
2009-04-20 14:18:39 -04:00
2012-04-09 22:25:03 -04:00
$preview_link = add_query_arg ( array (
'preview' => 1 ,
2012-09-04 18:25:25 -04:00
'template' => urlencode ( $template ),
'stylesheet' => urlencode ( $stylesheet ),
2012-09-04 18:35:12 -04:00
), trailingslashit ( home_url () ) );
2009-04-20 14:18:39 -04:00
2012-04-09 22:25:03 -04:00
$activate_link = add_query_arg ( array (
'action' => 'activate' ,
2012-09-04 18:25:25 -04:00
'template' => urlencode ( $template ),
'stylesheet' => urlencode ( $stylesheet ),
2012-04-09 22:25:03 -04:00
), admin_url ( 'themes.php' ) );
2012-06-12 10:36:24 -04:00
$activate_link = wp_nonce_url ( $activate_link , 'switch-theme_' . $stylesheet );
2012-04-09 22:25:03 -04:00
$install_actions = array ();
2012-05-30 13:15:57 -04:00
$install_actions [ 'preview' ] = '<a href="' . esc_url ( $preview_link ) . '" class="hide-if-customize" title="' . esc_attr ( sprintf ( __ ( 'Preview “%s”' ), $name ) ) . '">' . __ ( 'Preview' ) . '</a>' ;
2012-05-30 14:55:20 -04:00
$install_actions [ 'preview' ] .= '<a href="' . wp_customize_url ( $stylesheet ) . '" class="hide-if-no-customize load-customize" title="' . esc_attr ( sprintf ( __ ( 'Preview “%s”' ), $name ) ) . '">' . __ ( 'Live Preview' ) . '</a>' ;
2012-04-09 22:25:03 -04:00
$install_actions [ 'activate' ] = '<a href="' . esc_url ( $activate_link ) . '" class="activatelink" title="' . esc_attr ( sprintf ( __ ( 'Activate “%s”' ), $name ) ) . '">' . __ ( 'Activate' ) . '</a>' ;
2009-04-19 15:36:28 -04:00
2011-08-18 18:40:37 -04:00
if ( is_network_admin () && current_user_can ( 'manage_network_themes' ) )
2012-09-04 18:35:12 -04:00
$install_actions [ 'network_enable' ] = '<a href="' . esc_url ( wp_nonce_url ( 'themes.php?action=enable&theme=' . urlencode ( $stylesheet ), 'enable-theme_' . $stylesheet ) ) . '" title="' . esc_attr__ ( 'Enable this theme for all sites in this network' ) . '" target="_parent">' . __ ( 'Network Enable' ) . '</a>' ;
2011-08-18 18:40:37 -04:00
2009-04-19 15:36:28 -04:00
if ( $this -> type == 'web' )
2010-10-21 13:06:52 -04:00
$install_actions [ 'themes_page' ] = '<a href="' . self_admin_url ( 'theme-install.php' ) . '" title="' . esc_attr__ ( 'Return to Theme Installer' ) . '" target="_parent">' . __ ( 'Return to Theme Installer' ) . '</a>' ;
2012-06-30 08:08:18 -04:00
elseif ( current_user_can ( 'switch_themes' ) || current_user_can ( 'edit_theme_options' ) )
2010-10-21 13:06:52 -04:00
$install_actions [ 'themes_page' ] = '<a href="' . self_admin_url ( 'themes.php' ) . '" title="' . esc_attr__ ( 'Themes page' ) . '" target="_parent">' . __ ( 'Return to Themes page' ) . '</a>' ;
2009-04-19 15:36:28 -04:00
2012-06-30 08:08:18 -04:00
if ( ! $this -> result || is_wp_error ( $this -> result ) || is_network_admin () || ! current_user_can ( 'switch_themes' ) )
2009-04-26 14:17:19 -04:00
unset ( $install_actions [ 'activate' ], $install_actions [ 'preview' ] );
2009-04-19 15:36:28 -04:00
$install_actions = apply_filters ( 'install_theme_complete_actions' , $install_actions , $this -> api , $stylesheet , $theme_info );
if ( ! empty ( $install_actions ) )
2010-10-26 13:18:49 -04:00
$this -> feedback ( implode ( ' | ' , ( array ) $install_actions ));
2009-04-19 15:36:28 -04:00
}
}
2009-04-26 14:17:19 -04:00
/**
2009-05-24 19:47:49 -04:00
* Theme Upgrader Skin for WordPress Theme Upgrades .
2009-04-26 14:17:19 -04:00
*
* @ TODO More Detailed docs , for methods as well .
*
* @ package WordPress
* @ subpackage Upgrader
* @ since 2.8 . 0
*/
2009-04-19 15:36:28 -04:00
class Theme_Upgrader_Skin extends WP_Upgrader_Skin {
var $theme = '' ;
function __construct ( $args = array ()) {
2010-12-02 16:45:47 -05:00
$defaults = array ( 'url' => '' , 'theme' => '' , 'nonce' => '' , 'title' => __ ( 'Update Theme' ) );
2009-04-19 15:36:28 -04:00
$args = wp_parse_args ( $args , $defaults );
$this -> theme = $args [ 'theme' ];
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
parent :: __construct ( $args );
}
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
function after () {
2010-05-25 09:57:06 -04:00
$update_actions = array ();
2012-03-23 06:20:26 -04:00
if ( ! empty ( $this -> upgrader -> result [ 'destination_name' ] ) && $theme_info = $this -> upgrader -> theme_info () ) {
2012-04-09 22:25:03 -04:00
$name = $theme_info -> display ( 'Name' );
2009-06-06 04:14:41 -04:00
$stylesheet = $this -> upgrader -> result [ 'destination_name' ];
2012-04-09 22:25:03 -04:00
$template = $theme_info -> get_template ();
$preview_link = add_query_arg ( array (
'preview' => 1 ,
2012-09-04 18:25:25 -04:00
'template' => urlencode ( $template ),
'stylesheet' => urlencode ( $stylesheet ),
2012-09-04 18:35:12 -04:00
), trailingslashit ( home_url () ) );
2012-04-09 22:25:03 -04:00
$activate_link = add_query_arg ( array (
'action' => 'activate' ,
2012-09-04 18:25:25 -04:00
'template' => urlencode ( $template ),
'stylesheet' => urlencode ( $stylesheet ),
2012-04-09 22:25:03 -04:00
), admin_url ( 'themes.php' ) );
2012-06-12 10:36:24 -04:00
$activate_link = wp_nonce_url ( $activate_link , 'switch-theme_' . $stylesheet );
2009-09-14 10:03:32 -04:00
2012-05-30 14:55:20 -04:00
if ( get_stylesheet () == $stylesheet ) {
2012-06-30 08:08:18 -04:00
if ( current_user_can ( 'edit_theme_options' ) )
$update_actions [ 'preview' ] = '<a href="' . wp_customize_url ( $stylesheet ) . '" class="hide-if-no-customize load-customize" title="' . esc_attr ( sprintf ( __ ( 'Customize “%s”' ), $name ) ) . '">' . __ ( 'Customize' ) . '</a>' ;
} elseif ( current_user_can ( 'switch_themes' ) ) {
2012-05-30 14:55:20 -04:00
$update_actions [ 'preview' ] = '<a href="' . esc_url ( $preview_link ) . '" class="hide-if-customize" title="' . esc_attr ( sprintf ( __ ( 'Preview “%s”' ), $name ) ) . '">' . __ ( 'Preview' ) . '</a>' ;
$update_actions [ 'preview' ] .= '<a href="' . wp_customize_url ( $stylesheet ) . '" class="hide-if-no-customize load-customize" title="' . esc_attr ( sprintf ( __ ( 'Preview “%s”' ), $name ) ) . '">' . __ ( 'Live Preview' ) . '</a>' ;
$update_actions [ 'activate' ] = '<a href="' . esc_url ( $activate_link ) . '" class="activatelink" title="' . esc_attr ( sprintf ( __ ( 'Activate “%s”' ), $name ) ) . '">' . __ ( 'Activate' ) . '</a>' ;
}
2010-05-25 09:57:06 -04:00
2012-05-30 14:55:20 -04:00
if ( ! $this -> result || is_wp_error ( $this -> result ) || is_network_admin () )
unset ( $update_actions [ 'preview' ], $update_actions [ 'activate' ] );
2009-06-06 04:14:41 -04:00
}
2009-04-19 15:36:28 -04:00
2010-12-07 13:01:58 -05:00
$update_actions [ 'themes_page' ] = '<a href="' . self_admin_url ( 'themes.php' ) . '" title="' . esc_attr__ ( 'Return to Themes page' ) . '" target="_parent">' . __ ( 'Return to Themes page' ) . '</a>' ;
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
$update_actions = apply_filters ( 'update_theme_complete_actions' , $update_actions , $this -> theme );
if ( ! empty ( $update_actions ) )
2010-10-26 13:18:49 -04:00
$this -> feedback ( implode ( ' | ' , ( array ) $update_actions ));
2009-04-19 15:36:28 -04:00
}
}
2009-04-26 14:17:19 -04:00
/**
2012-12-20 10:55:32 -05:00
* Upgrade Skin helper for File uploads . This class handles the upload process and passes it as if it ' s a local file to the Upgrade / Installer functions .
2009-04-26 14:17:19 -04:00
*
* @ TODO More Detailed docs , for methods as well .
*
* @ package WordPress
* @ subpackage Upgrader
* @ since 2.8 . 0
*/
2009-04-19 15:36:28 -04:00
class File_Upload_Upgrader {
var $package ;
var $filename ;
2011-08-28 04:42:07 -04:00
var $id = 0 ;
2009-04-19 15:36:28 -04:00
function __construct ( $form , $urlholder ) {
2009-04-20 14:18:39 -04:00
2009-04-19 15:36:28 -04:00
if ( empty ( $_FILES [ $form ][ 'name' ]) && empty ( $_GET [ $urlholder ]) )
wp_die ( __ ( 'Please select a file' ));
2009-04-20 14:18:39 -04:00
2012-12-20 10:55:32 -05:00
//Handle a newly uploaded file, Else assume it's already been uploaded
2011-08-28 04:42:07 -04:00
if ( ! empty ( $_FILES ) ) {
$overrides = array ( 'test_form' => false , 'test_type' => false );
$file = wp_handle_upload ( $_FILES [ $form ], $overrides );
if ( isset ( $file [ 'error' ] ) )
wp_die ( $file [ 'error' ] );
2009-04-20 14:18:39 -04:00
2011-08-28 04:42:07 -04:00
$this -> filename = $_FILES [ $form ][ 'name' ];
$this -> package = $file [ 'file' ];
// Construct the object array
$object = array (
'post_title' => $this -> filename ,
'post_content' => $file [ 'url' ],
'post_mime_type' => $file [ 'type' ],
'guid' => $file [ 'url' ],
'context' => 'upgrader' ,
'post_status' => 'private'
);
// Save the data
$this -> id = wp_insert_attachment ( $object , $file [ 'file' ] );
// schedule a cleanup for 2 hours from now in case of failed install
wp_schedule_single_event ( time () + 7200 , 'upgrader_scheduled_cleanup' , array ( $this -> id ) );
} elseif ( is_numeric ( $_GET [ $urlholder ] ) ) {
// Numeric Package = previously uploaded file, see above.
$this -> id = ( int ) $_GET [ $urlholder ];
$attachment = get_post ( $this -> id );
if ( empty ( $attachment ) )
2011-10-24 15:13:23 -04:00
wp_die ( __ ( 'Please select a file' ));
2011-08-28 04:42:07 -04:00
$this -> filename = $attachment -> post_title ;
$this -> package = get_attached_file ( $attachment -> ID );
2009-04-19 15:36:28 -04:00
} else {
2011-08-28 04:42:07 -04:00
// Else, It's set to something, Back compat for plugins using the old (pre-3.3) File_Uploader handler.
if ( ! ( ( $uploads = wp_upload_dir () ) && false === $uploads [ 'error' ] ) )
wp_die ( $uploads [ 'error' ] );
$this -> filename = $_GET [ $urlholder ];
2009-04-19 15:36:28 -04:00
$this -> package = $uploads [ 'basedir' ] . '/' . $this -> filename ;
}
}
2011-08-27 23:51:35 -04:00
function cleanup () {
2011-08-28 04:42:07 -04:00
if ( $this -> id )
wp_delete_attachment ( $this -> id );
elseif ( file_exists ( $this -> package ) )
return @ unlink ( $this -> package );
2011-08-27 23:51:35 -04:00
return true ;
}
2012-03-23 06:10:06 -04:00
}