Migration, Backup, Staging – WPvivid - Version 0.9.15

Version Description

  • Fixed: Scheduled backups failed to run as configured after the last update.
  • Improved the Restore UI.
  • Refined some descriptions in the UI.
Download this release

Release Info

Developer wpvivid
Plugin Icon 128x128 Migration, Backup, Staging – WPvivid
Version 0.9.15
Comparing to
See all releases

Code changes from version 0.9.14 to 0.9.15

admin/js/wpvivid-admin.js CHANGED
@@ -20,6 +20,7 @@ var wpvivid_get_download_restore_progress_retry = 0;
20
  var wpvivid_restore_timeout = false;
21
  var wpvivid_restore_need_download = false;
22
  var wpvivid_restore_backup_old_site = false;
 
23
 
24
  (function ($) {
25
  'use strict';
@@ -177,6 +178,26 @@ var wpvivid_restore_backup_old_site = false;
177
 
178
  })(jQuery);
179
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
180
  window.onbeforeunload = function(e) {
181
  if (wpvivid_settings_changed) {
182
  if (wpvivid_location_href){
@@ -565,6 +586,25 @@ function wpvivid_start_backup(){
565
  }
566
  if(bcheck) {
567
  var backup_data = wpvivid_ajax_data_transfer('backup');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
568
  var ajax_data = {
569
  'action': 'wpvivid_prepare_backup',
570
  'backup': backup_data
@@ -1701,13 +1741,17 @@ function wpvivid_init_restore_data(restore_type){
1701
  else if(restore_type == 'transfer'){
1702
  restore_method = 'transfer_';
1703
  }
 
 
1704
  jQuery('#wpvivid_restore_'+restore_method+'btn').css({'pointer-events': 'none', 'opacity': '0.4'});
1705
  jQuery('#wpvivid_clean_'+restore_method+'restore').css({'pointer-events': 'none', 'opacity': '0.4'});
1706
  jQuery('#wpvivid_rollback_'+restore_method+'btn').css({'pointer-events': 'none', 'opacity': '0.4'});
1707
- jQuery('#wpvivid_restore_'+restore_method+'part').hide();
1708
  jQuery('#wpvivid_clean_'+restore_method+'part').hide();
1709
  jQuery('#wpvivid_rollback_'+restore_method+'part').hide();
1710
- jQuery('#wpvivid_restore_is_migrate').hide();
 
 
1711
  jQuery('#wpvivid_restore_backup_old_site').hide();
1712
  var ajax_data = {
1713
  'action':'wpvivid_init_restore_page',
@@ -1759,6 +1803,8 @@ function wpvivid_init_restore_data(restore_type){
1759
  });
1760
  jQuery('#wpvivid_restore_' + restore_method + 'part').show();
1761
  jQuery('#wpvivid_restore_backup_old_site').show();
 
 
1762
  if (jsonarray.is_migrate === 1) {
1763
  jQuery('#wpvivid_restore_is_migrate').show();
1764
  jQuery('#wpvivid_restore_' + restore_method + 'btn').css({'pointer-events': 'none', 'opacity': '0.4'});
@@ -1793,7 +1839,7 @@ function wpvivid_init_restore_data(restore_type){
1793
  jQuery('#wpvivid_clean_' + restore_method + 'part').show();
1794
  jQuery('#wpvivid_restore_is_migrate').hide();
1795
  jQuery('#wpvivid_restore_backup_old_site').hide();
1796
- wpvivid_display_restore_msg("An uncompleted restore task exists, please delete it first.", restore_type);
1797
  }
1798
  }
1799
  }
@@ -2315,7 +2361,7 @@ function wpvivid_delete_incompleted_restore(restore_type = 'backup'){
2315
  try {
2316
  var jsonarray = jQuery.parseJSON(data);
2317
  if (jsonarray.result === "success") {
2318
- wpvivid_display_restore_msg("A restore task is removed.", restore_type);
2319
  wpvivid_init_restore_data(restore_type);
2320
  }
2321
  }
20
  var wpvivid_restore_timeout = false;
21
  var wpvivid_restore_need_download = false;
22
  var wpvivid_restore_backup_old_site = false;
23
+ var wpvivid_display_restore_backup = false;
24
 
25
  (function ($) {
26
  'use strict';
178
 
179
  })(jQuery);
180
 
181
+ function click_dismiss_restore_notice(obj){
182
+ wpvivid_display_restore_backup = false;
183
+ jQuery(obj).parent().remove();
184
+ }
185
+
186
+ function wpvivid_click_how_to_restore_backup(){
187
+ if(!wpvivid_display_restore_backup){
188
+ wpvivid_display_restore_backup = true;
189
+ var div = "<div class='notice notice-info is-dismissible inline'>" +
190
+ "<p>Step One: Click the button called 'Restore' which is next to 'Log' button, then a new Tab (Restore Tab) is going to be created</p>" +
191
+ "<p>Step Two: Choose an option to complete restore, if any</p>" +
192
+ "<p>Step Three: Click 'Restore' button</p>" +
193
+ "<button type='button' class='notice-dismiss' onclick='click_dismiss_restore_notice(this);'>" +
194
+ "<span class='screen-reader-text'>Dismiss this notice.</span>" +
195
+ "</button>" +
196
+ "</div>";
197
+ jQuery('#wpvivid_how_to_restore_backup').append(div);
198
+ }
199
+ }
200
+
201
  window.onbeforeunload = function(e) {
202
  if (wpvivid_settings_changed) {
203
  if (wpvivid_location_href){
586
  }
587
  if(bcheck) {
588
  var backup_data = wpvivid_ajax_data_transfer('backup');
589
+ backup_data = JSON.parse(backup_data);
590
+ jQuery('input:radio[option=backup_ex]').each(function() {
591
+ if(jQuery(this).prop('checked'))
592
+ {
593
+ var key = jQuery(this).prop('name');
594
+ var value = jQuery(this).prop('value');
595
+ var json = new Array();
596
+ if(value == 'local'){
597
+ json['local']='1';
598
+ json['remote']='0';
599
+ }
600
+ else if(value == 'remote'){
601
+ json['local']='0';
602
+ json['remote']='1';
603
+ }
604
+ }
605
+ jQuery.extend(backup_data, json);
606
+ });
607
+ backup_data = JSON.stringify(backup_data);
608
  var ajax_data = {
609
  'action': 'wpvivid_prepare_backup',
610
  'backup': backup_data
1741
  else if(restore_type == 'transfer'){
1742
  restore_method = 'transfer_';
1743
  }
1744
+ jQuery('#wpvivid_replace_domain').prop('checked', false);
1745
+ jQuery('#wpvivid_keep_domain').prop('checked', false);
1746
  jQuery('#wpvivid_restore_'+restore_method+'btn').css({'pointer-events': 'none', 'opacity': '0.4'});
1747
  jQuery('#wpvivid_clean_'+restore_method+'restore').css({'pointer-events': 'none', 'opacity': '0.4'});
1748
  jQuery('#wpvivid_rollback_'+restore_method+'btn').css({'pointer-events': 'none', 'opacity': '0.4'});
1749
+ jQuery('#wpvivid_restore_'+restore_method+'part').show();
1750
  jQuery('#wpvivid_clean_'+restore_method+'part').hide();
1751
  jQuery('#wpvivid_rollback_'+restore_method+'part').hide();
1752
+ jQuery('#wpvivid_restore_is_migrate').show();
1753
+ jQuery('#wpvivid_restore_is_migrate').css({'pointer-events': 'none', 'opacity': '0.4'});
1754
+ jQuery('#wpvivid_init_restore_data').addClass('is-active');
1755
  jQuery('#wpvivid_restore_backup_old_site').hide();
1756
  var ajax_data = {
1757
  'action':'wpvivid_init_restore_page',
1803
  });
1804
  jQuery('#wpvivid_restore_' + restore_method + 'part').show();
1805
  jQuery('#wpvivid_restore_backup_old_site').show();
1806
+ jQuery('#wpvivid_restore_is_migrate').css({'pointer-events': 'auto', 'opacity': '1'});
1807
+ jQuery('#wpvivid_init_restore_data').removeClass('is-active');
1808
  if (jsonarray.is_migrate === 1) {
1809
  jQuery('#wpvivid_restore_is_migrate').show();
1810
  jQuery('#wpvivid_restore_' + restore_method + 'btn').css({'pointer-events': 'none', 'opacity': '0.4'});
1839
  jQuery('#wpvivid_clean_' + restore_method + 'part').show();
1840
  jQuery('#wpvivid_restore_is_migrate').hide();
1841
  jQuery('#wpvivid_restore_backup_old_site').hide();
1842
+ wpvivid_display_restore_msg("An uncompleted restore task exists, please terminate it first.", restore_type);
1843
  }
1844
  }
1845
  }
2361
  try {
2362
  var jsonarray = jQuery.parseJSON(data);
2363
  if (jsonarray.result === "success") {
2364
+ wpvivid_display_restore_msg("The restore task is terminated.", restore_type);
2365
  wpvivid_init_restore_data(restore_type);
2366
  }
2367
  }
admin/partials/wpvivid-backup-restore-page-display.php CHANGED
@@ -66,13 +66,13 @@ function wpvivid_backup_manual(){
66
  <fieldset>
67
  <legend class="screen-reader-text"><span>input type="checkbox"</span></legend>
68
  <label>
69
- <input type="checkbox" id="wpvivid_backup_local" option="backup" name="local" value="" checked readonly/>
70
  <span><?php _e( 'Save Backups to Local', 'wpvivid' ); ?></span>
71
  </label>
72
 
73
  <div style="clear:both;"></div>
74
  <label>
75
- <input type="checkbox" id="wpvivid_backup_remote" option="backup" name="remote" value="" />
76
  <span><?php _e( 'Send Backup to Remote Storage:', 'wpvivid' ); ?></span>
77
  </label><br>
78
  <div id="upload_storage" style="cursor:pointer;" title="Highlighted icon illuminates that you have choosed a remote storage to store backups">
@@ -346,8 +346,9 @@ function wpvivid_add_page_restore(){
346
  </label><br>-->
347
  </div>
348
  <div class="restore-button-position" id="wpvivid_restore_part"><input class="button-primary" id="wpvivid_restore_btn" type="submit" name="restore" value="<?php esc_attr_e( 'Restore', 'wpvivid' ); ?>" onclick="wpvivid_start_restore();" /></div>
349
- <div class="restore-button-position" id="wpvivid_clean_part"><input class="button-primary" id="wpvivid_clean_restore" type="submit" name="clear_restore" value="<?php esc_attr_e( 'Clean Restore', 'wpvivid' ); ?>" /></div>
350
  <div class="restore-button-position" id="wpvivid_rollback_part"><input class="button-primary" id="wpvivid_rollback_btn" type="submit" name="rollback" value="<?php esc_attr_e( 'Rollback', 'wpvivid' ); ?>" /></div>
 
351
  </div>
352
  <div class="postbox restore_log" id="wpvivid_restore_log">
353
  <!--<div id="wpvivid_restore_log" style="overflow-y: scroll;"></div>-->
@@ -417,7 +418,7 @@ function wpvivid_backup_do_js(){
417
  }
418
 
419
  function wpvivid_download_backup_descript($html){
420
- $html = '<p><strong>'.__('How to download a backup', 'wpvivid').'</strong></p>';
421
  $html .= '<ul>';
422
  $html .= '<li>'.__('->If backups are stored in remote storage, our plugin will retrieve the backup to your web server first. This may take a little time depending on the size of backup files. Please be patient. Then you can download them to your PC.', 'wpvivid').'</li>';
423
  $html .= '<li>'.__('->If backups are stored in web server, the plugin will list all relevant files immediately.', 'wpvivid').'</li>';
@@ -426,11 +427,8 @@ function wpvivid_download_backup_descript($html){
426
  }
427
 
428
  function wpvivid_restore_website_dexcript($html){
429
- $html = '<p><strong>'.__('How to restore your website from a backup', 'wpvivid').'</strong></p>';
430
- $html .= '<ul>';
431
- $html .= '<li>'.__('Step One: Click the button called \'Restore\' which is next to \'Log\' button, then a new Tab (Restore Tab) is going to be created', 'wpvivid').'</li>';
432
- $html .= '<li>'.__('Step Two: Click \'Restore\' button', 'wpvivid').'</li>';
433
- $html .= '</ul>';
434
  return $html;
435
  }
436
 
66
  <fieldset>
67
  <legend class="screen-reader-text"><span>input type="checkbox"</span></legend>
68
  <label>
69
+ <input type="radio" id="wpvivid_backup_local" option="backup_ex" name="local_remote" value="local" checked />
70
  <span><?php _e( 'Save Backups to Local', 'wpvivid' ); ?></span>
71
  </label>
72
 
73
  <div style="clear:both;"></div>
74
  <label>
75
+ <input type="radio" id="wpvivid_backup_remote" option="backup_ex" name="local_remote" value="remote" />
76
  <span><?php _e( 'Send Backup to Remote Storage:', 'wpvivid' ); ?></span>
77
  </label><br>
78
  <div id="upload_storage" style="cursor:pointer;" title="Highlighted icon illuminates that you have choosed a remote storage to store backups">
346
  </label><br>-->
347
  </div>
348
  <div class="restore-button-position" id="wpvivid_restore_part"><input class="button-primary" id="wpvivid_restore_btn" type="submit" name="restore" value="<?php esc_attr_e( 'Restore', 'wpvivid' ); ?>" onclick="wpvivid_start_restore();" /></div>
349
+ <div class="restore-button-position" id="wpvivid_clean_part"><input class="button-primary" id="wpvivid_clean_restore" type="submit" name="clear_restore" value="<?php esc_attr_e( 'Terminate', 'wpvivid' ); ?>" /></div>
350
  <div class="restore-button-position" id="wpvivid_rollback_part"><input class="button-primary" id="wpvivid_rollback_btn" type="submit" name="rollback" value="<?php esc_attr_e( 'Rollback', 'wpvivid' ); ?>" /></div>
351
+ <div class="spinner" id="wpvivid_init_restore_data" style="float:left;width:auto;height:auto;padding:10px 20px 20px 0;background-position:0 10px;"></div>
352
  </div>
353
  <div class="postbox restore_log" id="wpvivid_restore_log">
354
  <!--<div id="wpvivid_restore_log" style="overflow-y: scroll;"></div>-->
418
  }
419
 
420
  function wpvivid_download_backup_descript($html){
421
+ $html = '<p><strong>'.__('About backup download', 'wpvivid').'</strong></p>';
422
  $html .= '<ul>';
423
  $html .= '<li>'.__('->If backups are stored in remote storage, our plugin will retrieve the backup to your web server first. This may take a little time depending on the size of backup files. Please be patient. Then you can download them to your PC.', 'wpvivid').'</li>';
424
  $html .= '<li>'.__('->If backups are stored in web server, the plugin will list all relevant files immediately.', 'wpvivid').'</li>';
427
  }
428
 
429
  function wpvivid_restore_website_dexcript($html){
430
+ $html = '<p><a href="#" onclick="wpvivid_click_how_to_restore_backup();">'.__('How to restore your website from a backup(scheduled, manual, uploaded and received backup)', 'wpvivid').'</a></p>';
431
+ $html .= '<div id="wpvivid_how_to_restore_backup"></div>';
 
 
 
432
  return $html;
433
  }
434
 
includes/class-wpvivid-backup-uploader.php CHANGED
@@ -255,12 +255,13 @@ class Wpvivid_BackupUploader
255
 
256
  static function rescan_local_folder()
257
  {
 
258
  ?>
259
  <div style="padding-top: 10px;">
260
- <span>Note: To rescan backups list is available for the backups created by 0.9.14 or higher version, but not including backups stored in remote storage.</span>
261
  </div>
262
  <div style="padding-top: 10px;">
263
- <input type="submit" class="button-primary" value="Rescan backups list" onclick="wpvivid_rescan_local_folder();" />
264
  </div>
265
  <script type="text/javascript">
266
  function wpvivid_rescan_local_folder()
255
 
256
  static function rescan_local_folder()
257
  {
258
+ $backupdir=WPvivid_Setting::get_backupdir();
259
  ?>
260
  <div style="padding-top: 10px;">
261
+ <span>Tips: Click the button below to scan all uploaded or received backups in directory <?php echo WP_CONTENT_DIR.'/'.$backupdir; ?></span>
262
  </div>
263
  <div style="padding-top: 10px;">
264
+ <input type="submit" class="button-primary" value="Scan localhost" onclick="wpvivid_rescan_local_folder();" />
265
  </div>
266
  <script type="text/javascript">
267
  function wpvivid_rescan_local_folder()
includes/class-wpvivid-migrate.php CHANGED
@@ -275,73 +275,72 @@ class WPvivid_Migrate
275
 
276
  public function send_backup_to_site()
277
  {
278
- //if(isset($_POST['url']))
279
- //{
280
- $options=WPvivid_Setting::get_option('wpvivid_saved_api_token');
281
-
282
- if(empty($options))
283
- {
284
- $ret['result'] = 'failed';
285
- $ret['error'] = 'A key is required.';
286
- echo json_encode($ret);
287
- die();
288
- }
289
- //$options[$url]['url']=$url;
290
 
291
- $url = '';
292
- foreach ($options as $key => $value) {
293
- $url = $value['url'];
294
- }
 
 
295
 
296
- if($url === '')
297
- {
298
- $ret['result'] = 'failed';
299
- $ret['error'] = 'The key is invalid.';
300
- echo json_encode($ret);
301
- die();
302
- }
303
 
304
- if($options[$url]['expires'] !=0 && $options[$url]['expires']<time())
305
- {
306
- $ret['result'] = 'failed';
307
- $ret['error'] = 'The key has expired.';
308
- echo json_encode($ret);
309
- die();
310
- }
311
 
312
- if(WPvivid_taskmanager::is_tasks_backup_running())
313
- {
314
- $ret['result']='failed';
315
- $ret['error']=__('A task is already running. Please wait until the running task is complete, and try again.', 'wpvivid');
316
- return $ret;
317
- }
318
 
319
- $remote_option['url']=$options[$url]['url'];
320
- $remote_option['token']=$options[$url]['token'];
321
- $remote_option['type']=WPVIVID_REMOTE_SEND_TO_SITE;
322
- $remote_options['temp']=$remote_option;
 
 
323
 
324
- $backup_options = stripslashes($_POST['backup_options']);
325
- $backup_options = json_decode($backup_options, true);
326
- $backup['backup_files']= $backup_options['backup_type'];
327
- $backup['local']=0;
328
- $backup['remote']=1;
329
- $backup['ismerge']=1;
330
- $backup['lock']=0;
331
- $backup['remote_options']=$remote_options;
332
 
333
- $backup_task=new WPvivid_Backup_Task();
334
- $ret=$backup_task->new_backup_task($backup,'Manual', 'transfer');
 
 
 
 
 
 
335
 
336
- $task_id=$ret['task_id'];
 
337
 
338
- global $wpvivid_pulgin;
339
 
340
- $wpvivid_pulgin->check_backup($task_id,$backup['backup_files']);
341
- //$wpvivid_pulgin->backup($task_id);
342
- //}
343
- echo json_encode($ret);
344
- die();
 
 
 
 
 
 
345
  }
346
 
347
  public function migrate_now()
@@ -518,7 +517,7 @@ class WPvivid_Migrate
518
  <input type="text" id="wpvivid_send_remote_site_url_text" value="'.$token.'" readonly="readonly" />
519
  <input class="button-primary" id="wpvivid_delete_key_button" type="submit" value="'.esc_attr( 'Delete', 'wpvivid' ).'" onclick="wpvivid_click_delete_transfer_key();" />
520
  </div>
521
- <p>'.__('Time remaining:', 'wpvivid').$key_status.'</p>
522
  <p>The connection is ok. Now you can transfer the site <strong>'.$source_dir.'</strong> to the site <strong>'.$target_dir.'</strong></p>';
523
  }
524
  return $html;
@@ -531,7 +530,7 @@ class WPvivid_Migrate
531
  <div id="migrate-page" class="wrap-tab-content wpvivid_tab_migrate" name="tab-migrate" style="display: none;">
532
  <div style="padding: 0 0 10px 0;">
533
  <?php
534
- _e('The feature can help you transfer a Wordpress site to a new domain. It would be useful to migrate your WP site from dev environment to live server or from old server to the new.', 'wpvivid');
535
  ?>
536
  </div>
537
 
@@ -561,15 +560,15 @@ class WPvivid_Migrate
561
  <fieldset>
562
  <legend class="screen-reader-text"><span>input type="radio"</span></legend>
563
  <label>
564
- <input type="radio" option="migrate" name="backup_type" value="files+db" checked />
565
  <span><?php _e( 'Database + Files (Entire website)', 'wpvivid' ); ?></span>
566
  </label><br>
567
  <label>
568
- <input type="radio" option="migrate" name="backup_type" value="files" />
569
  <span><?php _e( 'All Files (Exclude Database)', 'wpvivid' ); ?></span>
570
  </label><br>
571
  <label>
572
- <input type="radio" option="migrate" name="backup_type" value="db" />
573
  <span><?php _e( 'Only Database', 'wpvivid' ); ?></span>
574
  </label><br>
575
  </fieldset>
@@ -583,13 +582,13 @@ class WPvivid_Migrate
583
  </div>
584
  <div style="clear: both;"></div>
585
  <div style="padding: 10px 0 10px 0;">
586
- <p><strong>Tips: </strong>If the network connection between servers is unstable, this could cause a failure of files transfer. In this case, uploading backups to destination site is a good alternative to the automatic website migration.</p>
587
- <p><strong>How to migrate Wordpress site manually to a new domain with WPvivid backup plugin?</strong></p>
588
- <p>1. Download the backup in backups list to your computer.</p>
589
- <p>2. Upload backup to destination site. There are two ways available to use:</p>
590
- <p style="margin-left: 20px;">2.1 Upload backup to the upload section of WPvivid backup plugin in destination site.</p>
591
- <p style="margin-left: 20px;">2.2 Upload backup with FTP client to backup directory <?php echo WP_CONTENT_DIR.'/'.$backupdir; ?> in destination site and <strong>rescan backups list</strong>.</p>
592
- <p>3. Once done, the backup shows in backups list. Then, restore the backup.</p>
593
  </div>
594
  </div>
595
  </div>
@@ -754,7 +753,7 @@ class WPvivid_Migrate
754
  }
755
  }, function (XMLHttpRequest, textStatus, errorThrown)
756
  {
757
- var error_message = wpvivid_output_ajaxerror('transferring website', textStatus, errorThrown);
758
  wpvivid_delete_transfer_ready_task(error_message);
759
  });
760
  }
@@ -817,20 +816,26 @@ class WPvivid_Migrate
817
  });
818
  }
819
 
 
 
820
  function click_dismiss_key_notice(obj){
 
821
  jQuery(obj).parent().remove();
822
  }
823
 
824
  function wpvivid_click_how_to_get_key(){
825
- var div = "<div class='notice notice-info is-dismissible inline'>" +
826
- "<p>1. Visit Generate Key tab page of WPvivid backup plugin of destination site.</p>" +
827
- "<p>2. Generate a key by clicking Generate button and copy it.</p>" +
828
- "<p>3. Go back to this page and paste the key in key box below. Lastly, click Save button.</p>" +
829
- "<button type='button' class='notice-dismiss' onclick='click_dismiss_key_notice(this);'>" +
830
- "<span class='screen-reader-text'>Dismiss this notice.</span>" +
831
- "</button>" +
832
- "</div>";
833
- jQuery('#wpvivid_how_to_get_key').append(div);
 
 
 
834
  }
835
 
836
  var migrate_task_need_update=true;
@@ -1031,6 +1036,7 @@ class WPvivid_Migrate
1031
  <option value="24 hour">24 hours</option>
1032
  <!--<option value="Never">Never</option>-->
1033
  </select>
 
1034
  <div>
1035
  <input class="button-primary" id="wpvivid_generate_url" type="submit" value="<?php esc_attr_e( 'Generate', 'wpvivid' ); ?>" onclick="wpvivid_click_generate_url();" />
1036
  </div>
275
 
276
  public function send_backup_to_site()
277
  {
278
+ try {
279
+ $options = WPvivid_Setting::get_option('wpvivid_saved_api_token');
 
 
 
 
 
 
 
 
 
 
280
 
281
+ if (empty($options)) {
282
+ $ret['result'] = 'failed';
283
+ $ret['error'] = 'A key is required.';
284
+ echo json_encode($ret);
285
+ die();
286
+ }
287
 
288
+ $url = '';
289
+ foreach ($options as $key => $value) {
290
+ $url = $value['url'];
291
+ }
 
 
 
292
 
293
+ if ($url === '') {
294
+ $ret['result'] = 'failed';
295
+ $ret['error'] = 'The key is invalid.';
296
+ echo json_encode($ret);
297
+ die();
298
+ }
 
299
 
300
+ if ($options[$url]['expires'] != 0 && $options[$url]['expires'] < time()) {
301
+ $ret['result'] = 'failed';
302
+ $ret['error'] = 'The key has expired.';
303
+ echo json_encode($ret);
304
+ die();
305
+ }
306
 
307
+ if (WPvivid_taskmanager::is_tasks_backup_running()) {
308
+ $ret['result'] = 'failed';
309
+ $ret['error'] = __('A task is already running. Please wait until the running task is complete, and try again.', 'wpvivid');
310
+ echo json_encode($ret);
311
+ die();
312
+ }
313
 
314
+ $remote_option['url'] = $options[$url]['url'];
315
+ $remote_option['token'] = $options[$url]['token'];
316
+ $remote_option['type'] = WPVIVID_REMOTE_SEND_TO_SITE;
317
+ $remote_options['temp'] = $remote_option;
 
 
 
 
318
 
319
+ $backup_options = stripslashes($_POST['backup_options']);
320
+ $backup_options = json_decode($backup_options, true);
321
+ $backup['backup_files'] = $backup_options['backup_type'];
322
+ $backup['local'] = 0;
323
+ $backup['remote'] = 1;
324
+ $backup['ismerge'] = 1;
325
+ $backup['lock'] = 0;
326
+ $backup['remote_options'] = $remote_options;
327
 
328
+ $backup_task = new WPvivid_Backup_Task();
329
+ $ret = $backup_task->new_backup_task($backup, 'Manual', 'transfer');
330
 
331
+ $task_id = $ret['task_id'];
332
 
333
+ global $wpvivid_pulgin;
334
+ $wpvivid_pulgin->check_backup($task_id, $backup['backup_files']);
335
+ echo json_encode($ret);
336
+ die();
337
+ }
338
+ catch (Exception $e){
339
+ $ret['result'] = 'failed';
340
+ $ret['error'] = $e->getMessage();
341
+ echo json_encode($ret);
342
+ die();
343
+ }
344
  }
345
 
346
  public function migrate_now()
517
  <input type="text" id="wpvivid_send_remote_site_url_text" value="'.$token.'" readonly="readonly" />
518
  <input class="button-primary" id="wpvivid_delete_key_button" type="submit" value="'.esc_attr( 'Delete', 'wpvivid' ).'" onclick="wpvivid_click_delete_transfer_key();" />
519
  </div>
520
+ <p>'.__('The key will expire in: ', 'wpvivid').$key_status.__('. Once the key expires, you need to generate a new key.', 'wpvivid').'</p>
521
  <p>The connection is ok. Now you can transfer the site <strong>'.$source_dir.'</strong> to the site <strong>'.$target_dir.'</strong></p>';
522
  }
523
  return $html;
530
  <div id="migrate-page" class="wrap-tab-content wpvivid_tab_migrate" name="tab-migrate" style="display: none;">
531
  <div style="padding: 0 0 10px 0;">
532
  <?php
533
+ _e('The feature can help you transfer a Wordpress site to a new domain(site). It would be a convenient way to migrate your WP site from dev environment to live server or from old server to the new.', 'wpvivid');
534
  ?>
535
  </div>
536
 
560
  <fieldset>
561
  <legend class="screen-reader-text"><span>input type="radio"</span></legend>
562
  <label>
563
+ <input type="radio" option="migrate" name="transfer_type" value="files+db" checked />
564
  <span><?php _e( 'Database + Files (Entire website)', 'wpvivid' ); ?></span>
565
  </label><br>
566
  <label>
567
+ <input type="radio" option="migrate" name="transfer_type" value="files" />
568
  <span><?php _e( 'All Files (Exclude Database)', 'wpvivid' ); ?></span>
569
  </label><br>
570
  <label>
571
+ <input type="radio" option="migrate" name="transfer_type" value="db" />
572
  <span><?php _e( 'Only Database', 'wpvivid' ); ?></span>
573
  </label><br>
574
  </fieldset>
582
  </div>
583
  <div style="clear: both;"></div>
584
  <div style="padding: 10px 0 10px 0;">
585
+ <p><strong>Tips: </strong>The unstable connection between sites could cause a failure of files transfer. In this case, uploading backups to destination site is a good alternative to the automatic website migration.</p>
586
+ <p><strong>How to migrate Wordpress site manually to a new domain(site) with WPvivid backup plugin?</strong></p>
587
+ <p>1. Download a backup in backups list to your computer.</p>
588
+ <p>2. Upload the backup to destination site. There are two ways available to use:</p>
589
+ <p style="margin-left: 20px;">2.1 Upload the backup to the upload section of WPvivid backup plugin in destination site.</p>
590
+ <p style="margin-left: 20px;">2.2 Upload the backup with FTP client to backup directory <?php echo WP_CONTENT_DIR.'/'.$backupdir; ?> in destination site, then click <strong>Scan localhost</strong> button.</p>
591
+ <p>3. Once done, the backup appears in backups list. Then, restore the backup.</p>
592
  </div>
593
  </div>
594
  </div>
753
  }
754
  }, function (XMLHttpRequest, textStatus, errorThrown)
755
  {
756
+ var error_message = wpvivid_output_ajaxerror('prepare to export website', textStatus, errorThrown);
757
  wpvivid_delete_transfer_ready_task(error_message);
758
  });
759
  }
816
  });
817
  }
818
 
819
+ var wpvivid_display_get_key = false;
820
+
821
  function click_dismiss_key_notice(obj){
822
+ wpvivid_display_get_key = false;
823
  jQuery(obj).parent().remove();
824
  }
825
 
826
  function wpvivid_click_how_to_get_key(){
827
+ if(!wpvivid_display_get_key) {
828
+ wpvivid_display_get_key = true;
829
+ var div = "<div class='notice notice-info is-dismissible inline'>" +
830
+ "<p>1. Visit Generate Key tab page of WPvivid backup plugin of destination site.</p>" +
831
+ "<p>2. Generate a key by clicking Generate button and copy it.</p>" +
832
+ "<p>3. Go back to this page and paste the key in key box below. Lastly, click Save button.</p>" +
833
+ "<button type='button' class='notice-dismiss' onclick='click_dismiss_key_notice(this);'>" +
834
+ "<span class='screen-reader-text'>Dismiss this notice.</span>" +
835
+ "</button>" +
836
+ "</div>";
837
+ jQuery('#wpvivid_how_to_get_key').append(div);
838
+ }
839
  }
840
 
841
  var migrate_task_need_update=true;
1036
  <option value="24 hour">24 hours</option>
1037
  <!--<option value="Never">Never</option>-->
1038
  </select>
1039
+ <p>Tips: For security reason, please choose an appropriate expiration time for the key.</p>
1040
  <div>
1041
  <input class="button-primary" id="wpvivid_generate_url" type="submit" value="<?php esc_attr_e( 'Generate', 'wpvivid' ); ?>" onclick="wpvivid_click_generate_url();" />
1042
  </div>
includes/class-wpvivid-restore-data.php CHANGED
@@ -148,7 +148,8 @@ class WPvivid_restore_data
148
  $rollback_data = require_once plugin_dir_path( dirname( __FILE__ ) ) .'includes/class-wpvivid-rollback-template.php';
149
  $rollback_data['task_id'] = $backup_id;
150
  WPvivid_tools::deldir(dirname($this -> rollback_file));
151
- mkdir(dirname($this -> rollback_file));
 
152
  WPvivid_tools::file_put_array($rollback_data,$this->rollback_file);
153
  }
154
 
148
  $rollback_data = require_once plugin_dir_path( dirname( __FILE__ ) ) .'includes/class-wpvivid-rollback-template.php';
149
  $rollback_data['task_id'] = $backup_id;
150
  WPvivid_tools::deldir(dirname($this -> rollback_file));
151
+ if(!file_exists(dirname($this -> rollback_file)))
152
+ mkdir(dirname($this -> rollback_file));
153
  WPvivid_tools::file_put_array($rollback_data,$this->rollback_file);
154
  }
155
 
includes/class-wpvivid-restore-database.php CHANGED
@@ -892,7 +892,7 @@ class WPvivid_RestoreDB
892
  return $old_string;
893
  }
894
 
895
- private function skip_tables($skip_table,$table_name)
896
  {
897
  $skip_tables[]='adrotate_stats';
898
  $skip_tables[]='login_security_solution_fail';
@@ -944,7 +944,7 @@ class WPvivid_RestoreDB
944
  return $skip_table;
945
  }
946
 
947
- private function skip_rows($skip_rows,$table_name,$column_name)
948
  {
949
  $row['table_name']='posts';
950
  $row['column_name']='guid';
892
  return $old_string;
893
  }
894
 
895
+ public function skip_tables($skip_table,$table_name)
896
  {
897
  $skip_tables[]='adrotate_stats';
898
  $skip_tables[]='login_security_solution_fail';
944
  return $skip_table;
945
  }
946
 
947
+ public function skip_rows($skip_rows,$table_name,$column_name)
948
  {
949
  $row['table_name']='posts';
950
  $row['column_name']='guid';
includes/class-wpvivid-setting.php CHANGED
@@ -455,20 +455,27 @@ class WPvivid_Setting
455
  if($setting)
456
  {
457
  $json['data']['wpvivid_schedule_setting']=self::get_option('wpvivid_schedule_setting');
458
- $json['data']['wpvivid_schedule_setting']['backup_type']=$json['data']['wpvivid_schedule_setting']['backup']['backup_files'];
459
- if($json['data']['wpvivid_schedule_setting']['backup']['local'] == 1){
460
- $json['data']['wpvivid_schedule_setting']['save_local_remote']='local';
461
- }
462
- else{
463
- $json['data']['wpvivid_schedule_setting']['save_local_remote']='remote';
 
 
 
 
 
 
 
 
 
 
 
464
  }
465
- $json['data']['wpvivid_schedule_setting']['lock']=0;
466
- if(wp_get_schedule(WPVIVID_MAIN_SCHEDULE_EVENT))
467
  {
468
- $recurrence = wp_get_schedule(WPVIVID_MAIN_SCHEDULE_EVENT);
469
- $timestamp = wp_next_scheduled(WPVIVID_MAIN_SCHEDULE_EVENT);
470
- $json['data']['wpvivid_schedule_setting']['recurrence']=$recurrence;
471
- $json['data']['wpvivid_schedule_setting']['next_start']=$timestamp;
472
  }
473
  $json['data']['wpvivid_compress_setting']=self::get_option('wpvivid_compress_setting');
474
  $json['data']['wpvivid_local_setting']=self::get_option('wpvivid_local_setting');
@@ -502,8 +509,6 @@ class WPvivid_Setting
502
  {
503
  self::update_option($option_name,$option);
504
  }
505
-
506
-
507
  }
508
 
509
  public static function set_max_backup_count($count)
455
  if($setting)
456
  {
457
  $json['data']['wpvivid_schedule_setting']=self::get_option('wpvivid_schedule_setting');
458
+ if(!empty( $json['data']['wpvivid_schedule_setting']))
459
+ {
460
+ $json['data']['wpvivid_schedule_setting']['backup_type']=$json['data']['wpvivid_schedule_setting']['backup']['backup_files'];
461
+ if($json['data']['wpvivid_schedule_setting']['backup']['local'] == 1){
462
+ $json['data']['wpvivid_schedule_setting']['save_local_remote']='local';
463
+ }
464
+ else{
465
+ $json['data']['wpvivid_schedule_setting']['save_local_remote']='remote';
466
+ }
467
+ $json['data']['wpvivid_schedule_setting']['lock']=0;
468
+ if(wp_get_schedule(WPVIVID_MAIN_SCHEDULE_EVENT))
469
+ {
470
+ $recurrence = wp_get_schedule(WPVIVID_MAIN_SCHEDULE_EVENT);
471
+ $timestamp = wp_next_scheduled(WPVIVID_MAIN_SCHEDULE_EVENT);
472
+ $json['data']['wpvivid_schedule_setting']['recurrence']=$recurrence;
473
+ $json['data']['wpvivid_schedule_setting']['next_start']=$timestamp;
474
+ }
475
  }
476
+ else
 
477
  {
478
+ $json['data']['wpvivid_schedule_setting']=array();
 
 
 
479
  }
480
  $json['data']['wpvivid_compress_setting']=self::get_option('wpvivid_compress_setting');
481
  $json['data']['wpvivid_local_setting']=self::get_option('wpvivid_local_setting');
509
  {
510
  self::update_option($option_name,$option);
511
  }
 
 
512
  }
513
 
514
  public static function set_max_backup_count($count)
includes/class-wpvivid.php CHANGED
@@ -4860,10 +4860,17 @@ class WPvivid {
4860
  foreach ($backuplist as $key=>$value) {
4861
  $row_style = '';
4862
  if($value['type'] == 'Migration' || $value['type'] == 'Upload'){
 
 
 
 
 
 
4863
  $row_style = 'border: 2px solid #006799; box-sizing:border-box; -moz-box-sizing:border-box; -webkit-box-sizing:border-box;';
4864
  }
4865
  else if($value['type'] == 'Manual' || $value['type'] == 'Cron'){
4866
  $row_style = '';
 
4867
  }
4868
 
4869
  if(empty($value['lock'])){
@@ -4914,7 +4921,7 @@ class WPvivid {
4914
  <th class="check-column"><input name="check_backup" type="checkbox" id="'.esc_attr($key, 'wpvivid').'" value="'.esc_attr($key, 'wpvivid').'" onclick="wpvivid_click_check_backup(\''.__($key, 'wpvivid').'\');" /></th>
4915
  <td class="tablelistcolumn">
4916
  <div style="float:left;padding:0 10px 10px 0;">
4917
- <div class="backuptime"><strong>'.__(date('M d, Y H:i',$value['create_time']), 'wpvivid').'</strong></div>
4918
  <div class="common-table">
4919
  <span title="To lock the backup, the backup can only be deleted manually" id="wpvivid_lock_'.$key.'">
4920
  <img src="'.esc_url(WPVIVID_PLUGIN_URL.$backup_lock).'" name="'.esc_attr($lock_status, 'wpvivid').'" onclick="wpvivid_set_backup_lock(\''.__($key, 'wpvivid').'\', \''.__($lock_status, 'wpvivid').'\');" style="vertical-align:middle; cursor:pointer;"/>
4860
  foreach ($backuplist as $key=>$value) {
4861
  $row_style = '';
4862
  if($value['type'] == 'Migration' || $value['type'] == 'Upload'){
4863
+ if($value['type'] == 'Migration'){
4864
+ $upload_title = 'Received Backup: ';
4865
+ }
4866
+ else if($value['type'] == 'Upload') {
4867
+ $upload_title = 'Uploaded Backup: ';
4868
+ }
4869
  $row_style = 'border: 2px solid #006799; box-sizing:border-box; -moz-box-sizing:border-box; -webkit-box-sizing:border-box;';
4870
  }
4871
  else if($value['type'] == 'Manual' || $value['type'] == 'Cron'){
4872
  $row_style = '';
4873
+ $upload_title = '';
4874
  }
4875
 
4876
  if(empty($value['lock'])){
4921
  <th class="check-column"><input name="check_backup" type="checkbox" id="'.esc_attr($key, 'wpvivid').'" value="'.esc_attr($key, 'wpvivid').'" onclick="wpvivid_click_check_backup(\''.__($key, 'wpvivid').'\');" /></th>
4922
  <td class="tablelistcolumn">
4923
  <div style="float:left;padding:0 10px 10px 0;">
4924
+ <div class="backuptime"><strong>'.$upload_title.'</strong>'.__(date('M d, Y H:i',$value['create_time']), 'wpvivid').'</div>
4925
  <div class="common-table">
4926
  <span title="To lock the backup, the backup can only be deleted manually" id="wpvivid_lock_'.$key.'">
4927
  <img src="'.esc_url(WPVIVID_PLUGIN_URL.$backup_lock).'" name="'.esc_attr($lock_status, 'wpvivid').'" onclick="wpvivid_set_backup_lock(\''.__($key, 'wpvivid').'\', \''.__($lock_status, 'wpvivid').'\');" style="vertical-align:middle; cursor:pointer;"/>
includes/customclass/class-wpvivid-google-drive.php CHANGED
@@ -15,6 +15,8 @@ class Wpvivid_Google_drive extends WPvivid_Remote
15
  {
16
  public $options;
17
 
 
 
18
  public function __construct($options=array())
19
  {
20
  if(empty($options))
@@ -38,6 +40,15 @@ class Wpvivid_Google_drive extends WPvivid_Remote
38
  {
39
  $this->options=$options;
40
  }
 
 
 
 
 
 
 
 
 
41
  }
42
 
43
  public function pre_add_remote($remote,$id)
@@ -81,7 +92,7 @@ class Wpvivid_Google_drive extends WPvivid_Remote
81
  try {
82
  include_once WPVIVID_PLUGIN_DIR . '/vendor/autoload.php';
83
  $client = new Google_Client();
84
- $client->setAuthConfig(WPVIVID_GOOGLEDRIVE_SECRETS);
85
  $client->setApprovalPrompt('force');
86
  $client->addScope(Google_Service_Drive::DRIVE_FILE);
87
  $client->setAccessType('offline');
@@ -174,7 +185,7 @@ class Wpvivid_Google_drive extends WPvivid_Remote
174
  try {
175
  include_once WPVIVID_PLUGIN_DIR . '/vendor/autoload.php';
176
  $client = new Google_Client();
177
- $client->setAuthConfig(WPVIVID_GOOGLEDRIVE_SECRETS);
178
  $client->setApprovalPrompt('force');
179
  $client->addScope(Google_Service_Drive::DRIVE_FILE);
180
  $client->setAccessType('offline');
@@ -573,7 +584,7 @@ class Wpvivid_Google_drive extends WPvivid_Remote
573
  include_once WPVIVID_PLUGIN_DIR.'/vendor/autoload.php';
574
  $client = new Google_Client();
575
  $client->setConfig('access_type','offline');
576
- $client->setAuthConfig(WPVIVID_GOOGLEDRIVE_SECRETS);
577
  $client->addScope(Google_Service_Drive::DRIVE_FILE);//
578
  $client->setAccessToken($this->options['token']);
579
 
15
  {
16
  public $options;
17
 
18
+ public $google_drive_secrets;
19
+
20
  public function __construct($options=array())
21
  {
22
  if(empty($options))
40
  {
41
  $this->options=$options;
42
  }
43
+ $this->google_drive_secrets = array("web"=>array(
44
+ "client_id"=>"134809148507-32crusepgace4h6g47ota99jjrvf4j1u.apps.googleusercontent.com",
45
+ "project_id"=>"wpvivid-auth",
46
+ "auth_uri"=>"https://accounts.google.com/o/oauth2/auth",
47
+ "token_uri"=>"https://oauth2.googleapis.com/token",
48
+ "auth_provider_x509_cert_url"=>"https://www.googleapis.com/oauth2/v1/certs",
49
+ "client_secret"=>"GmD5Kmg_1fTcf0ciNEomposy",
50
+ "redirect_uris"=>array("https://auth.wpvivid.com/google_drive")
51
+ ));
52
  }
53
 
54
  public function pre_add_remote($remote,$id)
92
  try {
93
  include_once WPVIVID_PLUGIN_DIR . '/vendor/autoload.php';
94
  $client = new Google_Client();
95
+ $client->setAuthConfig($this->google_drive_secrets);
96
  $client->setApprovalPrompt('force');
97
  $client->addScope(Google_Service_Drive::DRIVE_FILE);
98
  $client->setAccessType('offline');
185
  try {
186
  include_once WPVIVID_PLUGIN_DIR . '/vendor/autoload.php';
187
  $client = new Google_Client();
188
+ $client->setAuthConfig($this->google_drive_secrets);
189
  $client->setApprovalPrompt('force');
190
  $client->addScope(Google_Service_Drive::DRIVE_FILE);
191
  $client->setAccessType('offline');
584
  include_once WPVIVID_PLUGIN_DIR.'/vendor/autoload.php';
585
  $client = new Google_Client();
586
  $client->setConfig('access_type','offline');
587
+ $client->setAuthConfig($this->google_drive_secrets);
588
  $client->addScope(Google_Service_Drive::DRIVE_FILE);//
589
  $client->setAccessToken($this->options['token']);
590
 
readme.txt CHANGED
@@ -4,7 +4,7 @@ Tags: transfer, move, duplicate, clone, backup, migrate, restore, auto backup, c
4
  Requires at least: 4.5
5
  Tested up to: 5.1
6
  Requires PHP: 5.3
7
- Stable tag: 0.9.14
8
  License: GPLv3 or later
9
  License URI: https://www.gnu.org/licenses/gpl-3.0.en.html
10
 
@@ -23,7 +23,7 @@ You can also transfer a site to a subdirectory, from a.com to b.com, from a.com
23
  You are free to choose what to transfer: the entire site, files or just the database only.
24
  = 2. Upload Backups (New Feature) =
25
  Upload a backup to restore or transfer.
26
- You can transfer or restore backups created with 0.9.14 or higher version, and restore a backup created with prior versions.
27
  = 3. Automatic Backup =
28
  Setup and forget, the plugin will do the rest automatically backing up your website.
29
  = 4. One-Click Restore =
@@ -41,16 +41,18 @@ Dropbox, Google Drive, Microsoft OneDrive, Amazon S3, DigitalOcean Spaces, SFTP,
41
 
42
  == Features Spotlight ==
43
  * One-Click Site Transfer
 
 
 
44
  * Manual Backup
45
  * Filter Large Files
46
  * Large Database Support
47
- * Optimized for any host
48
- * Backup Retention Limits
49
  * Backup Splitting
50
  * No Limit of Backup Size
51
  * Backup to Localhost
52
  * Clean Temp Files
53
- * Schedule Automated Backups
54
  * Customize Backup Content
55
  * Download Backup
56
  * Instant Email Report
@@ -140,6 +142,10 @@ Please try to contact your web hosting provider for changing PHP memory limit, o
140
  Feel free to let us know how we can help using the [support forum](https://wordpress.org/support/plugin/wpvivid-backuprestore) for the plugin on WordPress.org or our [contact form](https://wpvivid.com/contact-us). You can also reach us with a direct message on [Twitter](https://twitter.com/WPvividcom).
141
 
142
  == Changelog ==
 
 
 
 
143
  = 0.9.14 =
144
  - Added free website transfer feature. We highly recommend all our users to update.
145
  - Added backup upload feature. Now you can upload a backup to restore or transfer.
4
  Requires at least: 4.5
5
  Tested up to: 5.1
6
  Requires PHP: 5.3
7
+ Stable tag: 0.9.15
8
  License: GPLv3 or later
9
  License URI: https://www.gnu.org/licenses/gpl-3.0.en.html
10
 
23
  You are free to choose what to transfer: the entire site, files or just the database only.
24
  = 2. Upload Backups (New Feature) =
25
  Upload a backup to restore or transfer.
26
+ You can transfer or restore backups created with 0.9.14 or a higher version.
27
  = 3. Automatic Backup =
28
  Setup and forget, the plugin will do the rest automatically backing up your website.
29
  = 4. One-Click Restore =
41
 
42
  == Features Spotlight ==
43
  * One-Click Site Transfer
44
+ * Upload Backups to Restore or Transfer
45
+ * Schedule Automated Backups
46
+ * One-Click Restore
47
  * Manual Backup
48
  * Filter Large Files
49
  * Large Database Support
50
+ * Optimized for Any Host
51
+ * Set Backup Retention
52
  * Backup Splitting
53
  * No Limit of Backup Size
54
  * Backup to Localhost
55
  * Clean Temp Files
 
56
  * Customize Backup Content
57
  * Download Backup
58
  * Instant Email Report
142
  Feel free to let us know how we can help using the [support forum](https://wordpress.org/support/plugin/wpvivid-backuprestore) for the plugin on WordPress.org or our [contact form](https://wpvivid.com/contact-us). You can also reach us with a direct message on [Twitter](https://twitter.com/WPvividcom).
143
 
144
  == Changelog ==
145
+ = 0.9.15 =
146
+ - Fixed: Scheduled backups failed to run as configured after the last update.
147
+ - Improved the Restore UI.
148
+ - Refined some descriptions in the UI.
149
  = 0.9.14 =
150
  - Added free website transfer feature. We highly recommend all our users to update.
151
  - Added backup upload feature. Now you can upload a backup to restore or transfer.
wpvivid-backuprestore.php CHANGED
@@ -7,7 +7,7 @@
7
  * @wordpress-plugin
8
  * Plugin Name: WPvivid Backup Plugin
9
  * Description: Transfer site to a new domain. Off-site backup schedule, transfer backups to leading remote storage (dropbox, onedrive, google drive etc). All in one.
10
- * Version: 0.9.14
11
  * Author: wpvivid.com
12
  * Author URI: https://wpvivid.com
13
  * License: GPL-3.0+
@@ -21,7 +21,7 @@ if ( ! defined( 'WPINC' ) ) {
21
  die;
22
  }
23
 
24
- define( 'WPVIVID_PLUGIN_VERSION', '0.9.14' );
25
  //
26
  define('WPVIVID_RESTORE_INIT','init');
27
  define('WPVIVID_RESTORE_READY','ready');
7
  * @wordpress-plugin
8
  * Plugin Name: WPvivid Backup Plugin
9
  * Description: Transfer site to a new domain. Off-site backup schedule, transfer backups to leading remote storage (dropbox, onedrive, google drive etc). All in one.
10
+ * Version: 0.9.15
11
  * Author: wpvivid.com
12
  * Author URI: https://wpvivid.com
13
  * License: GPL-3.0+
21
  die;
22
  }
23
 
24
+ define( 'WPVIVID_PLUGIN_VERSION', '0.9.15' );
25
  //
26
  define('WPVIVID_RESTORE_INIT','init');
27
  define('WPVIVID_RESTORE_READY','ready');