* /*
* Upgrade Name: Name of upgrade
* Upgrade URI: Link to upgrade information
* Description: upgrade Description
* Author: upgrade author's name
* Author URI: Link to the author's web site
* Version: Must be set in the upgrade for WordPress 2.3+
* Text Domain: Optional. Unique identifier, should be same as the one used in
* upgrade_text_domain()
* Domain Path: Optional. Only useful if the translations are located in a
* folder above the upgrade's base path. For example, if .mo files are
* located in the locale folder then Domain Path will be "/locale/" and
* must have the first slash. Defaults to the base folder the upgrade is
* located in.
* * / # Remove the space to close comment
*
*
* upgrade data returned array contains the following:
* 'Name' - Name of the upgrade, must be unique.
* 'Title' - Title of the upgrade and the link to the upgrade's web site.
* 'Description' - Description of what the upgrade does and/or notes
* from the author.
* 'Author' - The author's name
* 'AuthorURI' - The authors web site address.
* 'Version' - The upgrade version number.
* 'upgradeURI' - upgrade web site address.
* 'TextDomain' - upgrade's text domain for localization.
* 'DomainPath' - upgrade's relative directory path to .mo files.
*
* Some users have issues with opening large files and manipulating the contents
* for want is usually the first 1kiB or 2kiB. This function stops pulling in
* the upgrade contents when it has all of the required upgrade data.
*
* The first 8kiB of the file will be pulled in and if the upgrade data is not
* within that first 8kiB, then the upgrade author should correct their upgrade
* and move the upgrade data headers to the top.
*
* The upgrade file is assumed to have permissions to allow for scripts to read
* the file. This is not checked however and the file is only opened for
* reading.
*
* @link http://trac.wordpress.org/ticket/5651 Previous Optimizations.
* @link http://trac.wordpress.org/ticket/7372 Further and better Optimizations.
* @since 1.5.0
*
* @param string $upgrade_file Path to the upgrade file
* @param bool $markup If the returned data should have HTML markup applied
* @param bool $translate If the returned data should be translated
* @return array See above for description.
*/
function get_upgrade_data( $upgrade_file, $markup = true, $translate = true ) {
// We don't need to write to the file, so just open for reading.
$fp = fopen($upgrade_file, 'r');
// Pull only the first 8kiB of the file in.
$upgrade_data = fread( $fp, 8192 );
// PHP will close file handle, but we are good citizens.
fclose($fp);
preg_match( '|Upgrade Name:(.*)$|mi', $upgrade_data, $name );
preg_match( '|Upgrade URI:(.*)$|mi', $upgrade_data, $uri );
preg_match( '|Version:(.*)|i', $upgrade_data, $version );
preg_match( '|Description:(.*)$|mi', $upgrade_data, $description );
preg_match( '|Author:(.*)$|mi', $upgrade_data, $author_name );
preg_match( '|Author URI:(.*)$|mi', $upgrade_data, $author_uri );
preg_match( '|Text Domain:(.*)$|mi', $upgrade_data, $text_domain );
preg_match( '|Domain Path:(.*)$|mi', $upgrade_data, $domain_path );
foreach ( array( 'name', 'uri', 'version', 'description', 'author_name', 'author_uri', 'text_domain', 'domain_path' ) as $field ) {
if ( !empty( ${$field} ) )
${$field} = _cleanup_header_comment(${$field}[1]);
else
${$field} = '';
}
$upgrade_data = array(
'Name' => $name, 'Title' => $name, 'UpgradeURI' => $uri, 'Description' => $description,
'Author' => $author_name, 'AuthorURI' => $author_uri, 'Version' => $version,
'TextDomain' => $text_domain, 'DomainPath' => $domain_path
);
if ( $markup || $translate )
$upgrade_data = _get_upgrade_data_markup_translate($upgrade_file, $upgrade_data, $markup, $translate);
return $upgrade_data;
}
function _get_upgrade_data_markup_translate($upgrade_file, $upgrade_data, $markup = true, $translate = true) {
//Translate fields
if( $translate && ! empty($upgrade_data['TextDomain']) ) {
if( ! empty( $upgrade_data['DomainPath'] ) )
load_upgrade_textdomain($upgrade_data['TextDomain'], dirname($upgrade_file). $upgrade_data['DomainPath']);
else
load_upgrade_textdomain($upgrade_data['TextDomain'], dirname($upgrade_file));
foreach ( array('Name', 'UpgradeURI', 'Description', 'Author', 'AuthorURI', 'Version') as $field )
$upgrade_data[ $field ] = translate($upgrade_data[ $field ], $upgrade_data['TextDomain']);
}
//Apply Markup
if ( $markup ) {
if ( ! empty($upgrade_data['UpgradeURI']) && ! empty($upgrade_data['Name']) )
$upgrade_data['Title'] = '' . $upgrade_data['Name'] . '';
else
$upgrade_data['Title'] = $upgrade_data['Name'];
if ( ! empty($upgrade_data['AuthorURI']) && ! empty($upgrade_data['Author']) )
$upgrade_data['Author'] = '' . $upgrade_data['Author'] . '';
$upgrade_data['Description'] = wptexturize( $upgrade_data['Description'] );
if( ! empty($upgrade_data['Author']) )
$upgrade_data['Description'] .= ' ' . sprintf( __('By %s'), $upgrade_data['Author'] ) . '.';
}
$upgrades_allowedtags = array('a' => array('href' => array(),'title' => array()),'abbr' => array('title' => array()),'acronym' => array('title' => array()),'code' => array(),'em' => array(),'strong' => array());
// Sanitize all displayed data
$upgrade_data['Title'] = wp_kses($upgrade_data['Title'], $upgrades_allowedtags);
$upgrade_data['Version'] = wp_kses($upgrade_data['Version'], $upgrades_allowedtags);
$upgrade_data['Description'] = wp_kses($upgrade_data['Description'], $upgrades_allowedtags);
$upgrade_data['Author'] = wp_kses($upgrade_data['Author'], $upgrades_allowedtags);
return $upgrade_data;
}
/**
* Get a list of a upgrade's files.
*
* @since 2.8.0
*
* @param string $upgrade upgrade ID
* @return array List of files relative to the upgrade root.
*/
function get_upgrade_files($upgrade) {
$upgrade_file = WPSC_UPGRADES_DIR . '/' . $upgrade;
$dir = dirname($upgrade_file);
$upgrade_files = array($upgrade);
if ( is_dir($dir) && $dir != WPSC_UPGRADES_DIR ) {
$upgrades_dir = @ opendir( $dir );
if ( $upgrades_dir ) {
while (($file = readdir( $upgrades_dir ) ) !== false ) {
if ( substr($file, 0, 1) == '.' )
continue;
if ( is_dir( $dir . '/' . $file ) ) {
$upgrades_subdir = @ opendir( $dir . '/' . $file );
if ( $upgrades_subdir ) {
while (($subfile = readdir( $upgrades_subdir ) ) !== false ) {
if ( substr($subfile, 0, 1) == '.' )
continue;
$upgrade_files[] = plugin_basename("$dir/$file/$subfile");
}
@closedir( $upgrades_subdir );
}
} else {
if ( plugin_basename("$dir/$file") != $upgrade )
$upgrade_files[] = plugin_basename("$dir/$file");
}
}
@closedir( $upgrades_dir );
}
}
return $upgrade_files;
}
/**
* Check the upgrades directory and retrieve all upgrade files with upgrade data.
*
* WordPress Shopping Cart only supports upgrade files in the base upgrades directory
* (uploads/wpsc/upgrades) and in one directory above the upgrades directory
* (uploads/wpsc/upgrades/my-upgrade). The file it looks for has the upgrade data and
* must be found in those two locations. It is recommended that do keep your
* upgrade files in directories.
*
* The file with the upgrade data is the file that will be included and therefore
* needs to have the main execution for the upgrade. This does not mean
* everything must be contained in the file and it is recommended that the file
* be split for maintainability. Keep everything in one file for extreme
* optimization purposes.
*
* @since unknown
*
* @param string $upgrade_folder Optional. Relative path to single upgrade folder.
* @return array Key is the upgrade file path and the value is an array of the upgrade data.
*/
function get_upgrades($upgrade_folder = '') {
if ( ! $cache_upgrades = wp_cache_get('wpsc_upgrades', 'wpsc_upgrades') )
$cache_upgrades = array();
if ( isset($cache_upgrades[ $upgrade_folder ]) )
return $cache_upgrades[ $upgrade_folder ];
$wpsc_upgrades = array ();
$upgrade_root = WPSC_UPGRADES_DIR;
if( !empty($upgrade_folder) )
$upgrade_root .= $upgrade_folder;
// Files in wp-content/upgrades directory
$upgrades_dir = @ opendir( $upgrade_root);
$upgrade_files = array();
if ( $upgrades_dir ) {
while (($file = readdir( $upgrades_dir ) ) !== false ) {
if ( substr($file, 0, 1) == '.' )
continue;
if ( is_dir( $upgrade_root.'/'.$file ) ) {
$upgrades_subdir = @ opendir( $upgrade_root.'/'.$file );
if ( $upgrades_subdir ) {
while (($subfile = readdir( $upgrades_subdir ) ) !== false ) {
if ( substr($subfile, 0, 1) == '.' )
continue;
if ( substr($subfile, -4) == '.php' )
$upgrade_files[] = "$file/$subfile";
}
}
} else {
if ( substr($file, -4) == '.php' )
$upgrade_files[] = $file;
}
}
}
@closedir( $upgrades_dir );
@closedir( $upgrades_subdir );
if ( !$upgrades_dir || empty($upgrade_files) )
return $wpsc_upgrades;
foreach ( $upgrade_files as $upgrade_file ) {
if ( !is_readable( "$upgrade_root/$upgrade_file" ) )
continue;
$upgrade_data = get_upgrade_data( "$upgrade_root/$upgrade_file", false, false ); //Do not apply markup/translate as it'll be cached.
if ( empty ( $upgrade_data['Name'] ) )
continue;
$wpsc_upgrades[plugin_basename( $upgrade_file )] = $upgrade_data;
}
uasort( $wpsc_upgrades, create_function( '$a, $b', 'return strnatcasecmp( $a["Name"], $b["Name"] );' ));
$cache_upgrades[ $upgrade_folder ] = $wpsc_upgrades;
wp_cache_set('wpsc_upgrades', $cache_upgrades, 'wpsc_upgrades');
return $wpsc_upgrades;
}
?>