are_themes_available() ) {
return FALSE;
}
if ( get_option( 'ai1ec_themes_version', 1 ) >= AI1EC_THEMES_VERSION ) {
return FALSE;
}
return TRUE;
}
/**
* Returns a notice informing admin to update the core theme files if core
* theme files are determined to be out of date. Else returns '' (evaluates
* to false). If $echo is true, outputs the notice. Else outputs nothing.
*
* @see Ai1ec_Themes_Controller::are_themes_outdated()
*
* @param boolean $echo Whether to output the message or just return it.
* @return boolean Whether core theme files are out of date.
*/
public function frontend_outdated_themes_notice( $echo = true ) {
$output = '';
if ( $this->are_themes_outdated() ) {
$output .= '
';
$output .= __( 'The All-in-One Event Calendar core theme files are out of date and the calendar has been temporarily disabled.', AI1EC_PLUGIN_NAME );
$output .= ' ';
if ( current_user_can( 'install_themes' ) ) {
$output .= sprintf(
__( 'To enable the calendar, please log into the WordPress dashboard and follow the instructions.', AI1EC_PLUGIN_NAME ),
esc_attr( admin_url() )
);
}
else {
$output .= __( 'To enable the calendar, an administrator must log into the WordPress dashboard and follow the instructions.', AI1EC_PLUGIN_NAME );
}
$output .= '
';
}
if ( $echo ) {
echo $output;
}
return $output;
}
/**
* copy_directory function
*
* @return void
**/
private function copy_directory( $source, $destination ) {
if( is_dir( $source ) ) {
@mkdir( $destination );
$directory = dir( $source );
while( FALSE !== ( $readdirectory = $directory->read() ) ) {
if( $readdirectory == '.' || $readdirectory == '..' ) {
continue;
}
$PathDir = $source . '/' . $readdirectory;
if( is_dir( $PathDir ) ) {
$this->copy_directory( $PathDir, $destination . '/' . $readdirectory );
continue;
}
copy( $PathDir, $destination . '/' . $readdirectory );
}
$directory->close();
} else {
copy( $source, $destination );
}
}
/**
* install_themes function
*
* @return void
**/
function install_themes() {
?>
wp_content_dir() . AI1EC_THEMES_FOLDER;
$result = $wp_filesystem->mkdir( $themes_root );
if( $result === false ) {
?>
wp_plugins_dir() . AI1EC_PLUGIN_NAME . DIRECTORY_SEPARATOR . AI1EC_THEMES_FOLDER;
$result = copy_dir( $plugin_themes_dir, $themes_root );
if( is_wp_error( $result ) ) {
?>
.
get_error_message() ),
AI1EC_PLUGIN_NAME
) ?>
.
0 ||
count( $files_to_delete ) > 0 ||
count( $folders ) > 0 ||
count( $folders_to_delete ) > 0 ||
count( $folders_to_make ) > 0 ) {
// WP_Filesystem figures it out by itself, but the filesystem method may be overriden here
$method = '';
$url = wp_nonce_url( AI1EC_UPDATE_THEMES_BASE_URL, AI1EC_PLUGIN_NAME . '-theme-updater' );
if( false === ( $creds = request_filesystem_credentials( $url, $method, false, false ) ) ) {
// if we get here, then we don't have credentials yet,
// but have just produced a form for the user to fill in,
// so stop processing for now
return false; // stop the normal page form from displaying
}
// now we have some credentials, try to get the wp_filesystem running
if( ! WP_Filesystem( $creds ) ) {
// our credentials were no good, ask the user for them again
request_filesystem_credentials( $url, $method, true, false );
return false;
}
global $wp_filesystem;
// 1. Create new folders
foreach ( $folders_to_make as $folder_to_make ) {
// try to create the folder
if( FALSE === $wp_filesystem->mkdir( $dest_dir . $folder_to_make ) ) {
// We were not able to create the folder; unimportant and not worth
// notifying the user. Also quite likely to happen in many normal
// situations (usually the directoy has already been created). Only
// the files that are not copied (perhaps due to a missing folder, or
// other reason) are important, as only that affects functionality of
// themes.
}
}
// 2. Copy folders
foreach ( $folders as $folder ) {
// try to copy the folder
$result = copy_dir( $src_dir . $folder, $dest_dir . $folder );
if( is_wp_error( $result ) ) {
// we were not able to copy the folder, notify the user
$errors[] = sprintf(
__( 'There was an error("%s") while copying theme folders. Please FTP to your web server and manually copy
%s
to
%s
', AI1EC_PLUGIN_NAME ),
$result->get_error_message(),
$src_dir . $folder,
$dest_dir . $folder
);
}
}
// 3. Copy files
// loop over files
foreach ( $files as $file ) {
// copy only files that exist
if( $wp_filesystem->exists( $src_dir . $file ) ) {
// was file copied successfully?
if ( ! $wp_filesystem->copy( $src_dir . $file, $dest_dir . $file, true, FS_CHMOD_FILE ) ) {
// If copy failed, chmod file to 0644 and try again.
$wp_filesystem->chmod( $dest_dir . $file, 0644);
if ( ! $wp_filesystem->copy( $src_dir . $file, $dest_dir . $file, true, FS_CHMOD_FILE ) ) {
// we were not able to copy the file, notify the user
$errors[] = sprintf(
__( 'There was an error updating one of the files. Please FTP to your web server and manually copy
%s
to
%s
', AI1EC_PLUGIN_NAME ),
$src_dir . $file,
$dest_dir . $file
);
}
}
}
}
// 4. Remove folders
foreach ( $folders_to_delete as $folder_to_delete ) {
// check if folder exist
if( $wp_filesystem->is_dir( $dest_dir . $folder_to_delete ) ) {
// folder actions are always recursive
$recursive = true;
// try to delete the folder
if( FALSE === $wp_filesystem->delete( $dest_dir . $folder_to_delete, $recursive ) ) {
// If delete failed, chmod folder recursively to 0644 and try again.
$wp_filesystem->chmod( $dest_dir . $folder_to_delete, 0644, $recursive );
if( FALSE === $wp_filesystem->delete( $dest_dir . $folder_to_delete, $recursive ) ) {
// We were not able to remove the folder; unimportant and not
// worth notifying the user. Also quite likely to happen in many
// normal situations (usually the directory has already been
// deleted). Only the files that are not removed are important, as
// only that affects functionality of themes.
}
}
}
}
// 5. Remove files
foreach ( $files_to_delete as $file ) {
// check if file exist
if( $wp_filesystem->exists( $dest_dir . $file ) ) {
// try to delete the file
if( FALSE === $wp_filesystem->delete( $dest_dir . $file ) ) {
// If delete failed, chmod file to 0644 and try again.
$wp_filesystem->chmod( $dest_dir . $file, 0644 );
if( FALSE === $wp_filesystem->delete( $dest_dir . $file ) ) {
// we were not able to remove the file, notify the user
$errors[] = sprintf(
__( 'There was an error deleting one of the files. Please FTP to your web server and manually delete
%s
', AI1EC_PLUGIN_NAME ),
$dest_dir . $file
);
}
}
}
}
}
// TODO: Only update the theme version when the update was successful.
// Otherwise provide a way for the user to review the error log that this
// update generated and to run the update again, after fixing the reported
// errors.
// Update theme version
update_option( 'ai1ec_themes_version', AI1EC_THEMES_VERSION );
if ( $errors ) {
$msg = __( 'Errors occurred while we tried to update your core calendar files.
Please follow any instructions listed below or your calendar may malfunction:
', AI1EC_PLUGIN_NAME );
}
else {
$msg = __( 'Your core calendar files were updated successfully.
', AI1EC_PLUGIN_NAME );
}
$args = array(
'msg' => $msg,
'errors' => $errors,
);
$ai1ec_view_helper->display_admin( 'themes-updated.php', $args );
}
/**
* Called immediately after WP theme's functions.php is loaded. Load our own
* theme's functions.php at this time, and the default theme's functions.php.
*/
function setup_theme() {
$functions_files = array(
$this->active_template_path() . '/functions.php',
AI1EC_DEFAULT_THEME_PATH . '/functions.php',
);
$functions_files = array_unique( $functions_files );
foreach( $functions_files as $file ) {
if ( file_exists( $file ) ) {
include( $file );
}
}
}
}
// END class