1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
<?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');