/** * Run the push. * * This is where all options for SitePushCore are set, and the relevant pushes are run. * * @param SitePushCore $my_push * @param array $push_options options for this push from $_REQUEST * @return bool TRUE if push completed without errors, FALSE otherwise */ public function do_the_push($my_push, $push_options) { //if we are going to do a push, check that we were referred from options page as expected check_admin_referer('sitepush-dopush', 'sitepush-nonce'); //final check everything is OK $this->final_check($my_push); if (SitePushErrors::count_errors('all-errors')) { return FALSE; } $start_micro_time = function_exists('microtime') ? microtime(TRUE) : 0; $start_time = time(); $my_push->add_result("Push started at " . date('r'), 1); //track if we have actually tried to push anything $done_push = FALSE; $my_push->sites_conf_path = $this->options->sites_conf; $my_push->dbs_conf_path = $this->options->dbs_conf; $my_push->source = $push_options['source']; $my_push->dest = $push_options['dest']; $my_push->dry_run = $push_options['dry_run'] ? TRUE : FALSE; $my_push->do_backup = $push_options['do_backup'] ? TRUE : FALSE; $my_push->source_backup_path = $this->options->backup_path; $my_push->dest_backup_path = $this->options->backup_path; $my_push->echo_output = TRUE; //initialise some parameters $push_files = FALSE; $results = array(); //should be empty at end if everything worked as expected $db_types = array(); $this->do_action('push_begin', $my_push, $push_options); /* -------------------------------------------------------------- */ /* !Push WordPress Files */ /* -------------------------------------------------------------- */ if ($push_options['push_uploads']) { $push_files = TRUE; $my_push->push_uploads = TRUE; } if ($push_options['push_themes']) { $push_files = TRUE; $my_push->push_themes = TRUE; } if ($push_options['push_theme'] && !$push_options['push_themes']) { //pushes current (child) theme $push_files = TRUE; $my_push->theme = _deprecated_get_theme_stylesheet(); } if ($push_options['push_plugins']) { $push_files = TRUE; $my_push->push_plugins = TRUE; } if ($push_options['push_mu_plugins']) { $push_files = TRUE; $my_push->push_mu_plugins = TRUE; } if ($push_options['push_wp_core']) { $push_files = TRUE; $my_push->push_wp_files = TRUE; } //do the push if ($push_files) { $this->do_action('pre_push_files', $my_push, $push_options); $results[] = $my_push->push_files(); $this->do_action('post_push_files', $my_push, $push_options); $done_push = TRUE; } /* -------------------------------------------------------------- */ /* !Push WordPress Database */ /* -------------------------------------------------------------- */ $db_push = FALSE; if ($push_options['db_all_tables']) { $db_types[] = 'all_tables'; $db_push = TRUE; } else { //we only check other options if we're not pushing whole DB if ($push_options['db_post_content']) { $db_types[] = 'content'; } if ($push_options['db_comments']) { $db_types[] = 'comments'; } if ($push_options['db_users']) { $db_types[] = 'users'; } if ($push_options['db_options']) { $db_types[] = 'options'; } if ($push_options['db_multisite_tables']) { $db_types[] = 'multisite'; } if ($push_options['db_custom_table_groups']) { $db_types[] = $push_options['db_custom_table_groups']; } if ($db_types) { $db_push = TRUE; } } $restore_options = FALSE; if ($db_push) { //save various options which we don't want overwritten if we are doing a pull $restore_options = $this->options->get_current_site() == $push_options['dest']; if ($restore_options) { $current_options = get_option('sitepush_options'); $current_user_options = $this->get_all_user_options(); $current_active_plugins = get_option('active_plugins'); //if we don't delete the options before DB push then WP won't restore options properly if //option wasn't present in DB we are pulling from delete_option('sitepush_options'); $this->delete_all_user_options(); } //push DB $this->do_action('pre_push_db', $my_push, $push_options); $results[] = $my_push->push_db($db_types); $this->do_action('post_push_db', $my_push, $push_options); $done_push = TRUE; } /* -------------------------------------------------------------- */ /* !Clear Cache */ /* -------------------------------------------------------------- */ if ($push_options['clear_cache'] && $this->options->cache_key) { $this->do_action('pre_clear_cache', $my_push, $push_options); $my_push->clear_cache(); $this->do_action('post_clear_cache', $my_push, $push_options); } elseif ($push_options['clear_cache'] && !$this->options->cache_key) { SitePushErrors::add_error("Could not clear the destination cache because the cache secret key is not set.", 'warning'); } /* -------------------------------------------------------------- */ /* !Other things to do */ /* -------------------------------------------------------------- */ //normally result should be empty - results to display are captured in class and output separately //if anything is output here it probably means something went wrong //clean the array of empty elements $cleaned_results = array(); foreach ($results as $result) { if (trim($result)) { $cleaned_results[] = $result; } } //save current site & user options back to DB so options on site we are pulling from won't overwrite if ($restore_options) { $this->options->update($current_options); $this->save_all_user_options($current_user_options); //deactivating sitepush ensures that when we update option cached value isn't used //we reactivate again after this if clause just to make sure it's active deactivate_plugins(SITEPUSH_BASENAME); update_option('active_plugins', $current_active_plugins); } //make sure sitepush is still activated and save our options to DB so if we have pulled DB from elsewhere we don't overwrite sitepush options activate_plugin(SITEPUSH_BASENAME); $my_push->add_result("Push completed at " . date('r'), 1); $duration = time() - $start_time; if ($duration >= 3600) { $time_took = gmdate('H:i:s', $duration); } elseif ($duration >= 60) { $time_took = gmdate('i:s', $duration); } elseif ($duration < 10 && $start_micro_time) { $time_took = microtime(TRUE) - $start_micro_time . " seconds"; } else { $time_took = "{$duration} seconds"; } $my_push->add_result("Push took {$time_took}", 1); $this->do_action('push_complete', $my_push, $push_options); return SitePushErrors::is_error() ? FALSE : $done_push; }
public function display_screen() { //check that the user has the required capability if (!$this->plugin->can_use()) { wp_die(__('You do not have sufficient permissions to access this page.')); } ?> <div class="wrap"> <h2>SitePush</h2> <?php //initialise options from form data $push_options['db_all_tables'] = SitePushPlugin::get_query_var('sitepush_push_db_all_tables') ? TRUE : FALSE; $push_options['db_post_content'] = SitePushPlugin::get_query_var('sitepush_push_db_post_content') ? TRUE : FALSE; $push_options['db_comments'] = SitePushPlugin::get_query_var('sitepush_push_db_comments') ? TRUE : FALSE; $push_options['db_users'] = SitePushPlugin::get_query_var('sitepush_push_db_users') ? TRUE : FALSE; $push_options['db_options'] = SitePushPlugin::get_query_var('sitepush_push_db_options') ? TRUE : FALSE; $push_options['push_uploads'] = SitePushPlugin::get_query_var('sitepush_push_uploads') ? TRUE : FALSE; $push_options['push_theme'] = SitePushPlugin::get_query_var('sitepush_push_theme') ? TRUE : FALSE; $push_options['push_themes'] = SitePushPlugin::get_query_var('sitepush_push_themes') ? TRUE : FALSE; $push_options['push_plugins'] = SitePushPlugin::get_query_var('sitepush_push_plugins') ? TRUE : FALSE; $push_options['push_mu_plugins'] = SitePushPlugin::get_query_var('sitepush_push_mu_plugins') ? TRUE : FALSE; $push_options['push_wp_core'] = SitePushPlugin::get_query_var('sitepush_push_wp_core') ? TRUE : FALSE; $push_options['clear_cache'] = SitePushPlugin::get_query_var('clear_cache') ? TRUE : FALSE; $push_options['dry_run'] = SitePushPlugin::get_query_var('sitepush_dry_run') ? TRUE : FALSE; $push_options['do_backup'] = SitePushPlugin::get_query_var('sitepush_push_backup') ? TRUE : FALSE; $db_custom_table_groups = SitePushPlugin::get_query_var('sitepush_db_custom_table_groups'); if ($db_custom_table_groups) { foreach ($db_custom_table_groups as $key => $group) { $push_options['db_custom_table_groups'][] = $key; } } else { $push_options['db_custom_table_groups'] = array(); } $push_options['source'] = SitePushPlugin::get_query_var('sitepush_source') ? SitePushPlugin::get_query_var('sitepush_source') : ''; $push_options['dest'] = SitePushPlugin::get_query_var('sitepush_dest') ? SitePushPlugin::get_query_var('sitepush_dest') : ''; //multisite specific options $push_options['db_multisite_tables'] = SitePushPlugin::get_query_var('sitepush_push_db_multisite_tables') ? TRUE : FALSE; $user_options = get_user_option('sitepush_options'); $this->user_last_source = empty($user_options['last_source']) ? '' : $user_options['last_source']; $this->user_last_dest = empty($user_options['last_dest']) ? '' : $user_options['last_dest']; SitePushErrors::errors('all', 'sitepush'); if ($push_options['dest']) { //output directly to screen... doesn't work on all browsers. ob_implicit_flush(); //save source/dest to user options $user_options = get_user_option('sitepush_options'); $user_options['last_source'] = $push_options['source']; $user_options['last_dest'] = $push_options['dest']; update_user_option(get_current_user_id(), 'sitepush_options', $user_options); // do the push! if ($this->plugin->can_admin() && $this->options->debug_output_level) { $hide_html = ''; } else { $hide_html = ' style="display: none;"'; echo "<div id='running'></div>"; } echo "<script>\n\t\t\t\tvar scrollIntervalID = window.setInterval(function(){\n\t\t\t\t\tjQuery('#sitepush-results').scrollTop( jQuery('#sitepush-results').prop('scrollHeight') );\n\t\t\t\t}, 100);\n\t\t\t</script>"; echo "<h3{$hide_html} class='sitepush-results'>Push results</h3>"; echo "<pre id='sitepush-results' class='sitepush-results' {$hide_html}>"; //Do the push! $obj_sitepushcore = new SitePushCore($push_options['source'], $push_options['dest']); if (!SitePushErrors::count_errors('all-errors')) { $push_result = $this->plugin->do_the_push($obj_sitepushcore, $push_options); } else { $push_result = FALSE; } echo "</pre>"; echo "<script>\n\t\t\t\tjQuery('#running').hide();\n\t\t\t\tif( ! jQuery('#sitepush-results').text() ) jQuery('.sitepush-results').hide();\n\t\t\t\tclearInterval( scrollIntervalID );\n\t\t\t\tjQuery('#sitepush-results').scrollTop( jQuery('#sitepush-results').prop('scrollHeight') );\n\t\t\t</script>"; if ($push_result) { if ($push_options['dry_run']) { SitePushErrors::add_error("Dry run complete. Nothing was actually pushed, but you can see what would have been done from the output above.", 'notice'); } elseif (SitePushErrors::count_errors('warning')) { SitePushErrors::add_error("Push complete (with warnings).", 'notice'); } else { SitePushErrors::add_error("Push complete.", 'notice'); } //bit of a hack... do one page load for destination site to make sure SitePush has activated plugins etc //before any user accesses the site wp_remote_get($obj_sitepushcore->dest_params['domain']); } else { if (!SitePushErrors::is_error()) { SitePushErrors::add_error("Nothing selected to push"); } } SitePushErrors::errors(); } //set up what menu options are selected by default if (!empty($_REQUEST['sitepush-nonce'])) { //already done a push, so redo what we had before $default_source = empty($_REQUEST['sitepush_source']) ? '' : $_REQUEST['sitepush_source']; $default_dest = empty($_REQUEST['sitepush_dest']) ? '' : $_REQUEST['sitepush_dest']; } if (empty($default_source)) { $default_source = $this->user_last_source ? $this->user_last_source : $this->options->get_current_site(); } if (empty($default_dest)) { $default_dest = $this->user_last_dest ? $this->user_last_dest : ''; } ?> <form method="post" action=""> <?php wp_nonce_field('sitepush-dopush', 'sitepush-nonce'); ?> <table class="form-table"> <?php if (SITEPUSH_SHOW_MULTISITE) { ?> <tr> <th scope="row"><label for="sitepush_source">Site</label></th> <td> <?php bloginfo('name'); ?> </td> </tr> <?php } ?> <tr> <th scope="row"><label for="sitepush_source">Source</label></th> <td> <select name="sitepush_source" id="sitepush_source" class="site-selector"> <?php foreach ($this->plugin->get_sites('source') as $site) { echo "<option value='{$site}'"; if ($default_source == $site) { echo " selected='selected'"; } echo ">{$this->options->sites[$site]['label']}</option>"; } ?> </select> </td> </tr> <tr> <th scope="row"><label for="sitepush_dest">Destination</label></th> <td> <select name="sitepush_dest" id="sitepush_dest" class="site-selector"> <?php foreach ($this->plugin->get_sites('destination') as $site) { $use_cache = $this->options->sites[$site]['use_cache'] ? 'yes' : 'no'; echo "<option value='{$site}' data-cache='{$use_cache}'"; if ($default_dest == $site) { echo " selected='selected'"; } echo ">{$this->options->sites[$site]['label']}</option>"; } ?> </select> <span id='sitepush_dest-warning'><span> </td> </tr> <?php $ms_message = SITEPUSH_SHOW_MULTISITE ? "<br /><i>current site only</i>" : ''; ?> <tr> <th scope="row">Database content<?php echo $ms_message; ?> </th> <td> <?php if (!SITEPUSH_SHOW_MULTISITE) { echo $this->option_html('sitepush_push_db_all_tables', 'Entire database <i>(this will overwrite all content and settings)</i>', 'admin_only'); } ?> <?php echo $this->option_html('sitepush_push_db_post_content', 'All post content <i>(pages, posts, media, links, custom post types, post meta, categories, tags & custom taxonomies)</i>', 'user'); ?> <?php if ($this->plugin->can_admin() || !$this->options->non_admin_exclude_comments) { echo $this->option_html('sitepush_push_db_comments', 'Comments', 'user'); } ?> <?php if (!SITEPUSH_SHOW_MULTISITE) { echo $this->option_html('sitepush_push_db_users', 'Users & user meta', 'admin_only'); } ?> <?php if ($this->plugin->can_admin() || !$this->options->non_admin_exclude_options) { echo $this->option_html('sitepush_push_db_options', 'WordPress options', 'user'); } ?> <?php foreach ($this->options->db_custom_table_groups_array as $key => $table_group) { //if label is preceded by $$$ then field only shows to admins if (strpos($table_group['label'], '$$$') === 0) { $admin_only = TRUE; $table_group['label'] = substr($table_group['label'], 3); } else { $admin_only = FALSE; } echo $this->option_html(array('sitepush_db_custom_table_groups', $key), $table_group['label'], $admin_only); } ?> </td> </tr> <?php $files_output = ''; if (!SITEPUSH_SHOW_MULTISITE) { $files_output .= $this->option_html('sitepush_push_theme', 'Current theme <i>(' . _deprecated_get_current_theme() . ')</i>', 'admin_only'); } if (!SITEPUSH_SHOW_MULTISITE) { $files_output .= $this->option_html('sitepush_push_themes', 'All themes', 'admin_only'); } if (!SITEPUSH_SHOW_MULTISITE) { $files_output .= $this->option_html('sitepush_push_plugins', 'WordPress plugins', 'admin_only'); } if (!SITEPUSH_SHOW_MULTISITE && file_exists($this->options->current_site_conf['web_path'] . $this->options->current_site_conf['wpmu_plugin_dir'])) { $files_output .= $this->option_html('sitepush_push_mu_plugins', 'WordPress must-use plugins', 'admin_only'); } if ('ERROR' != $this->options->current_site_conf['wp_uploads_dir']) { $files_output .= $this->option_html('sitepush_push_uploads', 'WordPress media uploads', 'user'); } elseif ($this->plugin->can_admin()) { $files_output .= "Uploads directory could not be determined, so uploaded media files cannot be pushed.<br />"; } if ($files_output) { echo "<tr><th scope='row'>Files{$ms_message}</th><td>{$files_output}</td></tr>"; } ?> <?php if (SITEPUSH_SHOW_MULTISITE && $this->plugin->can_admin()) { ?> <tr> <th scope="row">Multisite database content<br /><i>affects all sites</i></th> <td> <?php echo $this->option_html('sitepush_push_db_users', 'Users & user meta', 'admin_only'); ?> <?php echo $this->option_html('sitepush_push_db_multisite_tables', 'Multisite tables <i>(blogs, blog_versions, registration_log, signups, site, sitemeta, sitecategories)</i>', 'admin_only'); ?> <?php echo $this->option_html('sitepush_push_db_all_tables', 'Entire database for all sites <i>(Caution! This will overwrite all content and settings for all sites in this network installation)</i>', 'admin_only'); ?> </td> </tr> <tr> <th scope="row">Multisite files<br /><i>affects all sites</i></th> <td> <?php echo $this->option_html('sitepush_push_theme', 'Current theme <i>(' . _deprecated_get_current_theme() . ')</i>', 'admin_only'); ?> <?php echo $this->option_html('sitepush_push_themes', 'All themes', 'admin_only'); ?> <?php echo $this->option_html('sitepush_push_plugins', 'WordPress plugins', 'admin_only'); ?> <?php if (file_exists($this->options->current_site_conf['web_path'] . $this->options->current_site_conf['wpmu_plugin_dir'])) { echo $this->option_html('sitepush_push_mu_plugins', 'WordPress must-use plugins', 'admin_only'); } ?> </td> </tr> <?php } ?> <?php $output = ''; if (!empty($this->options->cache_key) && $this->options->use_cache) { $output .= $this->option_html('clear_cache', 'Clear cache on destination', 'user', 'checked'); } if ($this->options->backup_path) { $output .= $this->option_html('sitepush_push_backup', 'Backup push <i>(note - restoring from a backup is currently a manual process and ideally requires command line access)</i>', 'user', 'checked'); } if ($this->options->debug_output_level >= 3) { $output .= $this->option_html('sitepush_dry_run', 'Dry run <i>(show what actions would be performed by push, but don\'t actually do anything)</i>', 'admin_only'); } /* No undo till we get it working properly! <br /><label title="undo"><input type="radio" name="push_type" value="undo"<?php echo $push_type=='undo'?' checked="checked"':'';?> /> Undo the last push (<?php echo date( "D j F, Y \a\t H:i:s e O T",$obj_sitepushcore->get_last_undo_time() );?>)</label> */ if ($output) { echo "<tr valign='top'><th scope='row'>Push options</th><td>{$output}</td></tr>"; } ?> <?php if (!$this->plugin->can_admin()) { ?> <tr> <th scope="row"> </th> <td> <br /><span class="description">To push plugins, themes or settings, please ask an administrator.</span> </td> </tr> <?php } ?> </table> <p class="submit"> <input type="submit" class="button-primary" value="Push Content" id="push-button" /> </p> </form> </div> <?php }