bainternet
6/16/2015 - 7:50 AM

gistfile1.php

<?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' );