recursive_sanitize_text_field( wp_unslash( $_POST['wp_db_exclude_table'] ) ); // phpcs:ignore update_option( 'wp_db_exclude_table', $this->filter_valid_exclude_tables( $exclude_tables ), false ); } else { update_option( 'wp_db_exclude_table', '', false ); } $nonce = wp_create_nonce( 'wp-database-backup' ); wp_safe_redirect( site_url() . '/wp-admin/admin.php?page=wp-database-backup¬ification=save&_wpnonce=' . $nonce ); } if ( true === isset( $_POST['wp_db_local_backup_path'] ) ) { update_option( 'wp_db_local_backup_path', wpdbbkp_filter_data( sanitize_text_field( wp_unslash( $_POST['wp_db_local_backup_path'] ) ) ) ); } if ( isset( $_POST['wp_db_backup_email_id'] ) ) { update_option( 'wp_db_backup_email_id', wpdbbkp_filter_data( sanitize_email( wp_unslash( $_POST['wp_db_backup_email_id'] ) ) ) , false); } if ( isset( $_POST['wp_db_backup_email_attachment'] ) ) { $email_attachment = sanitize_text_field( wp_unslash( $_POST['wp_db_backup_email_attachment'] ) , false); update_option( 'wp_db_backup_email_attachment', $email_attachment ); } if ( isset( $_POST['local_backup_submit'] ) && 'Save Settings' === $_POST['local_backup_submit'] ) { if ( true === isset( $_POST['wp_db_local_backup'] ) ) { update_option( 'wp_db_local_backup', 1 , false); } else { update_option( 'wp_db_local_backup', 0 , false); } } if ( isset( $_POST['wp_db_backup_options'] ) ) { $option_to_save = []; if ( isset( $_POST['wp_db_backup_options']['enable_autobackups'] ) ) { $option_to_save['enable_autobackups'] = sanitize_text_field( wp_unslash( $_POST['wp_db_backup_options']['enable_autobackups'] ) ); } if ( isset( $_POST['wp_db_backup_options']['autobackup_type'] ) ) { $option_to_save['autobackup_type'] = sanitize_text_field( wp_unslash( $_POST['wp_db_backup_options']['autobackup_type'] ) ); } if ( isset( $_POST['wp_db_backup_options']['autobackup_frequency'] ) ) { $option_to_save['autobackup_frequency'] = sanitize_text_field( wp_unslash( $_POST['wp_db_backup_options']['autobackup_frequency'] ) ); } if ( isset( $_POST['wp_db_backup_options']['autobackup_full_days'] ) ) { $option_to_save['autobackup_full_days'] = sanitize_text_field( wp_unslash( $_POST['wp_db_backup_options']['autobackup_full_days'] ) ); } if ( isset( $_POST['wp_db_backup_options']['autobackup_full_time'] ) ) { $option_to_save['autobackup_full_time'] = sanitize_text_field( wp_unslash( $_POST['wp_db_backup_options']['autobackup_full_time'] ) ); } if ( isset( $_POST['wp_db_backup_options']['autobackup_full_date'] ) ) { $option_to_save['autobackup_full_date'] = sanitize_text_field( wp_unslash( $_POST['wp_db_backup_options']['autobackup_full_date'] ) ); } if(!empty($option_to_save)) { if(update_option( 'wp_db_backup_options', $option_to_save, false)){ wp_clear_scheduled_hook( 'wpdbbkp_db_backup_event' ); wp_clear_scheduled_hook( 'wpdbkup_event_fullbackup' ); } } } if ( isset( $_POST['featureSubmit'] ) && 'Save Settings' === $_POST['featureSubmit'] ) { if ( isset( $_POST['enable_anonymization'] ) ) { update_option( 'bkpforwp_enable_anonymization', 1 ); } else { update_option( 'bkpforwp_enable_anonymization', 0 ); } if ( isset( $_POST['enable_backup_encryption'] ) ) { update_option( 'bkpforwp_enable_backup_encryption', 1 ); } else { update_option( 'bkpforwp_enable_backup_encryption', 0 ); } if ( isset( $_POST['enable_exact_backup_time'] ) ) { update_option( 'bkpforwp_enable_exact_backup_time', 1 ); } else { update_option( 'bkpforwp_enable_exact_backup_time', 0 ); } if ( isset( $_POST['anonymization_type'] ) ) { update_option( 'bkpforwp_anonymization_type', wpdbbkp_filter_data( sanitize_text_field( wp_unslash( $_POST['anonymization_type'] ) ) ) ); } if ( isset( $_POST['anonymization_pass'] )) { update_option( 'bkpforwp_anonymization_pass', wpdbbkp_filter_data( sanitize_text_field( wp_unslash($_POST['anonymization_pass'] ) ) ) ); } if ( isset( $_POST['backup_encryption_pass'] )) { update_option( 'bkpforwp_backup_encryption_pass', wpdbbkp_filter_data( sanitize_text_field( wp_unslash($_POST['backup_encryption_pass'] ) ) ) ); } } } $wp_db_backup_destination_email = get_option( 'wp_db_backup_destination_Email' , false); if ( isset( $_GET['page'] ) && 'wp-database-backup' === $_GET['page'] && isset( $_GET['action'] ) && 'unlink' === $_GET['action'] ) { // Specify the target directory and add forward slash. $dir = plugin_dir_path( __FILE__ ) . 'Destination/Dropbox/tokens/'; // Open the directory. $dir_handle = opendir( $dir ); // Loop over all of the files in the folder. $file = readdir( $dir_handle ); while ( $file ) { // If $file is NOT a directory remove it. if ( ! is_dir( $file ) ) { wp_delete_file( $dir . $file ); } } // Close the directory. closedir( $dir_handle ); wp_safe_redirect( site_url() . '/wp-admin/admin.php?page=wp-database-backup' ); } $nonce = isset( $_REQUEST['_wpnonce'] ) ? sanitize_text_field( wp_unslash( $_REQUEST['_wpnonce'] ) ) : ''; if ( isset( $_REQUEST['_wpnonce'] ) && wp_verify_nonce( $nonce, 'wp-database-backup' ) ) { if ( isset( $_GET['action'] ) && current_user_can( 'manage_options' ) ) { switch ( (string) $_GET['action'] ) { case 'createdbbackup': $this->wp_db_backup_event_process(); wp_safe_redirect( site_url() . '/wp-admin/admin.php?page=wp-database-backup¬ification=create&_wpnonce=' . $nonce ); break; case 'removebackup': if ( true === isset( $_GET['index'] ) ) { $index = (int) $_GET['index']; $options = get_option( 'wp_db_backup_backups' ); $newoptions = array(); $count = 0; if(!empty($options) && is_array($options)){ foreach ( $options as $option ) { if ( $count !== $index ) { $newoptions[] = $option; } $count++; } } $upload_dir = wp_upload_dir(); $actual_working_directory = getcwd(); $file_directory = $upload_dir['basedir'].'/db-backup/'; /* Fix for when you try to delete a file thats in a folder higher in the hierarchy to your working directory */ chdir($file_directory); if ( isset($options[ $index ]['filename']) && file_exists( $options[ $index ]['filename'] ) ) { wp_delete_file( $options[ $index ]['filename'] ); } if(isset($options[ $index ]['filename'])){ $file_sql = explode( '.', $options[ $index ]['filename'] ); if ( isset($file_sql[0]) && file_exists( $file_sql[0] . '.sql' ) ) { wp_delete_file( $file_sql[0] . '.sql' ); } } chdir($actual_working_directory); $newoptions = wpdbbkp_filter_unique_filenames( $newoptions ); update_option( 'wp_db_backup_backups', $newoptions , false); $nonce = wp_create_nonce( 'wp-database-backup' ); wp_safe_redirect( site_url() . '/wp-admin/admin.php?page=wp-database-backup¬ification=delete&_wpnonce=' . $nonce ); exit; } break; case 'removeallbackup': $upload_dir = wp_upload_dir(); $actual_working_directory = getcwd(); $file_directory = $upload_dir['basedir']; global $wpdb; /* Fix for when you try to delete a file thats in a folder higher in the hierarchy to your working directory */ chdir($file_directory); $files = glob($file_directory.'/db-backup'.'/*'); // Deleting all the files in the list if(!empty($files)){ foreach($files as $file) { if(is_file($file)){ wp_delete_file($file); } } } chdir($actual_working_directory); update_option( 'wp_db_backup_backups', array() , false); $nonce = wp_create_nonce( 'wp-database-backup' ); $table_name = $wpdb->prefix . 'wpdbbkp_processed_files'; $wpdb->query( "TRUNCATE TABLE $table_name" ); // phpcs:ignore wp_safe_redirect( site_url() . '/wp-admin/admin.php?page=wp-database-backup¬ification=deleteall&_wpnonce=' . $nonce ); exit; break; case 'clear_temp_db_backup_file': $options = get_option( 'wp_db_backup_backups' ); $newoptions = array(); $backup_check_list = array( '.htaccess', 'index.php' ); $delete_message = 'WPDB : Deleted Files:'; if(!empty($options) && is_array($options)){ foreach ( $options as $option ) { if(!is_array($option)){ continue; } $backup_check_list[] = $option['filename']; } } $path_info = wp_upload_dir(); $wp_db_backup_path = $path_info['basedir'] . '/db-backup'; // Open a directory, and read its contents. if ( is_dir( $wp_db_backup_path ) ) { $dh = opendir( $wp_db_backup_path ); if ( $dh ) { while ( false !== ($file = readdir( $dh )) ) { if ( ! ( in_array( $file, $backup_check_list, true ) ) ) { if ( file_exists( $wp_db_backup_path . '/' . $file ) ) { wp_delete_file( $wp_db_backup_path . '/' . $file ); } $delete_message .= ' ' . $file; } } closedir( $dh ); } } wp_safe_redirect( site_url() . '/wp-admin/admin.php?page=wp-database-backup¬ification=clear_temp_db_backup_file&_wpnonce=' . $nonce ); exit; break; case 'restorebackup': $index = isset($_GET['index'])?(int) $_GET['index']:0; $options = get_option( 'wp_db_backup_backups' ); $restore_limit = get_option( 'wp_db_restore_limit'); $newoptions = array(); $count = 0; if(!empty($options) && is_array($options)){ foreach ( $options as $option ) { if ( $count !== $index ) { $newoptions[] = $option; } $count++; } } if ( isset( $options[ $index ]['restore_limit'] ) && $options[ $index ]['restore_limit']==1) { include_once ABSPATH . 'wp-admin/includes/plugin.php'; if ( !is_plugin_active( 'wp-database-backup-pro/wp-database-backup-pro.php' ) ) { wp_safe_redirect( site_url() . '/wp-admin/admin.php?page=wp-database-backup¬ification=restore_limit&_wpnonce=' . $nonce ); } } if(!empty($options[ $index ]['restore_limit'])){ $options[ $index ]['restore_limit']=1; } if ( isset( $options[ $index ]['sqlfile'] ) ) { // Added for extract zip file V.3.3.0. $database_file = ( $options[ $index ]['sqlfile'] ); } else { $database_file = isset($options[ $index ]['dir']) ? $options[ $index ]['dir'] : ''; $file_sql = explode( '.', $database_file ); if(isset($file_sql[0])){ $database_file = ( $file_sql[0] . '.sql' ); } } $database_name = $this->wp_backup_get_config_db_name(); $database_user = $this->wp_backup_get_config_data( 'DB_USER' ); $datadase_password = $this->wp_backup_get_config_data( 'DB_PASSWORD' ); $database_host = $this->wp_backup_get_config_data( 'DB_HOST' ); $path_info = wp_upload_dir(); // Added for extract zip file V.3.3.0. $ext_path_info = $path_info['basedir'] . '/db-backup'; $database_zip_file = $options[ $index ]['dir']; if ( class_exists( 'ZipArchive' ) ) { $zip = new ZipArchive(); if ( $zip->open( $database_zip_file ) === true ) { $zip->extractTo( $ext_path_info ); $zip->close(); } } else { require_once ABSPATH . 'wp-admin/includes/class-pclzip.php'; $archive = new PclZip( $database_zip_file ); $dir = $path_info['basedir'] . '/db-backup/'; if ( ! $archive->extract( PCLZIP_OPT_PATH, $dir ) ) { wp_die( esc_html__('Unable to extract zip file. Please check that zlib php extension is enabled.','wpdbbkp').'', esc_html__('ZIP Error','wpdbbkp') ); } } // End for extract zip file V.3.3.0. set_time_limit( 0 ); // phpcs:ignore -- needed for long running process ignore_user_abort(true); if ('' !== trim($database_name) && '' !== trim($database_user) && '' !== trim($database_host)) { // Ensure we use WP's global DB connection. global $wpdb; if ( ! isset( $wpdb ) || ! is_object( $wpdb ) ) { $wpdb = isset( $GLOBALS['wpdb'] ) ? $GLOBALS['wpdb'] : null; } if ( ! is_object( $wpdb ) ) { wp_die( esc_html__( 'Database connection is not available. Please reload the page and try again.', 'wpdbbkp' ), esc_html__( 'Database Error', 'wpdbbkp' ) ); } $wpdb->db_connect(); $wpdb->select($database_name); //phpcs:ignore -- Check if database exists $db_exists = $wpdb->get_var($wpdb->prepare( "SELECT SCHEMA_NAME FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = %s", $database_name )); if (!$db_exists) { //phpcs:ignore -- Create DB if it doesn't exist $wpdb->query( 'CREATE DATABASE IF NOT EXISTS `' . esc_sql( $database_name ) . '`' ); $wpdb->select($database_name); } //phpcs:ignore -- Show tables from database $tables = $wpdb->get_col( 'SHOW TABLES FROM `' . esc_sql( $database_name ) . '`' ); if (!empty($tables)) { foreach ($tables as $table_name) { //phpcs:ignore -- delete tables before restore $wpdb->query( 'DROP TABLE IF EXISTS `' . esc_sql( $table_name ) . '`' ); } } // Restore database content if (file_exists($database_file)) { if ( ! function_exists( 'WP_Filesystem' ) ) { require_once ABSPATH . '/wp-admin/includes/file.php'; } WP_Filesystem(); if ( $wp_filesystem ) { $sql_file = $wp_filesystem->get_contents( $database_file ); if ( $sql_file !== false ) { $sql_queries = explode(";\n", $sql_file); //phpcs:ignore -- Set sql_mode to empty $wpdb->query("SET sql_mode = ''"); foreach ($sql_queries as $query) { $query = apply_filters('wpdbbkp_sql_query_restore', $query); if (!empty(trim($query))) { /* Since $query is a dynqmic sql query from the backup file, we can't use $wpdb->prepare * as we don't know the number / types of arguments in the query. So, we are using $wpdb->query * directly to execute the query.*/ //phpcs:ignore $wpdb->query($query); } } } } } } if ( isset( $options[ $index ]['sqlfile'] ) && file_exists( $options[ $index ]['sqlfile'] ) ) { // Added for extract zip file V.3.3.0. if ( file_exists( $options[ $index ]['sqlfile'] ) ) { wp_delete_file( $options[ $index ]['sqlfile'] ); } } else { $database_file = isset($options[ $index ]['dir'] )?$options[ $index ]['dir']:''; if(!empty($database_file)){ $file_sql = explode( '.', $database_file ); if(isset($file_sql[0])){ $database_file = ( $file_sql[0] . '.sql' ); if ( file_exists( $database_file ) ) { wp_delete_file( $database_file ); } } } } wp_safe_redirect( site_url() . '/wp-admin/admin.php?page=wp-database-backup¬ification=restore&_wpnonce=' . $nonce ); exit; break; case 'wpdbbkrestorefullbackup': $index = (int) $_GET['index']; require_once( 'class-wpdbbkp-restore.php' ); $restore = new Wpdbbkp_Restore(); $restore->start($index); if (get_option('wp_db_log') == 1) { $options = get_option('wp_db_backup_backups'); $path_info = wp_upload_dir(); if(isset($options[$index]['filename'])){ $logFileName = explode(".", $options[$index]['filename']); if(isset($logFileName[0])){ $logfile = $path_info['basedir'] . '/' . WPDB_BACKUPS_DIR . '/log/' . $logFileName[0] . '.txt'; $message = "\n\n Restore Backup at " . gmdate("Y-m-d h:i:sa"); $this->write_log($logfile, $message); } } } $nonce = wp_create_nonce( 'wp-database-backup' ); wp_safe_redirect( site_url() . '/wp-admin/admin.php?page=wp-database-backup¬ification=restore&_wpnonce=' . $nonce ); exit; break; /* END: Restore Database Content */ } } } } } if ( is_admin() && current_user_can( 'manage_options' ) ) { register_setting( 'wp_db_backup_options', 'wp_db_backup_options', array( $this, 'wp_db_backup_validate' ) ); add_settings_section( 'wp_db_backup_main', 'WP-Database-Backup', array( $this, 'wp_db_backup_section_text' ), 'manage_options' ); } } /** * Validate data. * * @param string $input - Input data. */ public function wp_db_backup_validate( $input ) { return $input; } /** * Setting page. */ public function wp_db_backup_settings_page() { global $wp_filesystem; if(!function_exists('WP_Filesystem')){ require_once ( ABSPATH . '/wp-admin/includes/file.php' ); } include_once( ABSPATH . 'wp-admin/includes/plugin.php' ); WP_Filesystem(); $wp_db_is_pro = false; if ( is_plugin_active( 'wp-database-backup-premium/wp-database-backup-premium.php' ) ) { $wp_db_is_pro = true; } $options = get_option( 'wp_db_backup_backups' ); $options = wpdbbkp_filter_unique_filenames( $options ); $settings = get_option( 'wp_db_backup_options' ); $wp_db_log = get_option( 'wp_db_log' ); $incremental_backup = get_option( 'wp_db_incremental_backup' ,false); ?>
'; esc_html_e( 'Invalid Local Backup Path : ', 'wpdbbkp' ); echo esc_html( $wp_db_local_backup_path ); echo '
'; } $upload_dir = wp_upload_dir(); $dir = $upload_dir['basedir'] . '/db-backup'; if ( ! is_dir( $dir ) ) { $dir = $upload_dir['basedir']; } if ( is_dir( $dir ) && !$wp_filesystem->is_writable( $dir )) { ?>
'; echo '
'; $nonce = wp_create_nonce( 'wp-database-backup' ); $wp_db_backup_search_text = get_option( 'wp_db_backup_search_text' ); $wp_db_backup_replace_text = get_option( 'wp_db_backup_replace_text' ); if ( ( false === empty( $wp_db_backup_search_text ) ) && ( false === empty( $wp_db_backup_replace_text ) ) ) { echo ' '.esc_html__('Create Database Backup with Search/Replace', 'wpdbbkp').''; echo '

Backup file will replace ' . esc_attr( $wp_db_backup_search_text ) . ' text with ' . esc_attr( $wp_db_backup_replace_text ) . '. For Regular Database Backup without replace then Go to Dashboard=>Tool=>WP-DB Backup > Settings > '.esc_html__('Search and Replace - Set Blank Fields', 'wpdbbkp').'

'; } else { echo ' '.esc_html__('Create Database Backup', 'wpdbbkp').''; echo ' '.esc_html__('Create Full Backup', 'wpdbbkp').''; echo ''; } include_once 'admin-header-notification.php'; ?> var $j = jQuery.noConflict(); $j(document).ready(function () { var table = $j("#wpdbbkp_table").DataTable({ order: [[0, "desc"]], }); $j(".popoverid").popover(); }); function excludetableall(){ var checkboxes = document.getElementsByClassName("wp_db_exclude_table"); var checked = ""; if($j("#wp_db_exclude_table_all").prop("checked") == true){ checked = "checked"; } $j(".wp_db_exclude_table").each(function() { this.checked = checked; }); } '; echo '
'; echo ''; echo ''; echo ''; if($wp_db_log==1){ echo ''; } echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; $count = 1; $destination_icon = array( 'Local' => 'glyphicon glyphicon-home', 'Local Path' => 'glyphicon glyphicon-folder-open', 'Email' => 'glyphicon glyphicon-envelope', 'FTP' => 'glyphicon glyphicon-tasks', 'SFTP' => 'glyphicon glyphicon-tasks', 'S3' => 'glyphicon glyphicon-cloud-upload', 'Drive' => 'glyphicon glyphicon-hdd', 'DropBox' => 'glyphicon glyphicon-inbox', 'Backblaze' => 'glyphicon glyphicon-cloud-upload', 'CloudDrive' => 'glyphicon glyphicon-cloud-upload', 'GenericS3' => 'glyphicon glyphicon-cloud-upload' ); if(!empty($options) && is_array($options)){ foreach ( $options as $option ) { if (!is_array($option)) { continue; } $size = isset( $option['size'])? $option['size'] : 0; $str_class = ( 0 === (int) $size ) ? 'text-danger' : 'wpdb_download'; echo ''; echo ''; $curr_date = new DateTime(gmdate( 'Y-m-d H:i:s', $option['date'] )); $curr_date->setTimezone(new DateTimeZone(wp_timezone_string())); echo ''; if($wp_db_log==1){ echo ''; } echo ''; if(isset($option['type']) && !empty($option['type'])){ if($option['type'] == 'complete'){ echo ''; } if($option['type'] == 'database'){ echo ''; } }else{ echo ''; } echo ''; echo ''; $remove_backup_href = esc_url( site_url() ) . '/wp-admin/admin.php?page=wp-database-backup&action=removebackup&_wpnonce=' . esc_attr( $nonce ) . '&index=' . esc_attr( ( $count - 1 ) ); echo ''; $count++; } } echo ''; echo '
#DateLogDestinationTypeBackup FileSizeAction
' . esc_attr( $count ) . '' . esc_attr( $curr_date->format('Y-m-d H:i:s') ) . '' .esc_html($this->wpdbbkp_get_timeago($option['date'])).''; echo ''; if (!empty($option['log'])) { if(isset($option['type']) && ($option['type'] == 'complete' || $option['type'] == 'database')){ echo ''; echo ''; echo ''; }else{ echo ''; } } echo ''; if ( ! empty( $option['destination'] ) ) { $destination = ( explode( ',', $option['destination'] ) ); if ( ! empty( $destination ) && is_array( $destination ) ) { foreach ( $destination as $dest ) { $key = trim( $dest ); if ( empty( $key ) ) { continue; } // Icon if ( array_key_exists( $key, $destination_icon ) ) { echo ' '; } // Do not add any text label; icon-only for all destinations } } } echo ''.esc_html__('Full Backup', 'wpdbbkp').''.esc_html__('Database', 'wpdbbkp').'Database'; echo ''; echo ' Download' . esc_attr( $this->wp_db_backup_format_bytes( $option['size'] ) ) . ' Remove '; if ( isset( $option['search_replace'] ) && 1 === (int) $option['search_replace'] ) { echo ''; } else { $restore_url_href = esc_url( site_url() ) . '/wp-admin/admin.php?page=wp-database-backup&action=restorebackup&_wpnonce=' . esc_attr( $nonce ) . '&index=' . esc_attr( ( $count - 1 ) ); if(isset($option['type']) && !empty($option['type'])){ if($option['type'] == 'complete'){ $restore_url_href = esc_url( site_url() ) . '/wp-admin/admin.php?page=wp-database-backup&action=wpdbbkrestorefullbackup&_wpnonce=' . esc_attr( $nonce ) . '&index=' . esc_attr( ( $count - 1 ) ); } } echo ' Restore '; } echo '
'; } else { echo '

'. esc_html__('No Database Backups Created!','wpdbbkp').'

'; } ?>

rating .

'; echo '
'; echo '
'; echo '
'; wp_nonce_field( 'wp-database-backup' ); $enable_autobackups = '0'; if ( isset( $settings['enable_autobackups'] ) ) { $enable_autobackups = $settings['enable_autobackups']; } $autobackup_frequency = '0'; if ( isset( $settings['autobackup_frequency'] ) ) { $autobackup_frequency = $settings['autobackup_frequency']; } $full_autobackup_frequency = 'disabled'; if ( isset( $settings['full_autobackup_frequency'] ) ) { $full_autobackup_frequency = $settings['full_autobackup_frequency']; } $autobackup_type = ''; if ( isset( $settings['autobackup_type'] ) ) { $autobackup_type = $settings['autobackup_type']; } echo '
'; echo '
'; echo ''; echo '
'; echo '
'; echo ''; echo ''; echo ''; echo ''; echo ''; do_action('wpdbbkp_database_backup_options'); echo '

'; echo ''; echo '

'; echo '
'; echo '
'; echo '
'; do_action('wpdbbkp_pro_tab_content'); ?>

'.esc_html__('Status', 'wpdbbkp').': '.esc_html__('Not Configured', 'wpdbbkp').' '; if($wpdb_clouddrive_token && !empty($wpdb_clouddrive_token)) { $wpdbbkp_bb_s3_status =''.esc_html__('Status', 'wpdbbkp').': '.esc_html__('Configured', 'wpdbbkp').' '; } ?>

'.esc_html( $update_msg ).'

'; } ?>

'.esc_html__('Getting started with our Cloud Backup service is simple.', 'wpdbbkp').''; ?>

 

">

' . __('Click here to Download', 'wpdbbkp') . ''; } } update_option('wpdbbkp_export_notify',false); esc_html_e('Export Completed. ', 'wpdbbkp'); } ?>

.

Upgrade for Unlimited Storage

Compare Pro vs. Free Version

See what you'll get with the professional version

FREE

Continuous Development

We take bug reports and feature requests seriously. We're continuously developing & improving this product for the last 2 years with passion and love.

50+ Features

We're constantly expanding the plugin and make it more useful. We have wide variety of features which will fit any use-case.

Technical Support

We have a full time team which helps you with each and every issue regarding Backup for WP.

PRO

Everything in Free, and:

Unlimited Backup*

Unlimited Storage for your websites

Secure and reliable

We follow industry-best practices to safeguard against unauthorized access, corruption, and loss

High availability

Our system is built on a globally distributed cloud infrastructure with 99% uptime

Dedicated Support

With a Dedicated person helping you with the extension setup and questions.

Continious Updates

We're continiously updating our premium features and releasing them.

Innovation

Be the first one to get the innovative features that we build in the future.

Frequently Asked Questions

  • Is there a setup fee?

    No. There are no setup fees on any of our plans

  • What's the time span for your contracts?

    All the plans are year-to-year which are subscribed annually.

  • What payment methods are accepted?

    We accepts PayPal and Credit Card payments.

  • Do you offer support if I need help?

    Yes! Top-notch customer support for our paid customers is key for a quality product, so we’ll do our very best to resolve any issues you encounter via our support page.

  • Can I use the plugins after my subscription is expired?

    Yes, you can use the plugins but you will not get future updates for those plugins.

  • Can I cancel my membership at any time?

    Yes. You can cancel your membership by contacting us.

  • Can I change my plan later on?

    Yes. You can upgrade or downgrade your plan by contacting us.

  • Do you offer refunds?

    You are fully protected by our 100% Money Back Guarantee Unconditional. If during the next 14 days you experience an issue that makes the plugin unusable and we are unable to resolve it, we’ll happily offer a full refund.

  • Do I get updates for the premium plugin?

    Yes, you will get updates for all the premium plugins until your subscription is active.

I have other pre-sale questions, can you help?

All the plans are year-to-year which are subscribed annually.

Contact a Human
0){ $dp = sprintf( '%.2f', ( $du / $dt ) * 100 ); } $dp = isset( $dp )? $dp : 'NA'; /* and we formate the size from bytes to MB, GB, etc. */ $df = $this->wp_db_backup_format_bytes( $df ); $du = $this->wp_db_backup_format_bytes( $du ); $dt = $this->wp_db_backup_format_bytes( $dt ); } ?>
Disk Space
%


is_writable( $upload_dir['basedir']) ) ? '

Not writable

' : '

writable

'; ?>
)
Low

' : ''; ?>
is_writable( $upload_dir['basedir'] . '/db-backup' ) ) ? '

Not writable

' : '

writable

'; ?>
' : '

No

'; ?>
get_mysqldump_command_path() ) ? 'Yes

' : '

No

'; ?>
get_var( 'SELECT VERSION() AS version' ); // phpcs:ignore wp_cache_set( 'wpdb_mysqlversion', $mysqlversion, '', 18000 ); } ?>
v
get_results( 'SHOW TABLE STATUS' ); // phpcs:ignore if($tablesstatus != null && !empty($tablesstatus)){ foreach ( $tablesstatus as $tablestatus ) { $tablestatus_arr = (array) $tablestatus; if ( 0 === ( $no % 2 ) ) { $style = ''; } else { $style = ' class="alternate"'; } $no++; echo ''; echo ''; echo ''; echo ''; $row_usage += $tablestatus_arr['Rows']; echo ''; } } echo ''; echo ''; echo ''; echo ''; echo ''; ?>
' . esc_attr( number_format_i18n( $no ) ) . '' . esc_attr( $tablestatus_arr['Name'] ) . '' . esc_attr( number_format_i18n( isset($tablestatus_arr['Rows'])?$tablestatus_arr['Rows']:0 ) ) . '
Total:' . esc_attr( number_format_i18n( $no ) ) . ' Table ' . esc_attr( number_format_i18n( $row_usage ) ) . ' Records
'; } } ?>
' . esc_attr( $plugin['Name'] ) . ' ' . esc_attr( $plugin['Version'] ) . '
'; ?>
' . esc_attr( $my_theme->get( 'Name' ) ) . ' ' . esc_attr( $my_theme->get( 'Version' ) ) . '










get_results( 'SHOW TABLE STATUS' ); // phpcs:ignore if($tablesstatus != null && !empty($tablesstatus)){ foreach ( $tablesstatus as $tablestatus ) { $tablestatus_arr = (array) $tablestatus; if ( 0 === ( $no % 2 ) ) { $style = ''; } else { $style = ' class="alternate"'; } $no++; echo ''; echo ''; echo ''; echo ''; if ( false === empty( $wp_db_exclude_table ) && in_array( $tablestatus_arr['Name'], $wp_db_exclude_table, true ) ) { $checked = 'checked'; } else { $checked = ''; } echo ''; $row_usage += $tablestatus_arr['Rows']; echo ''; } } echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; ?>
' . esc_attr( number_format_i18n( $no ) ) . '' . esc_attr( $tablestatus_arr['Name'] ) . '' . esc_attr( number_format_i18n( isset($tablestatus_arr['Rows'])?$tablestatus_arr['Rows']:0 ) ) . '
Total:' . esc_attr( number_format_i18n( $no ) ) . ' Table' . esc_attr( number_format_i18n( $row_usage ) ) . ' Records



Tool=>WP-DB Backup > Setting > Exclude Table From Database Backup setting. The tables you selected will be skipped over for each backup you make.', 'wpdbbkp') ?>



get_col( 'SHOW TABLES' ); // phpcs:ignore $output = ''; if(!empty($tables) && !is_array($tables)){ foreach ( $tables as $table ) { if ( empty( $wp_db_exclude_table ) || ( ! ( in_array( $table, $wp_db_exclude_table, true ) ) ) ) { $check_count = $wpdb->get_var( "SELECT count(*) FROM {$table}"); // phpcs:ignore $check_count = intval($check_count); $sub_limit =500; if(isset($check_count) && $check_count>$sub_limit){ $result =array(); $t_sub_queries= ceil($check_count/$sub_limit); for($sub_i=0;$sub_i<$t_sub_queries;$sub_i++) { $sub_offset = $sub_i*$sub_limit; $sub_result = false; if ( false === $sub_result ) { // phpcs:ignore -- using direct query to get the data of table in chunks. $sub_result = $wpdb->get_results( $wpdb->prepare("SELECT * FROM {$table} LIMIT %d OFFSET %d",array($sub_limit,$sub_offset)), ARRAY_A ); } if($sub_result){ $result = array_merge($result,$sub_result); } sleep(1); } } else{ $result = $wpdb->get_results( $wpdb->prepare("SELECT * FROM {$table}"), ARRAY_A ); // phpcs:ignore } $row2 = $wpdb->get_row( 'SHOW CREATE TABLE ' . $table, ARRAY_N ); // phpcs:ignore $output .= "\n\n" . $row2[1] . ";\n\n"; $result_count = count( $result ); for ( $i = 0; $i < $result_count; $i++ ) { if(isset($result[ $i ])){ $row = $result[ $i ]; $output .= 'INSERT INTO ' . $table . ' VALUES('; $result_o_index = count( $result[0] ); $j=0; foreach ($row as $key => $value) { $row[ $key] = $wpdb->_real_escape( apply_filters( 'wpdbbkp_process_db_fields', $row[$key],$table,$key) ); $output .= ( isset( $row[ $key ] ) ) ? '"' . $row[ $key ] . '"' : '""'; if ( $j < ( $result_o_index - 1 ) ) { $output .= ','; } $j++; } $output .= ");\n"; } } $output .= "\n"; } sleep(1); } } $wpdb->flush(); /* BEGIN : Prevent saving backup plugin settings in the database dump */ $options_backup = wpdbbkp_filter_unique_filenames( $options_backup ); add_option( 'wp_db_backup_backups', $options_backup ); add_option( 'wp_db_backup_options', $settings_backup ); /* END : Prevent saving backup plugin settings in the database dump */ return $output; } /** * Create database backup new function. */ public function wp_db_backup_create_mysql_backup_new( $table, $file_path ) { global $wpdb, $wp_filesystem; // Ensure WP Filesystem is loaded if ( ! function_exists( 'WP_Filesystem' ) ) { require_once ABSPATH . 'wp-admin/includes/file.php'; } WP_Filesystem(); // Define file size threshold (e.g., 10MB) $file_size_threshold = 10 * 1024 * 1024; // 10MB // Initialize the file with table creation statement if it doesn't exist $table = esc_sql( $table ); $row2 = $wpdb->get_row( "SHOW CREATE TABLE `{$table}`", ARRAY_N ); // phpcs:ignore $initial_output = "\n\n" . $row2[1] . ";\n\n"; $use_php_methods = false; if ( $wp_filesystem->exists( $file_path ) ) { // Check file size $file_size = $wp_filesystem->size( $file_path ); if ( $file_size !== false && $file_size > $file_size_threshold ) { $use_php_methods = true; } } // Function to append content $append_content = function( $new_content ) use ( $file_path, $wp_filesystem, $use_php_methods ) { if ( $use_php_methods ) { // Using PHP methods to append if ( ! $wp_filesystem->exists( $file_path ) ) { // phpcs:ignore -- WP Filesystem fileing for large files file_put_contents( $file_path, $new_content ); } else { // phpcs:ignore -- WP Filesystem fileing for large files file_put_contents( $file_path, $new_content, FILE_APPEND ); } } else { // Use WP Filesystem to append if ( ! $wp_filesystem->exists( $file_path ) ) { $wp_filesystem->put_contents( $file_path, $new_content, FS_CHMOD_FILE ); } else { // Read current contents $current_contents = $wp_filesystem->get_contents( $file_path ); if ( $current_contents === false ) { // Handle error if reading fails return false; } // Append new content $updated_contents = $current_contents . $new_content; // Write back updated contents if ( ! $wp_filesystem->put_contents( $file_path, $updated_contents, FS_CHMOD_FILE ) ) { // Handle error if writing fails return false; } } } return true; }; // Write the initial output to the file if ( ! $append_content( $initial_output ) ) { return false; // Handle error if initial content writing fails } $sub_limit = 500; // phpcs:ignore $check_count = $wpdb->get_var( "SELECT COUNT(*) FROM `{$table}`" ); $check_count = intval( $check_count ); if ( $check_count > $sub_limit ) { $t_sub_queries = ceil( $check_count / $sub_limit ); for ( $sub_i = 0; $sub_i < $t_sub_queries; $sub_i++ ) { $sub_offset = $sub_i * $sub_limit; $sub_result = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM `{$table}` LIMIT %d OFFSET %d", array( $sub_limit, $sub_offset ) ), ARRAY_A ); // phpcs:ignore if ( $sub_result ) { $output = ''; foreach ( $sub_result as $row ) { $output .= 'INSERT INTO ' . $table . ' VALUES('; $result_o_index = count( $row ); $j = 0; foreach ( $row as $key => $value ) { $row[ $key ] = $wpdb->_real_escape( apply_filters( 'wpdbbkp_process_db_fields', $value, $table, $key ) ); $output .= ( isset( $row[ $key ] ) ) ? '"' . $row[ $key ] . '"' : '""'; if ( $j < ( $result_o_index - 1 ) ) { $output .= ','; } $j++; } $output .= ");\n"; } // Append to the file if ( ! $append_content( $output ) ) { return false; // Handle error if appending content fails } } sleep(1); } } else { $result = $wpdb->get_results( "SELECT * FROM `{$table}`", ARRAY_A ); // phpcs:ignore $output = ''; foreach ( $result as $row ) { $output .= 'INSERT INTO ' . $table . ' VALUES('; $result_o_index = count( $row ); $j = 0; foreach ( $row as $key => $value ) { $row[ $key ] = $wpdb->_real_escape( apply_filters( 'wpdbbkp_process_db_fields', $value, $table, $key ) ); $output .= ( isset( $row[ $key ] ) ) ? '"' . $row[ $key ] . '"' : '""'; if ( $j < ( $result_o_index - 1 ) ) { $output .= ','; } $j++; } $output .= ");\n"; } // Append to the file if ( ! $append_content( $output ) ) { return false; // Handle error if appending content fails } } // Flush the database cache $wpdb->flush(); return true; } /** * Mysql Dump set path. * * @param string $path - Path. */ public function set_mysqldump_command_path( $path ) { $this->mysqldump_command_path = $path; } /** * Mysql Dump get path. */ public function get_mysqldump_command_path() { // Check shell_exec is available. if ( ! self::is_shell_exec_available() ) { return ''; } // Return now if it's already been set. if ( isset( $this->mysqldump_command_path ) ) { return $this->mysqldump_command_path; } $this->mysqldump_command_path = ''; // Does mysqldump work. if ( is_null( shell_exec( 'hash mysqldump 2>&1' ) ) ) { // phpcs:ignore // If so store it for later. $this->set_mysqldump_command_path( 'mysqldump' ); // And return now. return $this->mysqldump_command_path; } // List of possible mysqldump locations. $mysqldump_locations = array( '/usr/local/bin/mysqldump', '/usr/local/mysql/bin/mysqldump', '/usr/mysql/bin/mysqldump', '/usr/bin/mysqldump', '/opt/local/lib/mysql6/bin/mysqldump', '/opt/local/lib/mysql5/bin/mysqldump', '/opt/local/lib/mysql4/bin/mysqldump', '/xwpdbbkpp/mysql/bin/mysqldump', '/Program Files/xwpdbbkpp/mysql/bin/mysqldump', '/Program Files/MySQL/MySQL Server 6.0/bin/mysqldump', '/Program Files/MySQL/MySQL Server 5.5/bin/mysqldump', '/Program Files/MySQL/MySQL Server 5.4/bin/mysqldump', '/Program Files/MySQL/MySQL Server 5.1/bin/mysqldump', '/Program Files/MySQL/MySQL Server 5.0/bin/mysqldump', '/Program Files/MySQL/MySQL Server 4.1/bin/mysqldump', ); // Find the one which works. foreach ( $mysqldump_locations as $location ) { if ( is_executable( self::conform_dir( $location ) ) ) { $this->set_mysqldump_command_path( $location ); } } return $this->mysqldump_command_path; } /** * Check dir. * * @param string $dir - Dir Details. * @param bool $recursive - Recursive. */ public static function conform_dir( $dir, $recursive = false ) { // Assume empty dir is root. if ( ! $dir ) { $dir = '/'; } // Replace single forward slash (looks like double slash because we have to escape it). $dir = str_replace( '\\', '/', $dir ); $dir = str_replace( '//', '/', $dir ); // Remove the trailing slash. if ( '/' !== $dir ) { $dir = untrailingslashit( $dir ); } // Carry on until completely normalized. if ( ! $recursive && self::conform_dir( $dir, true ) !== $dir ) { return self::conform_dir( $dir ); } return (string) $dir; } /** * Check Shell. */ public static function is_shell_exec_available() { // Are we in Safe Mode. if ( self::is_safe_mode_active() ) { return false; } // Is shell_exec or escapeshellcmd or escapeshellarg disabled? if ( array_intersect( array( 'shell_exec', 'escapeshellarg', 'escapeshellcmd' ), array_map( 'trim', explode( ',', ini_get( 'disable_functions' ) ) ) ) ) { return false; } // Can we issue a simple echo command? if ( ! shell_exec( 'echo WP Backup' ) ) { // phpcs:ignore return false; } return true; } /** * Check Safe mode active. * * @param string $ini_get_callback - String cmd. * @return bool */ public static function is_safe_mode_active( $ini_get_callback = 'ini_get' ) { $safe_mode = call_user_func( $ini_get_callback, 'safe_mode' ); if ( ( $safe_mode ) && 'off' !== strtolower( $safe_mode ) ) { return true; } return false; } /** * Database dump. * * @param string $sql_filename - File name. */ public function mysqldump( $sql_filename ) { $this->mysqldump_method = 'mysqldump'; $host = explode( ':', DB_HOST ); $host = reset( $host ); $port = strpos( DB_HOST, ':' ) ? end( explode( ':', DB_HOST ) ) : ''; // Path to the mysqldump executable. $cmd = escapeshellarg( $this->get_mysqldump_command_path() ); // We don't want to create a new DB. $cmd .= ' --no-create-db'; // Allow lock-tables to be overridden. if ( ! defined( 'WPDB_MYSQLDUMP_SINGLE_TRANSACTION' ) || WPDB_MYSQLDUMP_SINGLE_TRANSACTION !== false ) { $cmd .= ' --single-transaction'; } // Make sure binary data is exported properly. $cmd .= ' --hex-blob'; // Username. $cmd .= ' -u ' . escapeshellarg( DB_USER ); // Don't pass the password if it's blank. if ( DB_PASSWORD ) { $cmd .= ' -p' . escapeshellarg( DB_PASSWORD ); } // Set the host. $cmd .= ' -h ' . escapeshellarg( $host ); // Set the port if it was set. if ( ! empty( $port ) && is_numeric( $port ) ) { $cmd .= ' -P ' . $port; } // The file we're saving too. $cmd .= ' -r ' . escapeshellarg( $sql_filename ); $wp_db_exclude_table = get_option( 'wp_db_exclude_table' ); if ( ! empty( $wp_db_exclude_table ) && is_array( $wp_db_exclude_table ) ) { foreach ( $this->filter_valid_exclude_tables( $wp_db_exclude_table ) as $exclude_table ) { $cmd .= ' --ignore-table=' . escapeshellarg( DB_NAME . '.' . $exclude_table ); } } // The database we're dumping. $cmd .= ' ' . escapeshellarg( DB_NAME ); // Pipe STDERR to STDOUT. $cmd .= ' 2>&1'; // Store any returned data in an error. $stderr = shell_exec( $cmd ); // phpcs:ignore // Skip the new password warning that is output in mysql > 5.6. if ( trim( $stderr ) === 'Warning: Using a password on the command line interface can be insecure.' ) { $stderr = ''; } if ( $stderr ) { $this->error( $this->get_mysqldump_method(), $stderr ); } return $this->verify_mysqldump( $sql_filename ); } /** * Error. * * @param string $context - Data. * @param object $error - Error data. */ public function error( $context, $error ) { if ( empty( $context ) || empty( $error ) ) { return; } $error_str = implode( ':', (array) $error ); $_key = md5( $error_str ); $this->errors[ $context ][ $_key ] = $error; } /** * Verify Dump. * * @param string $sql_filename - Sql file. * @return bool */ public function verify_mysqldump( $sql_filename ) { // If we've already passed then no need to check again. if ( ! empty( $this->mysqldump_verified ) ) { return true; } // If there are mysqldump errors delete the database dump file as mysqldump will still have written one. if ( $this->get_errors( $this->get_mysqldump_method() ) && file_exists( $sql_filename ) ) { if ( file_exists( $sql_filename ) ) { wp_delete_file( $sql_filename ); } } // If we have an empty file delete it. if ( 0 === filesize( $sql_filename ) ) { if ( file_exists( $sql_filename ) ) { wp_delete_file( $sql_filename ); } } // If the file still exists then it must be good. if ( file_exists( $sql_filename ) ) { $this->mysqldump_verified = true; return $this->mysqldump_verified; } return false; } /** * Get error. * * @param string $context - Data. * @return string */ public function get_errors( $context = null ) { if ( ! empty( $context ) ) { return isset( $this->errors[ $context ] ) ? $this->errors[ $context ] : array(); } return $this->errors; } /** * Get mysql dump method. * * @return string */ public function get_mysqldump_method() { return $this->mysqldump_method; } // End : Generate SQL DUMP using cmd 06-03-2016. /** * Create zip. */ public function wp_db_backup_create_archive() { // Begin : Setup Upload Directory, Secure it and generate a random file name. $source_directory = $this->wp_db_backup_wp_config_path(); $path_info = wp_upload_dir(); $htasses_text = ''; global $wpdb,$wp_filesystem; if ( ! function_exists( 'WP_Filesystem' ) ) { require_once ABSPATH . '/wp-admin/includes/file.php'; } WP_Filesystem(); if(!$wp_filesystem){ return false; } wp_mkdir_p($path_info['basedir'] . '/' . WPDB_BACKUPS_DIR); wp_mkdir_p($path_info['basedir'] . '/' . WPDB_BACKUPS_DIR . '/log'); $file_contents = "put_contents( $path_info['basedir'] . '/' . WPDB_BACKUPS_DIR . '/index.php', $file_contents, FS_CHMOD_FILE ); $wp_filesystem->put_contents( $path_info['basedir'] . '/' . WPDB_BACKUPS_DIR . '/log/index.php', $file_contents, FS_CHMOD_FILE ); // Added htaccess file 08-05-2015 for prevent directory listing. // Fixed Vulnerability 22-06-2016 for prevent direct download. $htaccess_content = '# Disable public access to this folder Require all denied Deny from all '; $wp_filesystem->put_contents( $path_info['basedir'] . '/db-backup/.htaccess', $htaccess_content, FS_CHMOD_FILE ); // Begin : Generate SQL DUMP and save to file database.sql. $wp_site_name = preg_replace('/[^\p{L}\p{M}]+/u', '_', get_bloginfo('name')); $wp_db_file_name = $wp_site_name . '_' . gmdate( 'Y_m_d' ) . '_' . time() . '_' . substr( md5( wp_rand(100,9999999) ), 0, 9 ) . '_wpdb'; $sql_filename = $wp_db_file_name . '.sql'; $filename = $wp_db_file_name . '.zip'; $logname = $wp_db_file_name . '.txt'; // Begin : Generate SQL DUMP using cmd 06-03-2016. $my_sql_dump = 0; if ( $this->get_mysqldump_command_path() ) { if ( ! $this->mysqldump( $path_info['basedir'] . '/db-backup/' . $sql_filename ) ) { $my_sql_dump = 1; } } else { $my_sql_dump = 1; } if ( 1 === (int) $my_sql_dump ) { /* BEGIN : Prevent saving backup plugin settings in the database dump */ $options_backup = get_option( 'wp_db_backup_backups' ); $settings_backup = get_option( 'wp_db_backup_options' ); $wp_db_save_settings_in_backup = get_option( 'wp_db_save_settings_in_backup',1); if($wp_db_save_settings_in_backup){ delete_option( 'wp_db_backup_backups' ); delete_option( 'wp_db_backup_options' ); } /* END : Prevent saving backup plugin settings in the database dump */ //phpcs:ignore -- using direct query get all tables name to be backedup. $tables = $wpdb->get_col( 'SHOW TABLES' ); $wp_db_exclude_table = get_option( 'wp_db_exclude_table',array()); if(!empty($tables)){ foreach($tables as $table){ if ( empty( $wp_db_exclude_table ) || ( ! ( in_array( $table, $wp_db_exclude_table, true ) ) ) ) { $this->wp_db_backup_create_mysql_backup_new($table, $path_info['basedir'] . '/db-backup/' . $sql_filename ); } } } /* BEGIN : Prevent saving backup plugin settings in the database dump */ $options_backup = wpdbbkp_filter_unique_filenames( $options_backup ); add_option( 'wp_db_backup_backups', $options_backup ); add_option( 'wp_db_backup_options', $settings_backup ); /* END : Prevent saving backup plugin settings in the database dump */ } /* End : Generate SQL DUMP using cmd 06-03-2016 */ $wp_db_backup_search_text = get_option( 'wp_db_backup_search_text' ); $wp_db_backup_replace_text = get_option( 'wp_db_backup_replace_text' ); if ( ( false === empty( $wp_db_backup_search_text ) ) && ( false === empty( $wp_db_backup_replace_text ) ) ) { $filecontent = wp_remote_get( $path_info['basedir'] . '/db-backup/' . $sql_filename ); if (! is_wp_error( $filecontent ) && isset($filecontent['body']) ) { $backup_str = str_replace( $wp_db_backup_search_text, $wp_db_backup_replace_text, $filecontent['body'] ); $wp_filesystem->put_contents( $path_info['basedir'] . '/db-backup/' . $sql_filename, $backup_str, FS_CHMOD_FILE ); } } /* End : Generate SQL DUMP and save to file database.sql */ $upload_path = array( 'filename' => ( $filename ), 'dir' => ( $path_info['basedir'] . '/db-backup/' . $filename ), 'url' => ( $path_info['baseurl'] . '/db-backup/' . $filename ), 'log_dir' => ( $path_info['basedir'] . '/db-backup/log/' . $logname ), 'log_url' => ( $path_info['baseurl'] . '/db-backup/log/' . $logname ), 'size' => 0, ); $arcname = $path_info['basedir'] . '/db-backup/' . $wp_db_file_name . '.zip'; if ( class_exists( 'ZipArchive' ) ) { $zip = new ZipArchive(); $zip->open( $arcname, ZipArchive::CREATE ); $zip->addFile( $path_info['basedir'] . '/db-backup/' . $sql_filename, $sql_filename ); $zip->close(); } else { require_once ABSPATH . 'wp-admin/includes/class-pclzip.php'; $archive = new PclZip( $arcname ); $v_dir = $path_info['basedir'] . '/db-backup/' . $sql_filename; $v_remove = $path_info['basedir'] . '/db-backup'; // Create the archive. $v_list = $archive->create( $v_dir, PCLZIP_OPT_REMOVE_PATH, $v_remove ); } $mysqlversion = wp_cache_get( 'wpdb_mysqlversion' ); if ( true === empty( $mysqlversion ) ) { $mysqlversion = $wpdb->get_var( 'SELECT VERSION() AS version' ); // phpcs:ignore wp_cache_set( 'wpdb_mysqlversion', $mysqlversion, '', 18000 ); } if ( ! function_exists( 'get_plugins' ) ) { require_once ABSPATH . 'wp-admin/includes/plugin.php'; } $my_theme = wp_get_theme(); $active_plugin = count(get_option('active_plugins')); $total_plugin = count(get_plugins()); $log_message = 'WordPress Version : ' . get_bloginfo( 'version' ); $log_message .= '
Database Version : ' . $mysqlversion; $log_message .= '
Active Theme Name : ' . $my_theme->get( 'Name' ); $log_message .= '
Theme Version : ' . $my_theme->get( 'Version' ); $log_message .= '
Plugin Count : ' . $total_plugin; $log_message .= '
Active Plugins : ' . $active_plugin; $upload_path['size'] = filesize( $upload_path['dir'] ); $upload_path['sqlfile'] = $path_info['basedir'] . '/db-backup/' . $sql_filename; $wp_db_log = get_option( 'wp_db_log' ); if ( 1 === (int) $wp_db_log ) { $wp_db_exclude_table = get_option( 'wp_db_exclude_table' ); if ( ! empty( $wp_db_exclude_table ) ) { $log_message .= '
Exclude Table : ' . implode( ', ', $wp_db_exclude_table ); } $upload_path['log'] = $log_message; } $options = get_option( 'wp_db_backup_backups' ); $newoptions = array(); $number_of_existing_backups = count( (array) $options ); $number_of_backups_from_user = get_option( 'wp_local_db_backup_count' ); if ( ! empty( $number_of_backups_from_user ) ) { if ( ! ( $number_of_existing_backups < $number_of_backups_from_user ) ) { $diff = $number_of_existing_backups - $number_of_backups_from_user; for ( $i = 0; $i <= $diff; $i++ ) { $index = $i; if ( isset($options[ $index ]['dir']) && file_exists( $options[ $index ]['dir'] ) ) { wp_delete_file( $options[ $index ]['dir'] ); } $file_sql = explode( '.', $options[ $index ]['dir'] ); if ( isset($file_sql[0]) && file_exists( $file_sql[0] . '.sql' ) ) { wp_delete_file( $file_sql[0] . '.sql' ); } } for ( $i = ( $diff + 1 ); $i < $number_of_existing_backups; $i++ ) { $index = $i; $newoptions[] = $options[ $index ]; } $newoptions = wpdbbkp_filter_unique_filenames( $newoptions ); update_option( 'wp_db_backup_backups', $newoptions , false); } } if ( file_exists( $path_info['basedir'] . '/db-backup/' . $sql_filename ) ) { wp_delete_file( $path_info['basedir'] . '/db-backup/' . $sql_filename ); } return $upload_path; } /** * Config Path. */ public function wp_db_backup_wp_config_path() { $path = str_replace('\\', '/', ABSPATH); return $path; } /** * Backup Process. */ public function wp_db_backup_event_process() { // Added in v.3.9.5! global $wp_filesystem; if(!function_exists('WP_Filesystem')){ require_once ( ABSPATH . '/wp-admin/includes/file.php' ); } WP_Filesystem(); $cron_condition = apply_filters('wpdbbkp_dbback_cron_condition',true ); if(wp_doing_cron() && !$cron_condition){ return false; } set_time_limit( 0 ); //phpcs:ignore -- increase time limit for backup process. ignore_user_abort(true); $details = $this->wp_db_backup_create_archive(); $options = get_option( 'wp_db_backup_backups' ); if ( ! $options ) { $options = array(); } $is_search_replace_flag = 0; $wp_db_log = get_option( 'wp_db_log' ); if ( 1 === (int) $wp_db_log ) { $log_message = $details['log']; $wp_db_backup_search_text = get_option( 'wp_db_backup_search_text' ); $wp_db_backup_replace_text = get_option( 'wp_db_backup_replace_text' ); if ( ( false === empty( $wp_db_backup_search_text ) ) && ( false === empty( $wp_db_backup_replace_text ) ) ) { $log_message .= ' Replaced/Search text - ' . $wp_db_backup_search_text . ' With -' . $wp_db_backup_replace_text; $is_search_replace_flag = 1; } } else { $log_message = ''; } $wp_db_remove_local_backup = get_option( 'wp_db_remove_local_backup' ); $destination = ( 1 === (int) $wp_db_remove_local_backup ) ? '' : 'Local, '; $args = array( $details['filename'], $details['dir'], $log_message, $details['size'], $destination ); do_action_ref_array( 'wpdbbkp_db_backup_completed', array( &$args ) ); // Ensure enabled destinations are reflected in the saved Destination string for table display // Note: Hook handlers may have already added destinations, so check before appending $destination_for_table = $args[4]; if ( get_option( 'wp_db_backup_destination_generics3' ) == 1 && !empty(get_option( 'wpdb_dest_generics3_bucket_key' ) ) && !empty(get_option( 'wpdb_dest_generics3_bucket_secret' ) ) ) { $destination_for_table .= 'GenericS3, '; } if ( get_option( 'wp_db_backup_destination_bb' ) == 1 && !empty(get_option( 'wpdb_dest_bb_s3_bucket_key' ) ) ) { $destination_for_table .= 'Backblaze, '; } if ( get_option( 'wp_db_backup_destination_s3' ) == 1 && !empty(get_option( 'wpdb_dest_amazon_s3_bucket_key' ) ) && !empty(get_option( 'wpdb_dest_amazon_s3_bucket_secret' ) ) ) { $destination_for_table .= 'S3, '; } if ( get_option( 'wp_db_backup_destination_SFTP' ) == 1 && !empty(get_option( 'wpdb_dest_sftp_host' ) ) && !empty(get_option( 'wpdb_dest_sftp_port' ) ) && !empty(get_option( 'wpdb_dest_sftp_username' ) ) && !empty(get_option( 'wpdb_dest_sftp_password' ) ) ) { $destination_for_table .= 'SFTP, '; } if ( get_option( 'wp_db_backup_destination_FTP' ) == 1 && !empty(get_option( 'wpdb_dest_ftp_host' ) ) && !empty(get_option( 'wpdb_dest_ftp_port' ) ) && !empty(get_option( 'wpdb_dest_ftp_username' ) ) && !empty(get_option( 'wpdb_dest_ftp_password' ) ) ) { $destination_for_table .= 'FTP, '; } if ( get_option( 'wp_db_backup_destination_Email' ) == 1 && strpos( $destination_for_table, 'Email' ) === false ) { $destination_for_table .= 'Email, '; } $options[] = array( 'date' => time(), 'filename' => $details['filename'], 'url' => $details['url'], 'dir' => $details['dir'], 'log' => $details['log_url'], 'search_replace' => $is_search_replace_flag, 'sqlfile' => $details['sqlfile'], 'size' => $details['size'], 'type' =>'database', 'destination' => $destination_for_table ); if ( 1 !== (int) $wp_db_remove_local_backup ) { $options = wpdbbkp_filter_unique_filenames( $options ); update_option( 'wp_db_backup_backups', $options , false); } if(isset($details['log_dir']) && !empty($details['log_dir'])) { $log_file_path = $details['log_dir']; $log_dir = dirname($log_file_path); if ( $wp_filesystem->is_writable( $log_dir ) ) { $wp_filesystem->put_contents( $log_file_path, str_replace(array("
","",""), array("\n","",""), $args[2]), FS_CHMOD_FILE ); } } } /** * Cron schedule. * * @param array $schedules - Schedules details. */ public function wp_db_backup_cron_schedules( $schedules ) { $schedules['hourly'] = array( 'interval' => 3600, 'display' => 'hourly', ); $schedules['twicedaily'] = array( 'interval' => 43200, 'display' => 'twicedaily', ); $schedules['daily'] = array( 'interval' => 86400, 'display' => 'daily', ); $schedules['weekly'] = array( 'interval' => 604800, 'display' => 'Once Weekly', ); $schedules['monthly'] = array( 'interval' => 2635200, 'display' => 'Once a month', ); return $schedules; } /** * Schedular activation. */ public function wp_db_backup_scheduler_activation() { $options = get_option( 'wp_db_backup_options' ); if ( ( ! wp_next_scheduled( 'wpdbbkp_db_backup_event' ) ) && ( true === isset( $options['enable_autobackups'] ) ) ) { $cron_freq = apply_filters( 'wpdbbkp_dbback_cron_frequency',$options['autobackup_frequency']); if(isset($options['autobackup_type']) && $options['autobackup_type'] == 'db') { $timestamp = strtotime('today 23:59'); // Start at the next midnight wp_schedule_event( $timestamp , $cron_freq, 'wpdbbkp_db_backup_event' ); } }else{ if( !empty($options) && ( false === isset( $options['enable_autobackups'] ) ) || ( true === isset( $options['enable_autobackups'] ) ) && isset($options['autobackup_type']) && $options['autobackup_type'] != 'db') { wp_clear_scheduled_hook( 'wpdbbkp_db_backup_event' ); } } } /** * Config data. * * @param string $key - key name. */ public function wp_backup_get_config_data( $key ) { $filepath = get_home_path() . '/wp-config.php'; $config_file = @file_get_contents( "$filepath", true ); if($config_file){ switch ( $key ) { case 'DB_NAME': preg_match( "/'DB_NAME',\s*'(.*)?'/", $config_file, $matches ); break; case 'DB_USER': preg_match( "/'DB_USER',\s*'(.*)?'/", $config_file, $matches ); break; case 'DB_PASSWORD': preg_match( "/'DB_PASSWORD',\s*'(.*)?'/", $config_file, $matches ); break; case 'DB_HOST': preg_match( "/'DB_HOST',\s*'(.*)?'/", $config_file, $matches ); break; } return $matches[1]; } return ''; } /** * Get db name from config. */ public function wp_backup_get_config_db_name() { $filepath = get_home_path() . '/wp-config.php'; $config_file = @file_get_contents( "$filepath", true ); if($config_file){ preg_match( "/'DB_NAME',\s*'(.*)?'/", $config_file, $matches ); return $matches[1]; } return ''; } /** * Restrict exclude-table names to tables that exist in the database. * * @param array|string $exclude_tables Tables requested for exclusion. * * @return array */ public function filter_valid_exclude_tables( $exclude_tables ) { global $wpdb; if ( ! is_array( $exclude_tables ) ) { return array(); } $valid_tables = $wpdb->get_col( 'SHOW TABLES' ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching if ( empty( $valid_tables ) ) { return array(); } $valid_tables = array_flip( $valid_tables ); $filtered = array(); foreach ( $exclude_tables as $exclude_table ) { if ( is_string( $exclude_table ) && isset( $valid_tables[ $exclude_table ] ) ) { $filtered[] = $exclude_table; } } return array_values( array_unique( $filtered ) ); } /** * Recursive sanitation for an array * * @param array $array - Array data to sanitize. * * @return mixed */ public function recursive_sanitize_text_field( $array ) { if( ! is_array( $array ) ) { return sanitize_text_field( $array ); } foreach ( $array as $key => &$value ) { if ( is_array( $value ) ) { $value = $this->recursive_sanitize_text_field( $value ); } else { $value = sanitize_text_field( $value ); } } return $array; } /** * Enqueue scripts and style */ public function admin_scripts_style() { if ( true === $this->is_wpdb_page() ) { wp_enqueue_script( 'jquery' ); wp_register_script( 'bootstrapjs', WPDB_PLUGIN_URL . '/assets/js/bootstrap.min.js', array( 'jquery' ), WPDB_VERSION, false ); wp_enqueue_script( 'bootstrapjs' ); wp_register_style( 'bootstrapcss', WPDB_PLUGIN_URL . '/assets/css/bootstrap.min.css', array(), WPDB_VERSION ); wp_enqueue_style( 'bootstrapcss' ); wp_register_script( 'dataTablesjs', WPDB_PLUGIN_URL . '/assets/js/jquery.dataTables.js', array( 'jquery' ), WPDB_VERSION, false ); wp_enqueue_script( 'dataTablesjs' ); wp_register_style( 'dataTablescss', WPDB_PLUGIN_URL . '/assets/css/jquery.dataTables.css', array(), WPDB_VERSION ); wp_enqueue_style( 'dataTablescss' ); wp_register_style( 'wpdbcss', WPDB_PLUGIN_URL . '/assets/css/wpdb_admin.css', array(), WPDB_VERSION ); wp_enqueue_style( 'wpdbcss' ); } } /** * Check is plugin page. */ public function is_wpdb_page() { if ( is_admin() ) { return isset( $_REQUEST['page'] ) && preg_match( '/wp-database-backup/', $_REQUEST['page'] ) ? true : false; // phpcs:ignore } else { return true; } } // loading admin scripts/styles on admin page only public function wpdbbkp_admin_style($hook_suffix) { if($hook_suffix=="tools_page_wp-database-backup" || $hook_suffix=="toplevel_page_wp-database-backup") { wp_register_script('wpdbbkp-admin-script', WPDB_PLUGIN_URL . '/assets/js/wpdbbkp-admin.js', array('jquery'), WPDB_VERSION, 'true' ); wp_localize_script('wpdbbkp-admin-script', 'wpdbbkp_script_vars', array( 'nonce' => wp_create_nonce( 'wpdbbkp-admin-nonce' ), 'siteurl' => base64_encode(site_url( )), 'ud'=>wpdbbkp_get_current_user_name_email(), 'is_subscribed'=>wpdbbkp_if_remote_active(), )); wp_enqueue_script('wpdbbkp-admin-script'); // Adding custom js $local = array( 'ajax_url' => admin_url( 'admin-ajax.php' ), 'wpdbbkp_admin_security_nonce' => wp_create_nonce('wpdbbkp_ajax_check_nonce'), 'home_url' =>get_home_url() ); wp_register_script('wpdbbkp-admin-fb', WPDB_PLUGIN_URL . '/assets/js/wpdbbkp-admin-cron-backup.js', array(), WPDB_VERSION , true ); wp_localize_script('wpdbbkp-admin-fb', 'wpdbbkp_localize_admin_data', $local ); wp_enqueue_script('wpdbbkp-admin-fb'); wp_register_script('wpdbbkp-admin-export', WPDB_PLUGIN_URL . '/assets/js/wpdbbkp-admin-cron-export.js', array(), WPDB_VERSION , true ); wp_enqueue_script('wpdbbkp-admin-export'); // Custom Js ends } } public function wpdbbkp_admin_newsletter_script($hook_suffix ) { if($hook_suffix=="tools_page_wp-database-backup" || $hook_suffix=="toplevel_page_wp-database-backup") { wp_enqueue_script('wpdbbkp-admin-newsletter-script', WPDB_PLUGIN_URL . '/assets/js/wpdbbkp-admin-newsletter.js', array('jquery'), WPDB_VERSION, 'true' ); $current_screen = get_current_screen(); if(isset($current_screen->post_type)){ $post_type = $current_screen->post_type; } $post_id = get_the_ID(); //phpcs:ignore WordPress.Security.NonceVerification.Recommended -- no form submission if(isset($_GET['tag_ID'])){ //phpcs:ignore WordPress.Security.NonceVerification.Recommended -- no form submission $post_id = intval($_GET['tag_ID']); } $data = array( 'current_url' => wpdbbkp_get_current_url(), 'post_id' => $post_id, 'ajax_url' => admin_url( 'admin-ajax.php' ), 'post_type' => $post_type, 'page_now' => $hook_suffix, 'wpdbbkp_security_nonce' => wp_create_nonce('wpdbbkp_ajax_check_nonce'), ); $data = apply_filters('wpdbbkp_localize_filter',$data,'wpdbbkp_localize_data'); wp_localize_script( 'wpdbbkp-admin-newsletter-script', 'wpdbbkp_localize_data', $data ); } } public function wpdbbkp_sanitize_textarea_field( $str ) { if ( is_object( $str ) || is_array( $str ) ) { return ''; } $str = (string) $str; $filtered = wp_check_invalid_utf8( $str ); if ( strpos( $filtered, '<' ) !== false ) { $filtered = wp_pre_kses_less_than( $filtered ); // This will strip extra whitespace for us. $filtered = wp_strip_all_tags( $filtered, false ); // Use HTML entities in a special case to make sure no later // newline stripping stage could lead to a functional tag. $filtered = str_replace( "<\n", "<\n", $filtered ); } $filtered = trim( $filtered ); $found = false; while ( preg_match( '/%[a-f0-9]{2}/i', $filtered, $match ) ) { $filtered = str_replace( $match[0], '', $filtered ); $found = true; } if ( $found ) { // Strip out the whitespace that may now exist after removing the octets. $filtered = trim( preg_replace( '/ +/', ' ', $filtered ) ); } return $filtered; } public function wpdbbkp_send_query_message(){ if ( ! isset( $_POST['wpdbbkp_security_nonce'] ) ){ return; } if ( !wp_verify_nonce( wp_unslash($_POST['wpdbbkp_security_nonce']), 'wpdbbkp-admin-nonce' ) ){ // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- used as nonce return; } if( ! current_user_can( 'manage_options' ) ) { return; } $message = isset($_POST['message']) ? $this->wpdbbkp_sanitize_textarea_field(wp_unslash($_POST['message'])) : ''; //phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- sanitized using custom function $email = isset($_POST['email']) ? $this->wpdbbkp_sanitize_textarea_field(wp_unslash($_POST['email'])) : ''; //phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- sanitized using custom function if(function_exists('wp_get_current_user')){ $user = wp_get_current_user(); $message = '

'.$message.'



'.'Query from BackupforWP plugin support tab'; $user_data = $user->data; $user_email = $user_data->user_email; if($email){ $user_email = $email; } //php mailer variables $sendto = 'team@magazine3.in'; $subject = "BackupforWP Query"; $headers[] = 'Content-Type: text/html; charset=UTF-8'; $headers[] = 'From: '. esc_attr($user_email); $headers[] = 'Reply-To: ' . esc_attr($user_email); // Load WP components, no themes. $sent = wp_mail($sendto, $subject, $message, $headers); if($sent){ echo wp_json_encode(array('status'=>'t')); }else{ echo wp_json_encode(array('status'=>'f')); } } wp_die(); } public function add_settings_plugin_action_wp( $actions, $plugin_file, $plugin_data, $context ) { $plugin_actions['settings'] = sprintf( '' . _x( 'Settings', 'Content translation' ,'wpdbbkp' ) . '', admin_url( 'options-general.php?page=wp-database-backup' ) ); $actions = array_merge( $actions, $plugin_actions ); return $actions; } public function wpdbbkp_update_backup_info($FileName, $logFile, $logMessage = '') { $path_info = wp_upload_dir(); $filename = $FileName . '.sql'; $WPDBFileName = $FileName . '.zip'; wp_delete_file($this->wp_db_backup_wp_config_path() . '/' . $filename); wp_delete_file($this->wp_db_backup_wp_config_path() . '/wp_installer.php'); @$filesize = filesize($path_info['basedir'] . '/' . WPDB_BACKUPS_DIR . '/' . $WPDBFileName); $upload_path = array( 'filename' => ($WPDBFileName), 'dir' => ($path_info['basedir'] . '/' . WPDB_BACKUPS_DIR . '/' . $WPDBFileName), 'url' => ($path_info['baseurl'] . '/' . WPDB_BACKUPS_DIR . '/' . $WPDBFileName), 'size' => ($filesize), 'type' => get_option('wp_db_backup_backup_type') ); if (get_option('wp_db_log') == 1) { $this->write_log($logFile, $logMessage); $upload_path['logfile'] = $path_info['baseurl'] . '/' . WPDB_BACKUPS_DIR . '/log/' . $FileName . '.txt'; $upload_path['logfileDir'] = $logFile; } else { $upload_path['logfile'] = ""; } $args = array($FileName, $logFile, $logMessage); do_action_ref_array('wpdbbkp_backup_completed', array(&$args)); return $upload_path; } private function write_log($logFile, $logMessage) { // Actually write the log file if ( empty( $logMessage ) || empty( $logFile ) ) { return false; } global $wp_filesystem; if(!function_exists('WP_Filesystem')){ require_once ( ABSPATH . '/wp-admin/includes/file.php' ); } WP_Filesystem(); $logDir = dirname( $logFile ); if ($wp_filesystem && $wp_filesystem->is_writable($logDir)) { $wp_filesystem->put_contents( $logFile, $logMessage, FS_CHMOD_FILE ); return true; } } public function get_zip_command_path() { // Check shell_exec is available if (!self::is_shell_exec_available()) return ''; // Return now if it's already been set if (isset($this->zip_command_path)) return $this->zip_command_path; $this->zip_command_path = ''; // Does zip work if (is_null(shell_exec('hash zip 2>&1'))) { // If so store it for later $this->set_zip_command_path('zip'); // And return now return $this->zip_command_path; } // List of possible zip locations $zip_locations = array( '/usr/bin/zip' ); // Find the one which works foreach ($zip_locations as $location) if (@is_executable(self::conform_dir($location))) $this->set_zip_command_path($location); return $this->zip_command_path; } public function set_zip_command_path($path) { $this->zip_command_path = $path; } /* Begin : Generate Zip using cmd 06-03-2016 V.3.9 */ public function zip($WPDBFileName) { $this->archive_method = 'zip'; $wp_all_backup_exclude_dir = get_option('wp_db_backup_exclude_dir'); if (empty($wp_all_backup_exclude_dir)) { $excludes = WPDB_BACKUPS_DIR; } else { $excludes = WPDB_BACKUPS_DIR . '|' . $wp_all_backup_exclude_dir; } // Zip up $this->root with excludes if (!empty($excludes)) { $stderr = shell_exec('cd ' . escapeshellarg($this->get_root()) . ' && ' . escapeshellcmd($this->get_zip_command_path()) . ' -rq ' . escapeshellarg($WPDBFileName) . ' ./' . ' -x ' . $this->exclude_string('zip') . ' 2>&1'); } // Zip up $this->root without excludes else { $stderr = shell_exec('cd ' . escapeshellarg($this->get_root()) . ' && ' . escapeshellcmd($this->get_zip_command_path()) . ' -rq ' . escapeshellarg($WPDBFileName) . ' ./' . ' 2>&1'); } if (!empty($stderr)) $this->warning($this->get_archive_method(), $stderr); return $this->verify_archive($WPDBFileName); } public function get_root() { if (empty($this->root)) $this->set_root(self::conform_dir(self::get_home_path())); return $this->root; } public function set_root($path) { if (empty($path) || !is_string($path) || !is_dir($path)) throw new Exception('Invalid root path ' . esc_html($path) . ' must be a valid directory path'); $this->root = self::conform_dir($path); } public static function get_home_path() { $home_url = home_url(); $site_url = site_url(); $home_path = ABSPATH; // If site_url contains home_url and they differ then assume WordPress is installed in a sub directory if ($home_url !== $site_url && strpos($site_url, $home_url) === 0) $home_path = trailingslashit(substr(self::conform_dir(ABSPATH), 0, strrpos(self::conform_dir(ABSPATH), str_replace($home_url, '', $site_url)))); return self::conform_dir($home_path); } private function warning($context, $warning) { if (empty($context) || empty($warning)) return; $this->warnings[$context][$_key = md5(implode(':', (array) $warning))] = $warning; } public function exclude_string($context = 'zip') { // Return a comma separated list by default $separator = ', '; $wildcard = ''; // The zip command if ($context === 'zip') { $wildcard = '*'; $separator = ' -x '; // The PclZip fallback library } elseif ($context === 'regex') { $wildcard = '([\s\S]*?)'; $separator = '|'; } $wp_all_backup_exclude_dir = get_option('wp_db_backup_exclude_dir'); if (empty($wp_all_backup_exclude_dir)) { $excludes = WPDB_BACKUPS_DIR; } else { $excludes = WPDB_BACKUPS_DIR . '|' . $wp_all_backup_exclude_dir; } $excludes = explode("|", $excludes); if(!empty($excludes) && is_array($excludes)){ foreach ($excludes as $key => &$rule) { $file = $absolute = $fragment = false; // Files don't end with / if (!in_array(substr($rule, -1), array('\\', '/'))) $file = true; // If rule starts with a / then treat as absolute path elseif (in_array(substr($rule, 0, 1), array('\\', '/'))) $absolute = true; // Otherwise treat as dir fragment else $fragment = true; // Strip $this->root and conform $rule = str_ireplace($this->get_root(), '', untrailingslashit(self::conform_dir($rule))); // Strip the preceeding slash if (in_array(substr($rule, 0, 1), array('\\', '/'))) $rule = substr($rule, 1); // Escape string for regex if ($context === 'regex') $rule = str_replace('.', '\.', $rule); // Convert any existing wildcards if ($wildcard !== '*' && strpos($rule, '*') !== false) $rule = str_replace('*', $wildcard, $rule); // Wrap directory fragments and files in wildcards for zip if ($context === 'zip' && ( $fragment || $file )) $rule = $wildcard . $rule . $wildcard; // Add a wildcard to the end of absolute url for zips if ($context === 'zip' && $absolute) $rule .= $wildcard; // Add and end carrot to files for pclzip but only if it doesn't end in a wildcard if ($file && $context === 'regex') $rule .= '$'; // Add a start carrot to absolute urls for pclzip if ($absolute && $context === 'regex') $rule = '^' . $rule; } } // Escape shell args for zip command if ($context === 'zip') $excludes = array_map('escapeshellarg', array_unique($excludes)); return implode($separator, $excludes); } public function get_archive_method() { return $this->archive_method; } public function verify_archive($WPDBFileName) { // If we've already passed then no need to check again if (!empty($this->archive_verified)) return true; // If there are errors delete the backup file. if ($this->get_errors($this->get_archive_method()) && file_exists($WPDBFileName)) wp_delete_file($WPDBFileName); // If the archive file still exists assume it's good if (file_exists($WPDBFileName)) return $this->archive_verified = true; return false; } public function get_files() { if (!empty($this->files)) return $this->files; $this->files = array(); // We only want to use the RecursiveDirectoryIterator if the FOLLOW_SYMLINKS flag is available if (defined('RecursiveDirectoryIterator::FOLLOW_SYMLINKS')) { $this->files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($this->get_root(), RecursiveDirectoryIterator::FOLLOW_SYMLINKS), RecursiveIteratorIterator::SELF_FIRST, RecursiveIteratorIterator::CATCH_GET_CHILD); // Skip dot files if the SKIP_Dots flag is available if (defined('RecursiveDirectoryIterator::SKIP_DOTS')) $this->files->setFlags(RecursiveDirectoryIterator::SKIP_DOTS + RecursiveDirectoryIterator::FOLLOW_SYMLINKS); // If RecursiveDirectoryIterator::FOLLOW_SYMLINKS isn't available then fallback to a less memory efficient method } else { $this->files = $this->get_files_fallback($this->get_root()); } return $this->files; } public function wpdbbkp_get_timeago( $time ) { $time = intval($time) > 0 ? intval($time) : time(); $time_difference = time() - $time; if( $time_difference < 1 ) { return 'less than 1 second ago'; } $condition = array( 12 * 30 * 24 * 60 * 60 => 'year', 30 * 24 * 60 * 60 => 'month', 24 * 60 * 60 => 'day', 60 * 60 => 'hour', 60 => 'minute', 1 => 'second' ); foreach( $condition as $secs => $str ) { $d = $time_difference / $secs; if( $d >= 1 ) { $t = floor( $d ); return 'About ' . $t . ' ' . $str . ( $t > 1 ? 's' : '' ) . ' ago'; } } } private function wpdbbkp_append_to_file($file_path, $content_to_append){ global $wp_filesystem; if (!function_exists('WP_Filesystem')) { require_once ABSPATH . 'wp-admin/includes/file.php'; } if (empty($wp_filesystem)) { WP_Filesystem(); } if (!$wp_filesystem) { return false; } // Check if the file exists if ($wp_filesystem->exists($file_path)) { // Open the file in append mode $handle = $wp_filesystem->get_contents($file_path); if ($handle) { // Append the new content $result = $wp_filesystem->put_contents($file_path, $handle . $content_to_append, FS_CHMOD_FILE); return $result !== false; } } else { // If the file doesn't exist, create it with the initial content $result = $wp_filesystem->put_contents($file_path, $content_to_append, FS_CHMOD_FILE); return $result !== false; } return false; } public function wpdbbkp_cloudbackup_notice(){ $user_id = get_current_user_id(); $wpdbbkp_cloudbackup_notice = get_option( 'wpdb_clouddrive_token', false ); if( $wpdbbkp_cloudbackup_notice ){ return; } if ( ! current_user_can( 'manage_options' ) ) { return; } if ( get_user_meta( $user_id, 'wpdbbkp_cloudbackup_notice_dismissed', true ) ) { return; } $nonce = wp_create_nonce( 'wpdbbkp_cloudbackup_notice_dismissed' ) ?>

'.esc_html__('Get Started in 2 Minutes.', 'wpdbbkp'). '';?>

403 ] ); } // Verify the nonce if ( ! isset( $_POST['nonce'] ) || ! wp_verify_nonce( wp_unslash( $_POST['nonce'] ), 'wpdbbkp_cloudbackup_notice_dismissed' ) ) { //phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- using as nonce wp_die( esc_html__( 'Invalid nonce', 'wpdbbkp' ), '', [ 'response' => 403 ] ); } $user_id = get_current_user_id(); update_user_meta( $user_id, 'wpdbbkp_cloudbackup_notice_dismissed', 1 ); wp_die(); } public function admin_backup_file_download() { if ( ! current_user_can( 'manage_options' ) ) { return; } // Check for a specific query parameter, e.g., ?download_backup=filename.zip if ( isset( $_GET['wpdbbkp_download'] ) && ! empty( $_GET['wpdbbkp_download'] ) ) { //phpcs:ignore WordPress.Security.NonceVerification.Recommended -- no form submission $path_info = wp_upload_dir(); $backup_dir = $path_info['basedir'] . '/' . WPDB_BACKUPS_DIR . '/'; $file_name = basename( sanitize_text_field( wp_unslash( $_GET['wpdbbkp_download'] ) ) ); //phpcs:ignore WordPress.Security.NonceVerification.Recommended -- no form submission $file_path = trailingslashit( $backup_dir ) . $file_name; // Check if file exists if ( file_exists( $file_path ) ) { // Serve the file header( 'Content-Description: File Transfer' ); header( 'Content-Type: application/octet-stream' ); header( 'Content-Disposition: attachment; filename="' . $file_name . '"' ); header( 'Content-Length: ' . filesize( $file_path ) ); readfile( $file_path ); //phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_readfile -- readfile is used to read the file with buffer exit; } else { wp_die( esc_html__( 'Backup file not found.', 'wpdbbkp' ) ); } } // Check for a specific query parameter, e.g., ?download_backup=filename.zip if ( isset( $_GET['wpdbbkp_log'] ) && ! empty( $_GET['wpdbbkp_log'] ) ) { //phpcs:ignore WordPress.Security.NonceVerification.Recommended -- no form submission $path_info = wp_upload_dir(); $backup_dir = $path_info['basedir'] . '/' . WPDB_BACKUPS_DIR . '/log/'; $file_name = basename( sanitize_text_field( wp_unslash( $_GET['wpdbbkp_log'] ) ) ); //phpcs:ignore WordPress.Security.NonceVerification.Recommended -- no form submission $file_path = trailingslashit( $backup_dir ) . $file_name; // Check if file exists if ( file_exists( $file_path ) ) { // Serve the file header( 'Content-Description: File Transfer' ); header( 'Content-Type: application/octet-stream' ); header( 'Content-Disposition: attachment; filename="' . $file_name . '"' ); header( 'Content-Length: ' . filesize( $file_path ) ); readfile( $file_path ); //phpcs:ignore WordPress.WP.AlternativeFunctions.file_system_operations_readfile -- readfile is used to read the file with buffer exit; } else { wp_die( esc_html__( 'Backup file not found.', 'wpdbbkp' ) ); } } } } new Wpdb_Admin();