setObject("public/" . $metadata['file'], fopen($fileName, "r")); $sizes = @$metadata['sizes']; if(is_array($sizes)) { $thumbPref = dirname($metadata['file']); $dirName = dirname($fileName); foreach ($sizes as $thums) { if(isset($thums['file'])) { $thumbName = $dirName . DIRECTORY_SEPARATOR . $thums['file']; if(file_exists($thumbName)) { $remoteCloud->setObject("public/" . $thumbPref . "/" . $thums['file'], fopen($thumbName, "r")); } } } } } } if(isset($metadata['post_mime_type']) && isset($metadata['guid']) && $metadata['post_type'] == 'attachment'){ if(strpos($metadata['post_mime_type'], 'image/') !== 0){ $siteUrl = wp_upload_dir()['baseurl'] . DIRECTORY_SEPARATOR; $objectName = str_replace($siteUrl, '', $metadata['guid']); $fileName = wp_upload_dir()['basedir'] . DIRECTORY_SEPARATOR . $objectName; if (is_file($fileName) && is_readable($fileName)) { include_once __DIR__ . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php'; /** @var \Atlex\AtlexCloud $remoteCloud */ $remoteCloud = self::getCloud(); $remoteCloud->setObject("public/" . $objectName, fopen($fileName, "r")); } } } return $metadata; } public static function mediafileDelete($metaid) { $metadata = wp_get_attachment_metadata( $metaid ); if (isset($metadata['file'])) { $fileName = wp_upload_dir()['basedir'] . DIRECTORY_SEPARATOR . $metadata['file']; if (is_file($fileName) ) { include_once __DIR__ . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php'; /** @var \Atlex\AtlexCloud $remoteCloud */ $remoteCloud = self::getCloud(); $remoteCloud->deleteObject("public/" . $metadata['file']); $sizes = @$metadata['sizes']; if(is_array($sizes)) { $thumbPref = dirname($metadata['file']); $dirName = dirname($fileName); foreach ($sizes as $thums) { if(isset($thums['file'])) { $thumbName = $dirName . DIRECTORY_SEPARATOR . $thums['file']; if(file_exists($thumbName)) { $remoteCloud->deleteObject("public/" . $thumbPref . "/" . $thums['file']); } } } } } }else{ $fileName = get_attached_file($metaid); if(file_exists($fileName)) { $objectName = str_replace(wp_upload_dir()['basedir']."/", '', $fileName); include_once __DIR__ . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php'; /** @var \Atlex\AtlexCloud $remoteCloud */ $remoteCloud = self::getCloud(); $remoteCloud->deleteObject("public/" . $objectName); echo "CUSTOM DELETE public/" . $objectName; } } return $metaid; } public static function viewTools() { load_textdomain( 'default', ATLEX_LANG_FILE ); $settings = self::getSettings(); if(@$settings['connected'] == 1) { wp_enqueue_script('wp-atlex-tool-js', plugins_url('/assets/js/wp-atlex-tool.js', __FILE__), array('jquery'), null, true); wp_enqueue_style('wp-atlex-css', plugins_url('/assets/css/wp-atlex.css', __FILE__)); wp_localize_script('wp-atlex-tool-js', 'atlexOptions', array( 'ajax_url' => admin_url('admin-ajax.php'), 'path_sql_container' => $settings['container'] . '/sql', 'path_dir_container' => $settings['container'] . '/wordpress', 'nonce' => wp_create_nonce('atlex_nonce'), 'remote_backup_sql' => $settings['container'] . '/sql', 'remote_backup_files' => $settings['container'] . '/wordpress', 'msg_loading' => __('Loading'), 'msg_sql_delete' => __('Do you want to delete sql archive from cloud?'), 'msg_sql_restore' => __('Do you want to restore database from sql archive?'), 'msg_dir_delete' => __('Do you want to delete files archive from cloud?'), 'msg_success_download' => __('File success downloaded to ') . wp_upload_dir()['basedir'] . '/atlexbackup', )); extract( array( 'images_src' => array( 'loading' => plugins_url('assets/img/loading.gif', __FILE__), ), 'settings' => self::getSettings(), ) ); include __DIR__ . DIRECTORY_SEPARATOR . 'views' . DIRECTORY_SEPARATOR . 'tools.php'; } else { echo '
'; echo __('You need configurate cloud setting for connection'); echo '
'; self::printSettingsMenu(); } } public static function getSettings() { $options = array( 'connected' => '0', 'adapter' => 'ftp', 'host' => '', 'user' => '', 'password' => '', 'project' => '', 'container' => 'backup', 'local_path' => wp_upload_dir()['basedir'], 'cdn_sync' => 'off', 'cdn_change_url' => 'off', 'cdn_url' => '', 'cdn_status' => 'off', ); $data = get_option('atlex_cloud_configuration'); if($data){ $options = unserialize(get_option('atlex_cloud_configuration')); } return $options; } public static function adminPluginSettingsLink( $links ) { $args = array( 'page' => 'atlex_cloud_options' ); $url = add_query_arg( $args, admin_url('options-general.php')); $settings_link = ''.__('Settings').''; array_unshift( $links, $settings_link ); return $links; } public static function printToolMenu(){ load_textdomain( 'default', ATLEX_LANG_FILE ); $args = array( 'page' => 'atlex_cloud_tools' ); $url = add_query_arg( $args, admin_url('tools.php')); echo ''; } public static function printSettingsMenu(){ load_textdomain( 'default', ATLEX_LANG_FILE ); $args = array( 'page' => 'atlex_cloud_options' ); $url = add_query_arg( $args, admin_url('options-general.php')); echo ''; } public static function viewOptions() { if ( !current_user_can( 'manage_options' ) ) { wp_die('You do not have sufficient permissions to access this page.'); } load_textdomain( 'default', ATLEX_LANG_FILE ); wp_enqueue_script('wp-atlex-options-js', plugins_url('/assets/js/wp-atlex-options.js', __FILE__), array('jquery'), null, true); wp_enqueue_style('wp-atlex-css', plugins_url('/assets/css/wp-atlex.css', __FILE__)); wp_localize_script('wp-atlex-options-js', 'atlexOptions', array( 'ajax_url' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('atlex_nonce'), )); $options = self::getSettings(); extract( array( 'form' => $options, 'adapter_options' => array( array('text'=>'FTP', 'value' => 'ftp', 'protocol' => 'ftp://'), array('text'=>'Amazone S3 - AWS', 'value' => 's3', 'protocol' => 'https://'), array('text'=>'OpenStack', 'value' => 'os', 'protocol' => 'https://'), ), 'images_src' => array( 'loading' => plugins_url('assets/img/loading.gif', __FILE__), 'cloud-tool' => plugins_url('assets/img/cloud-tool.png', __FILE__), 'settings' => plugins_url('assets/img/settings.png', __FILE__), ), ) ); include __DIR__ . DIRECTORY_SEPARATOR .'views' . DIRECTORY_SEPARATOR . 'options.php'; } public static function ajaxOptionsSave() { @error_reporting(E_ALL); @ini_set('display_errors', 1); if(!isset($_POST["nonce"]) || !wp_verify_nonce($_POST["nonce"], 'atlex_nonce')) wp_die('permission denied'); $cdn_status = 'off'; if(@$_POST['cdn_sync'] === 'on'){ $cdn_status = 'syncprocess'; } $host = sanitize_text_field($_POST['host']); $host = str_replace('https://', '', $host); $host = str_replace('http://', '', $host); $host = str_replace('ftp://', '', $host); $adapter = sanitize_text_field($_POST['adapter']); if($adapter == 'os'){ if (!defined('PHP_VERSION_ID')) { $version = explode('.', PHP_VERSION); define('PHP_VERSION_ID', ($version[0] * 10000 + $version[1] * 100 + $version[2])); } if(PHP_VERSION_ID < 70000){ wp_die(__("You can use OpenStack adapter with PHP7 and up version")); } } $options = array( 'connected' => 0, 'adapter' => $adapter, 'host' => $host, 'user' => sanitize_text_field($_POST['user']), 'password' => sanitize_text_field($_POST['password']), 'project' => sanitize_text_field($_POST['project']), 'container' => sanitize_text_field($_POST['container']), 'local_path' => sanitize_text_field($_POST['local_path']), 'cdn_sync' => sanitize_text_field($_POST['cdn_sync']), 'cdn_url' => sanitize_text_field($_POST['cdn_url']), 'cdn_change_url' => sanitize_text_field($_POST['cdn_change_url']), 'cdn_status' => sanitize_text_field($cdn_status) ); update_option('atlex_cloud_configuration', serialize($options)); try{ include_once __DIR__ . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php'; /** @var \Atlex\AtlexCloud $remoteCloud */ $remoteCloud = self::getCloud(); $remoteCloud->createContainer(sanitize_text_field($_POST['container']) . "/sql"); $remoteCloud->createContainer(sanitize_text_field($_POST['container']) . "/wordpress"); $msg = __("Successfully connected"); if($_POST['cdn_sync'] == 'on') $msg .= "\n" . __("Started mediafiles synchronization process"); $options['connected'] = 1; update_option('atlex_cloud_configuration', serialize($options)); wp_die($msg); }catch(Exception $e){ wp_die(__("Error on connection")); } } public static function zipData($source, $destination) { $zip = new \ZipArchive(); if ($zip->open($destination, \ZIPARCHIVE::CREATE)) { $source = realpath($source); if (is_dir($source)) { $iterator = new \RecursiveDirectoryIterator($source); $iterator->setFlags(\RecursiveDirectoryIterator::SKIP_DOTS); $files = new \RecursiveIteratorIterator($iterator, \RecursiveIteratorIterator::SELF_FIRST); foreach ($files as $file) { $file = realpath($file); if (is_dir($file)) { $zip->addEmptyDir(str_replace($source . '/', '', $file . '/')); } elseif (is_file($file)) { $zip->addFromString(str_replace($source . '/', '', $file), file_get_contents($file)); } } } else if (is_file($source)) { $zip->addFromString(basename($source), file_get_contents($source)); } } $zip->close(); } public static function ajaxArchiveCreate() { error_reporting(E_ALL); ini_set('display_errors', 1); if(!isset($_POST["nonce"]) || !wp_verify_nonce($_POST["nonce"], 'atlex_nonce')) wp_die('permission denied'); global $wpdb; $upload = wp_upload_dir(); $upload_dir = $upload['basedir']; $upload_dir = $upload_dir . DIRECTORY_SEPARATOR . 'atlexbackup'; if (!wp_mkdir_p($upload_dir)) { echo "create directory error"; } try { include_once __DIR__ . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php'; $dump = new \MySQLDump($wpdb->dbh); $fileName = $upload_dir . DIRECTORY_SEPARATOR . sanitize_text_field($_POST['name']) . '.gz'; $dump->save($fileName); /** @var \Atlex\AtlexCloud $remoteCloud */ $remoteCloud = self::getCloud(); if (is_file($fileName) && is_readable($fileName)) { $settings = self::getSettings(); $remoteCloud->setObject($settings['container'] . "/sql/" . sanitize_text_field($_POST['name']) . '.gz', fopen($fileName, "r")); } unlink($fileName); echo json_encode( array( 'success' => true, 'name' => sanitize_text_field($_POST['name']) ) ); wp_die(); }catch(Exception $e){ echo json_encode( array( 'error' => $e->getMessage() ) ); wp_die(); } } public static function ajaxLoadArchives() { //error_reporting(E_ALL); //ini_set('display_errors', 1); if(!isset($_POST["nonce"]) || !wp_verify_nonce($_POST["nonce"], 'atlex_nonce')) wp_die('permission denied'); try { include_once __DIR__ . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php'; /** @var \Atlex\AtlexCloud $remoteCloud */ $remoteCloud = self::getCloud(); $settings = self::getSettings(); $containers = $remoteCloud->get($settings['container'] . "/sql"); $data = []; /** @var \Atlex\Cloud\CloudObject $containerObject */ foreach ($containers as $containerObject) { if ($containerObject->getType() == \Atlex\Cloud\CloudObjectType::OBJECT) { $data[] = [ 'name' => $containerObject->getName(), 'path' => $containerObject->getPath(), ]; } } usort($data, function ($a, $b) { return $a['name'] > $b['name']; }); echo json_encode( array( 'success' => true, 'archives' => $data, ) ); wp_die(); }catch(Exception $e){ echo json_encode( array( 'error' => $e->getMessage() ) ); wp_die(); } } public static function ajaxArchiveDelete() { if(!isset($_POST["nonce"]) || !wp_verify_nonce($_POST["nonce"], 'atlex_nonce')) wp_die('permission denied'); include_once __DIR__. DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php'; try{ /** @var \Atlex\AtlexCloud $remoteCloud */ $remoteCloud = self::getCloud(); $remoteCloud->deleteObject(sanitize_text_field($_POST['path'])); echo json_encode( array( 'success' => true, ) ); wp_die(); }catch(Exception $e){ echo json_encode( array( 'error' => $e->getMessage() ) ); wp_die(); } } public static function ajaxArchiveRestore() { if(!isset($_POST["nonce"]) || !wp_verify_nonce($_POST["nonce"], 'atlex_nonce')) wp_die('permission denied'); include_once __DIR__. DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php'; global $wpdb; try{ $upload = wp_upload_dir(); $upload_dir = $upload['basedir']; $upload_dir = $upload_dir . DIRECTORY_SEPARATOR . 'atlexbackup'; if ( ! wp_mkdir_p( $upload_dir ) ){ echo "Не удалось создать каталог"; } if(!file_exists($upload_dir . "/.htaccess")) { $f = fopen($upload_dir . "/.htaccess", "w+"); fwrite($f, "RewriteEngine On\n\nDeny from all\n"); fclose($f); } /** @var \Atlex\AtlexCloud $remoteCloud */ $remoteCloud = self::getCloud(); $tempFile = $upload_dir . DIRECTORY_SEPARATOR . "sqltmp.gz"; $file = fopen($tempFile, "w+"); $remoteCloud->getObject(sanitize_text_field($_POST['path']), $file); $import = new \MySQLImport($wpdb->dbh); $import->load($tempFile); unlink($tempFile); echo json_encode( array( 'success' => true, ) ); wp_die(); }catch(Exception $e){ echo json_encode( array( 'error' => $e->getMessage() ) ); wp_die(); } } public static function ajaxDirUpload() { error_reporting(E_ALL); ini_set('display_errors', 1); if(!isset($_POST["nonce"]) || !wp_verify_nonce($_POST["nonce"], 'atlex_nonce')) wp_die('permission denied'); $upload = wp_upload_dir(); $upload_dir = $upload['basedir']; $upload_dir = $upload_dir . DIRECTORY_SEPARATOR . 'atlexbackup'; include_once __DIR__. DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php'; try{ if ( ! wp_mkdir_p( $upload_dir ) ){ echo "create directory error"; } if(!file_exists($upload_dir . "/.htaccess")) { $f = fopen($upload_dir . "/.htaccess", "w+"); fwrite($f, "RewriteEngine On\n\nDeny from all\n"); fclose($f); } $tempName = $upload_dir . "/tempdir.zip"; self::zipData(sanitize_text_field($_POST['path']), $tempName); /** @var \Atlex\AtlexCloud $remoteCloud */ $remoteCloud = self::getCloud(); if( is_file($tempName) && is_readable($tempName) ) { $settings = self::getSettings(); $remoteCloud->setObject($settings['container'] . "/wordpress/".sanitize_text_field($_POST['object_name']).'.zip', fopen($tempName, "r")); } unlink($tempName); echo json_encode( array( 'success' => true, 'name' => sanitize_text_field($_POST['object_name']) ) ); wp_die(); }catch(Exception $e){ echo json_encode( array( 'error' => $e->getMessage() ) ); wp_die(); } } public static function ajaxLoadDirs() { if(!isset($_POST["nonce"]) || !wp_verify_nonce($_POST["nonce"], 'atlex_nonce')) wp_die('permission denied'); include_once __DIR__. DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php'; try { /** @var \Atlex\AtlexCloud $remoteCloud */ $remoteCloud = self::getCloud(); $settings = self::getSettings(); $containers = $remoteCloud->get($settings['container'] . "/wordpress"); $data = []; /** @var \Atlex\Cloud\CloudObject $containerObject */ foreach ($containers as $containerObject) { if ($containerObject->getType() == \Atlex\Cloud\CloudObjectType::OBJECT) { $data[] = [ 'name' => $containerObject->getName(), 'path' => $containerObject->getPath(), ]; } } usort($data, function ($a, $b) { return $a['name'] > $b['name']; }); echo json_encode( array( 'success' => true, 'archives' => $data, ) ); wp_die(); }catch(Exception $e){ echo json_encode( array( 'error' => $e->getMessage() ) ); wp_die(); } } public static function ajaxDirDelete() { if(!isset($_POST["nonce"]) || !wp_verify_nonce($_POST["nonce"], 'atlex_nonce')) wp_die('permission denied'); include_once __DIR__. DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php'; try { /** @var \Atlex\AtlexCloud $remoteCloud */ $remoteCloud = self::getCloud(); $remoteCloud->deleteObject(sanitize_text_field($_POST['path'])); echo json_encode( array( 'success' => true, ) ); wp_die(); }catch(Exception $e){ echo json_encode( array( 'error' => $e->getMessage() ) ); wp_die(); } } public static function ajaxDirDownload() { if(!isset($_POST["nonce"]) || !wp_verify_nonce($_POST["nonce"], 'atlex_nonce')) wp_die('permission denied'); include_once __DIR__. DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php'; try { $upload = wp_upload_dir(); $upload_dir = $upload['basedir']; $upload_dir = $upload_dir . DIRECTORY_SEPARATOR . 'atlexbackup'; if (!wp_mkdir_p($upload_dir)) { echo "create directory error"; } /** @var \Atlex\AtlexCloud $remoteCloud */ $remoteCloud = self::getCloud(); $name = basename(sanitize_text_field($_POST['path'])); $tempFile = $upload_dir . DIRECTORY_SEPARATOR . $name; $file = fopen($tempFile, "w+"); $remoteCloud->getObject(sanitize_text_field($_POST['path']), $file); echo json_encode( array( 'success' => true, ) ); wp_die(); }catch(Exception $e){ echo json_encode( array( 'error' => $e->getMessage() ) ); wp_die(); } } public static function ajaxMediafilesUpload() { error_reporting(E_ALL); ini_set('display_errors', 1); session_write_close(); if(!isset($_POST["nonce"]) || !wp_verify_nonce($_POST["nonce"], 'atlex_nonce')) wp_die('permission denied'); $settings = self::getSettings(); $settings['cdn_status'] = 'syncprocess'; update_option('atlex_cloud_configuration', serialize($settings)); $upload = wp_upload_dir(); $upload_dir = $upload['basedir']; try{ include_once __DIR__ . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php'; /** @var \Atlex\AtlexCloud $remoteCloud */ $remoteCloud = self::getCloud(); $query_media_args = array( 'post_type' => 'attachment', 'post_status' => 'inherit', 'posts_per_page' => -1, ); $query_objects = new WP_Query($query_media_args); $parentDirs = array(); $siteUrl = wp_upload_dir()['baseurl'] . DIRECTORY_SEPARATOR; foreach ($query_objects->posts as $object) { $name = str_replace($siteUrl, '', wp_get_attachment_url($object->ID)); $parts = @explode('/', $name); if(is_array($parts)){ if(@$parts[0] != ''){ if(!in_array($parts[0], $parentDirs)){ $parentDirs[] = $parts[0]; $dir = $parts[0]; $remoteCloud->deleteContainer('public/' . $dir); $remoteCloud->upload($upload_dir . DIRECTORY_SEPARATOR . $dir, 'public/' . $dir); } } } } $settings = self::getSettings(); $settings['cdn_status'] = 'synchronized'; update_option('atlex_cloud_configuration', serialize($settings)); echo json_encode( array( 'success' => true, ) ); wp_die(); } catch (Exception $e) { echo json_encode( array( 'error' => $e->getMessage() ) ); wp_die(); } } public static function ajaxSyncStatus() { error_reporting(E_ALL); ini_set('display_errors', 1); if(!isset($_POST["nonce"]) || !wp_verify_nonce($_POST["nonce"], 'atlex_nonce')) wp_die('permission denied'); return self::getSettings()['cdn_status']; } public static function settingsGeneralMenu(){ load_textdomain( 'default', ATLEX_LANG_FILE ); add_settings_field( 'atlex_setting-menu', __('ATLEX cloud settings'), array('ADMATLCLD\AtlexCloudPlugin', 'printSettingsMenu'), 'general', 'default', array( 'label_for' => 'atlex_setting-menu' ) ); } public static function uninstallPlugin(){ delete_option( 'atlex_cloud_configuration' ); } }