Skip to content

Instantly share code, notes, and snippets.

@shawnhooper
Created October 27, 2014 14:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save shawnhooper/b15e65cc452752ef1de3 to your computer and use it in GitHub Desktop.
Save shawnhooper/b15e65cc452752ef1de3 to your computer and use it in GitHub Desktop.
<?php
/**
Plugin Name: CLI Export Multisite
*/
if ( ! defined( 'WP_CLI' ) ) return;
use \WP_CLI\Utils;
/**
* Export SQL data for selected sites in a multisite network
*
* @author shooper
*/
class CLI_ExportMultisite extends WP_CLI_Command {
/**
* Exports the database to a file or to STDOUT.
*
* ## OPTIONS
*
*
* [<range>]
* : The comma separated list of site IDs to export
*
* [<file>]
* : The name of the SQL file to export. If '-', then outputs to STDOUT. If omitted, it will be '{dbname}.sql'.
*
* [--<field>=<value>]
* : Extra arguments to pass to mysqldump
*
* ## EXAMPLES
*
* wp multisitedb exportmulti --add-drop-table
* wp multisitedb exportmulti --tables=wp_options,wp_users
*
* @alias dump
*/
function exportmulti($args, $assoc_args) {
if (!is_multisite()) {
WP_CLI::error('This command can only be used on a multisite installation');
exit;
}
$result_file = $this->get_file_name( $args );
$stdout = ( '-' === $result_file );
if ( ! $stdout ) {
$assoc_args['result-file'] = $result_file;
}
$command = 'mysqldump --no-defaults %s';
$command_esc_args = array( DB_NAME );
$tables = self::get_table_list($args[0]);
if ( $tables ) {
$command .= ' --tables';
foreach ( $tables as $table ) {
$command .= ' %s';
$command_esc_args[] = trim( $table );
}
}
$escaped_command = call_user_func_array( '\WP_CLI\Utils\esc_cmd', array_merge( array( $command ), $command_esc_args ) );
self::run( $escaped_command, $assoc_args );
if ( ! $stdout ) {
WP_CLI::success( sprintf( 'Exported to %s', $result_file ) );
}
}
private static function get_table_list ($range) {
$siteIds = self::parse_siteid_ranges($range);
$tables = array();
global $wpdb;
foreach ($siteIds as $site) {
array_push($tables, $wpdb->prefix . $site . '_commentmeta');
array_push($tables, $wpdb->prefix . $site . '_comments');
array_push($tables, $wpdb->prefix . $site . '_links');
array_push($tables, $wpdb->prefix . $site . '_options');
array_push($tables, $wpdb->prefix . $site . '_postmeta');
array_push($tables, $wpdb->prefix . $site . '_posts');
array_push($tables, $wpdb->prefix . $site . '_term_relationships');
array_push($tables, $wpdb->prefix . $site . '_term_taxonomy');
array_push($tables, $wpdb->prefix . $site . '_terms');
}
return $tables;
}
public static function parse_siteid_ranges($rangeString) {
$output = array();
foreach (explode(',', $rangeString) as $nums) {
if (strpos($nums, '-') !== false) {
list($from, $to) = explode('-', $nums);
$output = array_merge($output, range($from, $to));
} else {
$output[] = (int)$nums;
}
}
$output = array_unique($output, SORT_NUMERIC);
return $output;
}
private static function run_query( $query ) {
self::run( 'mysql --no-defaults', array( 'execute' => $query ) );
}
private function get_file_name( $args ) {
if ( ! isset( $args[1] ) )
return sprintf( '%s.sql', DB_NAME );
return $args[1];
}
private static function run( $cmd, $assoc_args = array(), $descriptors = null ) {
$required = array(
'host' => DB_HOST,
'user' => DB_USER,
'pass' => DB_PASSWORD,
);
if ( defined( 'DB_CHARSET' ) && constant( 'DB_CHARSET' ) ) {
$required['default-character-set'] = constant( 'DB_CHARSET' );
}
$final_args = array_merge( $assoc_args, $required );
Utils\run_mysql_command( $cmd, $final_args, $descriptors );
}
}
WP_CLI::add_command( 'db multisite', 'CLI_ExportMultisite' );
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment