public
Authored by avatar Fabio Montefuscolo

Comando wpcli para juntar um site multsite ao site principal

Edited
merge_blog.php 5.63 KiB
<?php

class Custom_Command extends WP_CLI_Command {

    function merge_blog($args, $kwargs) {
        global $wpdb;
        
        $blog_id = 0;
        
        if ( isset($args[0]) && is_numeric($args[0]) && ((int)$args[0]) > 1 ) {
            $blog_id = $args[0];
        }
        
        if ( isset($kwargs['blog_id']) && is_numeric($kwargs['blog_id']) && ((int)$kwargs['blog_id']) > 1 ) {
            $blog_id = $kwargs['blog_id'];
        }
        
        switch_to_blog($blog_id);
        
        
        // importa termos
        $query = "INSERT INTO wp_terms(name, slug, term_group)"
                 . " SELECT origin.name, origin.slug, origin.term_group FROM {$wpdb->terms} origin"
                   . " LEFT OUTER JOIN wp_terms target ON origin.slug=target.slug"
                   . " WHERE target.slug is NULL";
        WP_CLI::success('Termos ok ' . $wpdb->query( $query ));
        
        
        // TODO: não tem como testar isso
        // importa termmeta
        // $query = "INSERT INTO wp_termmeta(term_id, meta_key, meta_value)"
        //        . " SELECT new.term_id, origin.meta_key, origin.meta_value FROM {$wpdb->termmeta} origin"
        //        . " INNER JOIN {$wpdb->terms} old  ON old.term_id=origin.term_id"
        //        . " INNER JOIN wp_terms new ON old.slug=new.slug;";
        // $wpdb->query( $query );
        
        
        // importa termtaxonomy que ainda não existe
        $query = "INSERT wp_term_taxonomy (term_id, taxonomy, description, parent, count)"
               . " SELECT new.term_id, origin.taxonomy, origin.description, origin.parent, origin.count"
                 . " FROM {$wpdb->term_taxonomy} origin"
                 . " INNER JOIN {$wpdb->terms} old ON old.term_id=origin.term_id"
                 . " INNER JOIN wp_terms new ON old.slug=new.slug"
                 . " LEFT OUTER JOIN wp_term_taxonomy target ON target.term_id=new.term_id AND target.taxonomy=origin.taxonomy"
                 . " WHERE target.taxonomy is NULL";
        WP_CLI::success('Taxonomias ok ' . $wpdb->query( $query ));
        
        
        // importa posts
        $post_types = array_reduce(
            get_post_types(array('_builtin' => false)),
            function($str, $p){ return $str . "'$p',"; },
            ''
        );
        $post_types = $post_types . "'post','page','attachment'";
        
        $post_fields = array('post_author', 'post_date', 'post_date_gmt', 'post_content',
            'post_title', 'post_excerpt', 'post_status', 'comment_status', 'ping_status',
            'post_password', 'post_name', 'to_ping', 'pinged', 'post_modified', 'post_modified_gmt',
            'post_content_filtered', 'post_parent', 'guid', 'menu_order', 'post_type',
            'post_mime_type', 'comment_count');
            
        $query = "INSERT INTO wp_posts (". join(',', $post_fields). ")"
               . " SELECT s1." . join(',s1.', $post_fields)
               . " FROM {$wpdb->posts} s1"
               . " LEFT OUTER JOIN wp_posts t1 ON t1.post_name=s1.post_name AND t1.post_status='publish'"
               . " WHERE s1.post_status='publish'"
               . " AND s1.post_type IN ({$post_types})"
               . " AND t1.ID is NULL";
        WP_CLI::success('Posts ok ' . $wpdb->query( $query ));
        
        
        // importa postmeta
        $query = "INSERT INTO wp_postmeta(post_id, meta_key, meta_value)"
               . " SELECT n.ID, s.meta_key, s.meta_value FROM {$wpdb->postmeta} s"
               . " INNER JOIN {$wpdb->posts} o ON o.ID=s.post_id"
               . " INNER JOIN wp_posts n ON n.post_name=o.post_name AND n.post_date=o.post_date"
               . " LEFT OUTER JOIN wp_postmeta t1 ON t1.post_id=n.ID AND s.meta_key=t1.meta_key"
               . " WHERE t1.meta_id is NULL";
        WP_CLI::success('Postmetas ok ' . $wpdb->query( $query ));
        
        
        // import terms relations
        WP_CLI::warning('A operação a seguir pode levar muitos minutos');
        $query = "INSERT INTO wp_term_relationships (object_id, term_taxonomy_id, term_order)"
            . " SELECT np.ID, ntt.term_taxonomy_id, otr.term_order FROM {$wpdb->prefix}term_relationships otr"
            . " INNER JOIN {$wpdb->prefix}posts op ON op.ID=otr.object_id "
            . " INNER JOIN wp_posts np ON op.post_name=np.post_name AND op.guid=np.guid"
            . " INNER JOIN {$wpdb->prefix}term_taxonomy ott ON ott.term_taxonomy_id=otr.term_taxonomy_id "
            . " INNER JOIN ("
            .     " SELECT MIN(term_id) AS term_id, name, slug, term_group FROM {$wpdb->prefix}terms"
            .     " GROUP BY slug ORDER BY term_id"
            . " ) ot ON ot.term_id=ott.term_id"
            . " INNER JOIN ("
            .     "SELECT MIN(term_id) AS term_id, name, slug, term_group FROM wp_terms"
            .     " GROUP BY slug ORDER BY slug"
            . " ) nt ON ot.slug=nt.slug"
            . " INNER JOIN wp_term_taxonomy ntt ON ntt.term_id=nt.term_id AND ott.taxonomy=ntt.taxonomy "
            . " LEFT OUTER JOIN wp_term_relationships ttr ON ttr.object_id=np.ID AND ttr.term_taxonomy_id=ntt.term_taxonomy_id"
            . " WHERE ttr.object_id IS NULL";
        WP_CLI::success('Term relations ok ' . $wpdb->query( $query ));
        
        
        // conserta guid --- TEM QUE FICAR POR ULTIMO!
        $source_site_url = get_option('siteurl');
        switch_to_blog(1);
        $target_site_url = get_option('siteurl');
        switch_to_blog($blog_id);
        $query = "UPDATE wp_posts SET guid=CONCAT('{$target_site_url}/?p=', ID)"
               . " WHERE guid LIKE '{$source_site_url}%'";
        WP_CLI::success('Guids ok ' . $wpdb->query( $query ));
    }
}

WP_CLI::add_command('custom', 'Custom_Command');
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment